JeuWeb - Crée ton jeu par navigateur
Exécuter une requête une seule fois dans une boucle - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Exécuter une requête une seule fois dans une boucle (/showthread.php?tid=6511)

Pages : 1 2 3


Exécuter une requête une seule fois dans une boucle - Ereinion - 17-11-2012

Salut,

voilà je suis confronté depuis ce matin à un problème assez pompant. En fait, j'ai un système d'attaque. Imaginons que le joueur a à sa disposition X archers et Y chevaliers. Dans un formulaire, on lui affiche en boucle les types d'unités qu'il dispose dans des champs input afin qu'il puisse choisir le nombre d'unités qu'il veut envoyer.

Chaque input est nommé grâce à l'id de l'unité. Genre si l'id de l'unité archer dans la base de donnée est 1 alors le name du champs est 1. Afin de traiter ce formulaire, j'effectue mes vérifications dans une boucle dans un second fichier. Si tout est bon, je calcule la force d'attaque totale en fonction de la force de l'unité multipliée par le nombre que le joueur a choisit. Une fois ce PA calculé, j'additionne toutes les forces entre elles et j'effectue une requête afin d'enregistrer cette force dans la base de donnée.

Le problème, c'est que comme cette requête est située dans une boucle, elle est exécutée plusieurs fois (le nombre varie en fonction du nombre de types d'unités que le joueur a construit).

Ce que je voudrais, c'est qu'elle ne soit exécutée qu'une seule fois et à la fin de la boucle mais je n'arrive pas à le faire.

Voilà, merci à ceux qui s'intéresseront à mon sujet.
Bonne soirée.


RE: Exécuter une requête une seule fois dans une boucle - Sephi-Chan - 17-11-2012

Peux-tu présenter un peu de ton code afin qu'on puisse t'aider plus efficacement ?
Et surtout, comment cela est-il stocké ? C'est indispensable de le savoir pour savoir comment requêter. Smile


RE: Exécuter une requête une seule fois dans une boucle - Ereinion - 17-11-2012




RE: Exécuter une requête une seule fois dans une boucle - Sephi-Chan - 17-11-2012

Pour commencer, tu devrais éviter d'utiliser mysql_fetch_row au profit de mysql_fetch_assoc, qui te permet d'utiliser le nom de la colonne plutôt que son index numérique. C'est plus facile à lire et à maintenir.

Ensuite, je ne vois aucune requête dans une boucle ici. :o


RE: Exécuter une requête une seule fois dans une boucle - Ereinion - 17-11-2012

Le mysql_fetch_row était utilisé afin de tester une solution à un ancien problème résolu. Mais effectivement, là actuellement, c'est inutile et pas simple à lire.

