Salut,
1) Les <table> sont réservés aux données tabulaires
N'utilise pas une table, c'est totalement inadapté ici. Les données ne sont pas tabulaires. En fait, ce que tu cherches ici, c'est afficher chaque "brique" décrivant une plante l'une après l'autre, en revenant à la ligne si besoin. Le display "inline-block" fait exactement cela
Donc, utilise plutôt une div (je n'ai rien de plus sémantique à proposer), à laquelle tu appliques un CSS "display:inline-block".
2) Attention à l'injection
Bonjour, injection SQL! Je ne sais pas quelle est la "fiabilité" de ta variable de session "login", mais ici, si jamais cette variable vaut "0\" OR \"1\"=\"1", alors la requête:
devient
Et j'ai accès à toutes les plantes de tous les joueurs. C'est pas le pire hack, mais on peut facilement imaginer qu'au lieu de 1=1, j'insère un "DROP DATABASE", et là, tu pleures
3) fetch_array récupère déjà les données d'une ligne issue d'une requête
Je ne comprends pas pourquoi il y a ce code:
Puisque celui-ci est déjà présent:
Alors $row contient les données d'une ligne de la BDD. Au lieu de "$data[*], tu devrais utiliser $row[*], qui contient les données de la ligne courante.
4) mysql_* sont dépréciées
Lis la documentation de php quand tu utilises une fonction. En effet, mysql_fetch_array est dépréciée depuis un moment. Préfères-lui mysqli (en Orienté Objet ou en Procédural), ou PDO (mais celui-ci est plus abstrait je trouve).
5) Tout code tapé doit être utilisé
Tu as un "$login = $_SESSION..." en début de fichier: sers t'en dans la suite, au lieu d'utiliser $_SESSION (dans les requêtes SQL par exemple)
6) HTML5 est la nouvelle norme
Passe à HTML5. Le tag font est déprécié depuis longtemps. Utilises les classes dans le code html, et applique ta mise en forme via un CSS.
7) echo() peut être multi-ligne
Une instruction echo() peut s'étendre sur plusieurs lignes si besoin. Au lieu de répéter:
Tu peux utiliser
Ce sera un poil plus rapide, mais ce sera surtout plus lisible je pense, d'autant que tu peux alors indenter ton code HTML:
8) Fixe-toi des règles de codage HTML
Ici, on voit fleurir plusieurs façons de coder:
TD, tr, ROWSPAN=5, width='200px' (qui devrait d'ailleurs aller dans l'attribut 'style', qui devrait lui-même être ensuite remplacé par un attribut 'class' et un code CSS)...
Fixes-toi des règles! Par exemple:
Un changement de convention doit avoir une raison. Tu peux choisir de mettre certains attributs en majuscules, par exemple, "data-MES-DONNES", mais évites de faire du mixe.
Par exemple, dans mes code PHP, j'utilise la camelCase pour les variables, et la snake_case préfixée par "p_" pour les paramètres des fonctions. Ainsi, je sais que "$p_ma_variable" est un paramètre de la fonction (donc, non vérifié et auquel on ne peut pas faire confiance, il peut être source d'injection par exemple) alors que $maVariable est une variable créée dans la fonction, et donc, elle est réputée sûre (car vérifiée à sa création).
9) Préfère "for" à "while"
Surtout quand c'est parfaitement justifié comme ici
Les boucles for utilisent la syntaxe
Avant le lancement de la boucle, <expression initiale> est exécutée. Le <test> est ensuite vérifié. S'il est valide, le contenu de la boucle est exécuté. Enfin, <instruction répétée> est exécuté, puis on recommence en vérifiant <test>. La boucle se termine si "break;" est rencontré, ou si <test> n'est pas passé (<test> est faux).
On peut mettre plusieurs <instruction initiale> et/ou plusieurs <instruction répétée>, en les séparant d'une virgule.
Enfin, les variables créées dans <instruction initiale> seront détruite lorsque l'on quittera la boucle. Par exemple
for ($i=0;$i<10;++$i)
{
echo ($i . " ");
}
echo ("$i n'existe plus à partir d'ici!");
Donc, dans ton cas:
Cela t'évitera de trainer "$compteur" et "$requete" alors que tu n'en n'a plus besoin une fois la boucle terminée.
1) Les <table> sont réservés aux données tabulaires
N'utilise pas une table, c'est totalement inadapté ici. Les données ne sont pas tabulaires. En fait, ce que tu cherches ici, c'est afficher chaque "brique" décrivant une plante l'une après l'autre, en revenant à la ligne si besoin. Le display "inline-block" fait exactement cela
Donc, utilise plutôt une div (je n'ai rien de plus sémantique à proposer), à laquelle tu appliques un CSS "display:inline-block".
2) Attention à l'injection
Bonjour, injection SQL! Je ne sais pas quelle est la "fiabilité" de ta variable de session "login", mais ici, si jamais cette variable vaut "0\" OR \"1\"=\"1", alors la requête:
Code :
SELECT * FROM niveau1 WHERE login="$_SESSION['login']"
Code :
SELECT * FROM niveau1 WHERE login="0" OR "1"="1"
3) fetch_array récupère déjà les données d'une ligne issue d'une requête
Je ne comprends pas pourquoi il y a ce code:
Code :
$sql = 'SELECT * FROM niveau1 WHERE login="'.$_SESSION['login'].'"';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$data = mysql_fetch_array($req);
Puisque celui-ci est déjà présent:
Code :
($row=mysql_fetch_assoc($rs))
Alors $row contient les données d'une ligne de la BDD. Au lieu de "$data[*], tu devrais utiliser $row[*], qui contient les données de la ligne courante.
4) mysql_* sont dépréciées
Lis la documentation de php quand tu utilises une fonction. En effet, mysql_fetch_array est dépréciée depuis un moment. Préfères-lui mysqli (en Orienté Objet ou en Procédural), ou PDO (mais celui-ci est plus abstrait je trouve).
5) Tout code tapé doit être utilisé
Tu as un "$login = $_SESSION..." en début de fichier: sers t'en dans la suite, au lieu d'utiliser $_SESSION (dans les requêtes SQL par exemple)
6) HTML5 est la nouvelle norme
Passe à HTML5. Le tag font est déprécié depuis longtemps. Utilises les classes dans le code html, et applique ta mise en forme via un CSS.
7) echo() peut être multi-ligne
Une instruction echo() peut s'étendre sur plusieurs lignes si besoin. Au lieu de répéter:
Code :
echo "<td>";
echo "</td>";
Tu peux utiliser
Code :
echo "<td>
</td>";
Ce sera un poil plus rapide, mais ce sera surtout plus lisible je pense, d'autant que tu peux alors indenter ton code HTML:
Code :
echo ("
<table>
<tr>
<td>
Texte ".$row['taille']."
</td>
</tr>
</table>
");
8) Fixe-toi des règles de codage HTML
Ici, on voit fleurir plusieurs façons de coder:
TD, tr, ROWSPAN=5, width='200px' (qui devrait d'ailleurs aller dans l'attribut 'style', qui devrait lui-même être ensuite remplacé par un attribut 'class' et un code CSS)...
Fixes-toi des règles! Par exemple:
- Tous les noms de tag en minuscule (ou tous les noms de tags en MAJUSCULES, mais pas un mélange des deux).
- Tous les noms d'attributs en minuscules (donc, "rowspan", et pas "ROWSPAN")
- Toutes les valeurs d'attributs entre guillemets simples (donc, rowspan='5' et non rowspan=5)
Un changement de convention doit avoir une raison. Tu peux choisir de mettre certains attributs en majuscules, par exemple, "data-MES-DONNES", mais évites de faire du mixe.
Par exemple, dans mes code PHP, j'utilise la camelCase pour les variables, et la snake_case préfixée par "p_" pour les paramètres des fonctions. Ainsi, je sais que "$p_ma_variable" est un paramètre de la fonction (donc, non vérifié et auquel on ne peut pas faire confiance, il peut être source d'injection par exemple) alors que $maVariable est une variable créée dans la fonction, et donc, elle est réputée sûre (car vérifiée à sa création).
9) Préfère "for" à "while"
Surtout quand c'est parfaitement justifié comme ici
Les boucles for utilisent la syntaxe
Code :
for (<instruction initiale>;<test>;<instruction répétée>)
Avant le lancement de la boucle, <expression initiale> est exécutée. Le <test> est ensuite vérifié. S'il est valide, le contenu de la boucle est exécuté. Enfin, <instruction répétée> est exécuté, puis on recommence en vérifiant <test>. La boucle se termine si "break;" est rencontré, ou si <test> n'est pas passé (<test> est faux).
On peut mettre plusieurs <instruction initiale> et/ou plusieurs <instruction répétée>, en les séparant d'une virgule.
Enfin, les variables créées dans <instruction initiale> seront détruite lorsque l'on quittera la boucle. Par exemple
for ($i=0;$i<10;++$i)
{
echo ($i . " ");
}
echo ("$i n'existe plus à partir d'ici!");
Donc, dans ton cas:
Code PHP :
<?php
for ($compteur = 0, $requete = mysql_query('SELECT * FROM niveau1 WHERE login="'.$_SESSION['login'].'"'); $row = mysql_fetch_array($requete); ++$compteur)
{
// ... code précédent
// $cpt ++ // déjà inclus dans le "for"
}
// $compteur existe toujours!
// Il vaut d'ailleurs le nombre total de lignes retournées par la requête