La méthode du "$query.=" pose un soucis si la boucle est vide (non-exécutée).
Le SELECT * est parfaitement viable. Il est, après quelques tests et d'après mon expérience, plus rapide de faire un "SELECT *" que de faire un SELECT des N colonnes une à une (SELECT `col1`, `col2`,...`colN` est moins rapide que SELECT *) car le "*" permet à MySQL d'optimiser la récupération (il peut se dire "pas besoin de regarder les noms de colonne car je veux tout sélectionner).
En revanche, spécifier les noms de colonne dans un INSERT permet de s'assurer que, même si on ajoute ou modifie les colonnes de la table, il n'y aura pas de changement dans la requête qui sera toujours valable.
Le SELECT * permet de modifier la structure de la table, sans devoir refaire la requête d'ailleurs.
Le fetch_assoc est effectivement à recommander, mais fetch_array peut être tout à fait utilisable, à condition que le SELECT porte sur des colonnes nommées (un SELECT `col1`, col4` par exemple). Pourquoi? parce que dans ce cas là, le nom des colonnes est spécifié dans le SELECT donc, l'index 0 ou 1 du tableau retourné par le fetch_row est nommé, via ce sélect (si on a "SELECT `col1` FROM table, on sait que $result[0] réfère à la colonne `col1`).
La PDO, c'est +1. mysql_fetch_assoc, c'est un peu "old school". Regarde le manuel php de MySQLi par exemple http://php.net/manual/fr/book.mysqli.php ou de PDO http://fr2.php.net/manual/fr/class.pdostatement.php Perso, je préfère MySQLi.
SI ta première colonne de la table de la BDD est une colonne de type "AUTO_INCREMENT PRIMARY", utilise DEFAULT au lieu de ''. Cela indiquera à MySQL d'insérer la valeur par défaut dans cette colonne, cette valeur étant la valeur de l'AUTO_INCREMENT.
Pour le villageattaque villagedefense en formulaire, ca dépend des villages: si l'utilisateur peut choisir le village dans le formulaire, autant le laisser dans le formulaire, et non le déplacer en variable de session.
Effectivement, comme dit plus haut, ta structure "while & $nbr_boucle" est usuellement remplacée par un "for ($i=0;-condition-;$i++)".
Sort le SELECT de la boucle... Sélectionne le nombre de PA et l'id des unités nécessaires via une seule requète ("SELECT `Id`, `PA`FROM ... WHERE `Id` IN (1, 4, 76)") et stocke les résultats de la requète dans un tableau.
Si l'id est un nombre entier, en place de "id = '" . $var . "'", préfère "id=".((int)$var), ce qui utilisera le typage entier au lieu du typage string. Si ta colonne contient des entiers, cela évitera à MySQL de faire la conversion. Idem dans la requête d'insertion.
Enfin, pour ton soucis de calcul, dump tes variables au fil du code et tu trouveras immédiatement l'erreur de logique qui se cache (var_dump($var)).
Le SELECT * est parfaitement viable. Il est, après quelques tests et d'après mon expérience, plus rapide de faire un "SELECT *" que de faire un SELECT des N colonnes une à une (SELECT `col1`, `col2`,...`colN` est moins rapide que SELECT *) car le "*" permet à MySQL d'optimiser la récupération (il peut se dire "pas besoin de regarder les noms de colonne car je veux tout sélectionner).
En revanche, spécifier les noms de colonne dans un INSERT permet de s'assurer que, même si on ajoute ou modifie les colonnes de la table, il n'y aura pas de changement dans la requête qui sera toujours valable.
Le SELECT * permet de modifier la structure de la table, sans devoir refaire la requête d'ailleurs.
Le fetch_assoc est effectivement à recommander, mais fetch_array peut être tout à fait utilisable, à condition que le SELECT porte sur des colonnes nommées (un SELECT `col1`, col4` par exemple). Pourquoi? parce que dans ce cas là, le nom des colonnes est spécifié dans le SELECT donc, l'index 0 ou 1 du tableau retourné par le fetch_row est nommé, via ce sélect (si on a "SELECT `col1` FROM table, on sait que $result[0] réfère à la colonne `col1`).
La PDO, c'est +1. mysql_fetch_assoc, c'est un peu "old school". Regarde le manuel php de MySQLi par exemple http://php.net/manual/fr/book.mysqli.php ou de PDO http://fr2.php.net/manual/fr/class.pdostatement.php Perso, je préfère MySQLi.
SI ta première colonne de la table de la BDD est une colonne de type "AUTO_INCREMENT PRIMARY", utilise DEFAULT au lieu de ''. Cela indiquera à MySQL d'insérer la valeur par défaut dans cette colonne, cette valeur étant la valeur de l'AUTO_INCREMENT.
Pour le villageattaque villagedefense en formulaire, ca dépend des villages: si l'utilisateur peut choisir le village dans le formulaire, autant le laisser dans le formulaire, et non le déplacer en variable de session.
Effectivement, comme dit plus haut, ta structure "while & $nbr_boucle" est usuellement remplacée par un "for ($i=0;-condition-;$i++)".
Sort le SELECT de la boucle... Sélectionne le nombre de PA et l'id des unités nécessaires via une seule requète ("SELECT `Id`, `PA`FROM ... WHERE `Id` IN (1, 4, 76)") et stocke les résultats de la requète dans un tableau.
Si l'id est un nombre entier, en place de "id = '" . $var . "'", préfère "id=".((int)$var), ce qui utilisera le typage entier au lieu du typage string. Si ta colonne contient des entiers, cela évitera à MySQL de faire la conversion. Idem dans la requête d'insertion.
Enfin, pour ton soucis de calcul, dump tes variables au fil du code et tu trouveras immédiatement l'erreur de logique qui se cache (var_dump($var)).