Concernant la requête, je l'ai remplacé par un commentaire dans le code plus haut. Je viens d'éditer mon précédent message, tu devrais voir le code complet maintenant (dernier else). Le but c'est d'exécuter une seule fois la requête $attaque tout à la fin de la boucle (une fois que le PA a finit d'être calculé et que toutes les vérifications ont été faites).


RE: Exécuter une requête une seule fois dans une boucle - Xenos - 17-11-2012

Tu peux, avant la boucle, créer une variable servant de buffer:
Code PHP :
<?php 
$buffer
= Array();

Au lieu de lancer la requête dans la boucle, tu ajoute au buffer les valeurs de l'insertion à faire:
Code PHP :
<?php 
$buffer
[] = "('', '" . $villagedefenseur . "', '" . $idjoueur . "', '" . $villageattaquant . "', '" . $pa_final . "')";

En sortie de boucle, buffer est alors un tableau commençant à 0 où chaque élément est le contenu des valeurs de la requète d'insertion.
En sortie de boucle, tu peux donc tout insérer d'un coup:

Code PHP :
<?php 
if (sizeof($buffer)>0)
{
mysql_query("INSERT INTO `file_attaque` (...) VALUES " . implode(", ", $buffer));
}

Où "(...)" est à remplacer par les noms de tes colonnes, dans le même ordre que le contenu des éléments de buffer (aka dans l'ordre '', $villagedefenseur, $idjoueur, $villageattaquant, $pa_final), avec une paire de `` pour délimiter le nom de colonne (le caractère `se fait en maintenant Alt Gt + 7 sur le clavier, et il sert à protéger les noms de colonne MySQL).
pour implode, cf le manuel PHP: http://php.net/manual/fr/function.implode.php

De manière générale, essaie toujours d'utiliser le principe suivant:
* Charger toutes les données de la BDD en début de page PHP
* Si possible, fermer la connexion pour le corps de la page PHP
* Réouvrir la connexion pour tout enregistrer en fin de page PHP

Ainsi, la connexion MySQL est fermée pendant le traitement PHP des données (les boucles PHP sont peut-être longues sur ton projet),n et tu soulageras ainsi le serveur MySQL (d'autant que le nombre de connexions simultanées à un serveur MySQL est normalement limité).


RE: Exécuter une requête une seule fois dans une boucle - Argorate - 18-11-2012

(17-11-2012, 10:24 PM)Sephi-Chan a écrit : Ensuite, je ne vois aucune requête dans une boucle ici. :o
Ca c'est parce que l'indentation du code est une horreur, chercher bien y a un while :p

Sinon le code est trop catastrophique pour que je puisse aider, sry ^^


RE: Exécuter une requête une seule fois dans une boucle - Sephi-Chan - 18-11-2012

(18-11-2012, 02:45 AM)Argorate a écrit :
(17-11-2012, 10:24 PM)Sephi-Chan a écrit : Ensuite, je ne vois aucune requête dans une boucle ici. :o
Ca c'est parce que l'indentation du code est une horreur, chercher bien y a un while :p

Sinon le code est trop catastrophique pour que je puisse aider, sry ^^

En critiquant ainsi (gratuitement et sans volonté d'aider), tu prends le risque qu'il n'ose plus montrer son code de peur d'être vivement critiqué. Si son code n'est plus critiqué, ses pratiques de développement n'évolueront plus (ou alors très lentement). Ça ne te rappelle rien ? Confusediffle:

Je sais lire du code et il n'y avait pas de requête dans une boucle avant édition. Et la remarque de Xenos sur le code après édition est pertinente. Cela dit, la connexion ne devrait pas être fermée puis réouverte au sein d'un meme script car c'est une opération longue.


RE: Exécuter une requête une seule fois dans une boucle - Xenos - 18-11-2012

C'est une opération longue, oui, mais dans certains cas, le scirpt lui-même peut être très long (un script simulation la vie du jeu par exemple et qui serait lancé par le serveur, et non par les clients, toutes les heures par exemple). Dans un tel cas, le temps de connexion est négligeable.
D'ailleurs... "opération longue"... par rapport à quelle référence?

Après, la remarque d'Argorate est juste: l'indentation est malsaine.

Ereinion, fixe-toi des conventions:
- Soit tu retournes à la ligne avant l'accolade de chaque boucle (aka après un if, un else if, un else, un while, un for, un do, un function, un class, etc)
- Soit tu laisse l'accolade sur la même ligne que le contrôle de la boucle (aka else, if, for,...)
Mais ne fait pas "un peu des deux" :o

De même, indente un peu le cod,e il n'en sera que plus lisible (l'indentation consiste à ajouter une tabulation pour chaque boucle ouverte au début de chaque ligne de la boucle:

Code PHP :
<?php 
function test()
{
if (
true)
{
// commande
while (false)
{
// commande
}
}
else
{
// commande
}
}

Même s'il est tout à fait possible de faire ces indentations à la main dans le bloc-notes (oui, j'aimais bien faire ca avant), les IDE actuels (y compris les plus "bateau" qui ne sont pas de vrais IDE, comme Notepad++ qui n'est pas un IDE) le font très bien tous seuls.
La tabulation peut être remplacée par N espaces (généralement 4 je crois, mais c'est au choix). Pour ma part, je préfère une tabulation, car c'est un et un seul caractère, spécialement dédié à l'indentation (je n'en utilise pas ailleurs), il est donc facile de passer d'une tabulation à N espaces, mais il est difficiles de revenir de N espaces à 1 tabulation (car N espaces peuvent se promener dans le code).


RE: Exécuter une requête une seule fois dans une boucle - php_addict - 18-11-2012

salut

ton formulaire n'est pas bon, tu peut faire ceci:

echo '<input type="text" name="unites[' . $id . ']" value="">';
ou $id est tes ids d'unités

comme ca tu recupere en POST un array, un print_r($_POST) te le montrera

apres tu traite ton array unites[] comme tu veut