Sortir requête SQL d'une boucle - PHP - Programmation
Marsh Posté le 10-09-2008 à 10:17:10
Pour sortir d'une boucle, il suffit de mettre l'instruction break; comme vous le savez déjà certainement.
Pourquoi vouloir sortir de la boucle ?
* Parce que le traitement prendrait trop de temps ? Dans ce cas, pourquoi l'avoir commencé ?
Si l'on peut prévoir que le traiement va être long, on pourrait en avertir l'utilisateur à l'avance et lui demander une confirmation ou une annulation.
S'il confirme, pour le faire patienter, on pourrait mettre à jour un compteur Ajax.
* Parce que l'utilisateur voit qu'il est l'heure de partir, et préfère l'annuler pour le relancer le lendemain.
Le problème, c'est qu'il n'est pas facile de prendre en compte la décision d'interruption de l'utilisateur, car cette boucle tourne du côté du serveur, et les actions de l'utilisateur se font du côté client.
Marsh Posté le 10-09-2008 à 11:08:29
pouzy a écrit : Bonjour,
|
Difficile de répondre de manière précise sans avoir la vraie requête...elle dépend de ton $i? Si ce n'est pas le cas, il suffit de déplacer le code exécutant ton select au-dessus de la boucle, pour commencer.
Et si elle en dépend, n'y a-t'il pas un moyen simple d'obtenir tous tes résultats d'un seul coup et de boucler sur les résultats au lieu de faire une requête par valeur de $i?
De même, tu dois pouvoir ensuite faire tous tes insert d'un coup, et tous tes update d'un coup...
Marsh Posté le 10-09-2008 à 11:09:18
olivthill a écrit : Pour sortir d'une boucle, il suffit de mettre l'instruction break; comme vous le savez déjà certainement. |
Je pense que tu réponds à-coté de la question là - il souhaite sortir les requêtes de la boucle pour éviter de faire N requêtes et gagner en vitesse d'exécution, a priori.
Marsh Posté le 10-09-2008 à 11:12:53
olivthill > Réponse hors sujet, il demande comment mettre sa requête en dehors du for, pas comment quitter une boucle au milieu du traitement.
pouzy > Sans les vrai requêtes on ne peut pas t'aider. Comment veux tu qu'on te dise comment les adapter et surtout si il est possible de les adapter si tu nous donne des "SELECT champ FROM table WHERE conditions" qui n'a aucune saveur. C'est un peu comme demander à un garagiste comment réparer une voiture sans lui dire ce qui ne va pas.
Marsh Posté le 10-09-2008 à 11:27:09
juste une question je voit pas l'interet de ton for avec tes requete,
tes requetes sont fixes(pas dynamique par rapport a ton for.)
pour moi a moins que je voit pas un truc,
tu fait x fois (où x est $count) la même opération.
Donc tu peut tout simplement virer ton For, il ne sert a rien a moins qu'il manque du code
Marsh Posté le 10-09-2008 à 11:28:07
ah ok , je pense que c le "conditions",
j'avais pas vu autant pour moi
Marsh Posté le 10-09-2008 à 14:51:35
Bonjour et merci de vous pencher sur ma question !
En effet, j'ai été un peu léger sur les requêtes. Elles dépendent bel et bien du $i. Ce n'est pas face au visiteur que cela me gêne, mais face au serveur : cela peut faire beaucoup de requêtes d'un coup non ?
Voici les vraies requêtes :
La premiere :
Code :
|
La deuxième :
Code :
|
Vous voyez donc que les requêtes dépendent du $i. Est-ce possible de ne faire qu'une grosse requête, plutôt que tout plein ?
Merci !
Marsh Posté le 10-09-2008 à 15:05:54
pouzy a écrit :
|
Celle-ci est très simple à sortir de la boucle, avec un simple
Code :
|
pouzy a écrit :
|
tu peux insérer plusieurs lignes d'un coup, ça ne devrait pas poser de pb de la sortir de la boucle...
pouzy a écrit :
|
celle-ci c'est plus compliqué, ton $i intervenant à la fois dans le set et le where...
Marsh Posté le 10-09-2008 à 15:14:10
Ta table, elle contient combien de lignes actuellement et ça représente quel poids dans mysql? Si la table est assez petite, tu peux toujours récupérer toute la table pour éviter de demander les données une par une.
Si $count est assez faible tu peux aussi ne demander que les données dont t'auras besoin ce qui évitera de récupérer plus d'informations que nécessaire.
Pour les requêtes d'insertions tu risques de ne pas gagner grand chose : j'imagine qu'il n'y aura pas beaucoup de créations par traitement. Toujours est il que tu peux te faire un tableau dans lequel tu te stockeras les nouveaux couples de joueur/objet avec la quantité qu'ils obtiennent (quantité à augmenter dans le tableau si cette quantité est censé augmenter plusieurs fois dans le traitement) Ensuite tu pourras tout créer en une seule requête (ou en plusieurs par bloc de n données si t'as plusieurs milliers de lignes à créer)
Pour les requêtes de mises à jours, c'est plus complexe :
- soit tu laisses tel quel
- soit tu fais un tableau dans lequel tu stockes les augmentations cumulés pour chaque couple de personne/objet qui voit sa quantité augmenter
Dans le second cas :
- soit tu fais ensuite une requête de mise à jour par couple/joueur (le plus simple mais ce qui fait gagner le moins de requête)
- soit tu dois retrier le tableau pour faire ensuite une mise à jour par augmentation de la quantité
Au final, si tu fais tout ça au pire tu diminueras le nombre de requêtes de moitié (cas où t'as au plus une création et aucun recoupement d'augmentation de quantité ni de couple joueur/objet) et au mieux t'en auras que trois à faire (la récupération des données, pas de création et les mises à jours des quantités si toutes les quantités augmentent de la même valeur) si t'as au moins une création de donnée.
PS: Pour la requête de sélection, il faut vérifier que ça ne ralentisse pas trop en récupérant tout ce dont on a besoin dès le début du traitement.
EDIT : J'ai été dans l'ensemble en plus clair en plus.
Marsh Posté le 10-09-2008 à 22:02:25
Alors, si j'ai bien tout compris :
Code :
|
INSERT ON DUPLICATE est ton ami
Attention a tes index apparemment tu doit placer un champs unique sur id,obj (les deux groupé en un seul index).
Et si ma solution ne marche pas (j'ai pas assimilé le pourquoi du comment, juste le bout d'algo fournis), j'espère que ça va te rapprocher de la solution ^^
Marsh Posté le 09-09-2008 à 23:57:58
Bonjour,
J'ai une requête SQL dans une boucle for, et j'aimerai l'en sortir (pour la santé de mon serveur je suppose que c'est ce qu'il faut faire).
Voici la trame du code :
Quelqu'un aurait une idée pour rendre ça plus propre ? Parce que la, quand le for tourne longtemps ça peut faire mal, y a deux requêtes à chaque fois... Je suppose qu'on va m'insulter en disant que c'est dégueulasse, tout ça, donc... N'hésitez pas à me guider
Merci !
---------------
Hello hello super jello