JeuWeb - Crée ton jeu par navigateur
[REGLE] Sortir la requête de la 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 : [REGLE] Sortir la requête de la boucle ! (/showthread.php?tid=2185)



[REGLE] Sortir la requête de la boucle ! - Ogham - 24-12-2007

Bonsoir,

voilà je n'en ai pas vraiment besoin dans l'immédiat mais ça me turlupine car je n'arrive pas à comprendre la méthode et je n'aime pas ça.

donc je cherche depuis plusieurs jours maintenant comment éviter de faire une requête INSERT dans une boucle, parce que "c'est mal", mais en dehors.

Donc ce que j'ai compris de la méthode c'est que la boucle doit générer une chaine qui sera donnée en argument à la requête ... mais ça s'arrête là.


donc j'ai une requête a insert multiples[/php]
Code PHP :
<?php 
mysql_query
("insert into table VALUES
('', 'y', 'y','y'),
('', 'z', 'z','z')"
);

je suppose qu'il faut générer les chainesSad'', 'y', 'y','y'), etc à l'aide de la boucle.

Mais comment récupérer l'ensemble des chaines de caractère pour les passer en argument.

J'y n'y arrive pas :pleure2:


RE: Sortir la requête de la boucle ! - Harparine - 24-12-2007

Cool que tu aies trouvé le coup de l'insert multiples. Pour ton truc, c'est encore une histoire d'array. En réalité, c'est ce qu'il y a de mieux pour manipuler des données tabulaires dans un script. Donc le principe est le suivant : au lieu d'insérer direct dans ta boucle, tu crées un tableau contenant les données à insérer dans ta boucle et tu l'utilises à la sortie dans une seule insertion.
Ex, en reprenant ton truc :
Code PHP :
<?php 
//Déclaration du tableau de données
$aTableauDonnees = array();
//On boucle pour le remplir
// (ici, $i correspondra aux valeurs successives de "y" et "z" en code ASCII)
for($i = 121; $i < 123; $i++) {
$sLettre = chr($i);
$sLigne = "'', '$sLettre', '$sLettre','$sLettre'";
$aTableauDonnees[] = $sLigne;
}
//A la sortie de la boucle, on a un tableau qui contient :
// 0 => '', 'y', 'y','y'
// 1 => '', 'z', 'z','z'

//On compte le nombre d'entrées dans le tableau (pour la syntaxe de la requête)
$iNbEntrees = count($aTableauDonnees);
$i = 1;
// Il reste à construire la requête multiple
$sRequete = "INSERT INTO table VALUES ";
foreach(
$aTableauDonnees as $sEntree) { //On parcoure chaque ligne du tableau
$sRequete .= "($sEntree)"; //On l'ajoute à la requete
if ($i != $iNbEntrees) { //Si ce n'est pas la dernière entrée"
$sRequete .= ", ";
}
$i++;
}
//Notre requête ressemble maintenant à
// INSERT INTO table VALUES ('', 'y', 'y','y'), ('', 'z', 'z','z')
mysql_query($sRequete);

Voilà. Poses des questions si tu ne comprends pas. Evidemment, là, c'est un peu lourd puisque je passe par un tableau mais c'est pour l'exemple car ici, il y avait la possibilité de créer directement la requête dans la première boucle for. L'intérêt est évidemment de n'avoir plus qu'une seule requête au lieu de $nombreDeLignes Wink
@+


RE: Sortir la requête de la boucle ! - jo_link_noir - 24-12-2007

bonsoir,

le foreach demande à être optimiser. Une fonction fait très bien l'affaire Smile
implode — Rassemble les éléments d'un tableau en une chaîne
implode(",",$aTableauDonnees) revient à faire le foreach

Sinon y aussi moyen de passer directement par une chaîne de caractère pour un résultat identique. Personnel je préfère les tableaux ^^


RE: Sortir la requête de la boucle ! - Ogham - 24-12-2007

Merci pour vos réponses

Je pense avoir saisie le principe.Je testerais demain là il est tard.

j'ai en effet fais quelques test avec implode, que je ne connaissais pas, aujourd'hui en me disant que ça devait bien être utile pour ce genre de chose.

@Harparine
suite à ton coup de pouce sur mon autre topic j'ai essayé toute la journée de me servir d'un tableau comme tu le fais là et de mettre la boucle foreach dans la requête mais je n'ai pas réussi à trouver la bonne syntaxe :$
Donc là ça m'aide beaucoup Smile

Une question:
Code PHP :
<?php 
// (ici, $i correspondra aux valeurs successives de "y" et "z" en code ASCII)
for($i = 121; $i < 123; $i++)

Qu'est ce que le code ASCII ?
Et que veulent dire les chiffre 121 et 123 ?


merci encore.


RE: Sortir la requête de la boucle ! - Harparine - 24-12-2007

@ j-12 : pas mal le coup du implode, c'est le genre d'astuces très utiles que je ne connais malheureusement pas Wink

@ Ogham : le code ASCII est une norme de codage de caractères en informatique. Par exemple, 121 correspond à "y" et 122 à "z". Ici, je voulais utiliser une boucle for tout en reprenant ton exemple "'', 'y', 'y', 'y'". J'ai donc commencé ma boucle à 121 et je l'ai terminée à 122 (strictement inférieur à 123). La fonction chr() affiche le caractère alphabétique à partir de ce code. Bref, ici c'est complètement inutile mais c'était l'occasion de te montrer comment sortir l'insert de la boucle.

@+


RE: Sortir la requête de la boucle ! - Ogham - 24-12-2007

Bonjour,

Merci Harparine.
J'ai trouvé un tableau des correspondances ASCII en fouinant un peu.
Je n'ai pas testé le reste on verra ça d'ici deux jours.

Bonnes fêtes.