Longue boucle

Tilix Messages postés 171 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 31 août 2009 - 19 févr. 2006 à 03:04
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 22 févr. 2006 à 19:46
Bonsoir à tous,





Voilà mon problème. J'ai des longues boucles WHILE à effectué (+ de
3000 entrées) et malheureusement, quand je charge la page qui possède
cette boucle, elle n'arrive jamais jusqu'au bout (pas mal d'action à
faire pour chaque tour tout de même > 1 dixaine de requete sql...). La page s'arrête de se
charger et ne fini pas la boucle.


Je voudrais savoir comment faire pour que celle-ci soit
entièrement réalisé, et avec encore plus d'entrées aussi. (celà
viendrait-il de l'hebergeur ?)





Merci à tous,





Tilix.

42 réponses

Tilix Messages postés 171 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 31 août 2009
20 févr. 2006 à 07:05
Une page qui se charge, se n'est pas pareil qu'une boucle contenant tous les membres....
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
20 févr. 2006 à 07:56
Antho => oh ça va lol, tu sais rès bien ce que je veux dire ;-)
Tilix => Vas donc sur la page des "auteurs de sources" par exemple.
Il y a des tonnes de pas sur ce site qui ramène très probablement plus d'infos que celle de ton site, que tu incrimines, là. (c'est une question de logique, ce site comptant environ 200 fois plus de membres que le tien).
Je ne comprends pas pourquoi tu n'essayes pas de montrer quelques unes de tes requêtes. Je suis persuadé que le problème vient de là. Perso, il y a peu, j'avais ujne requête qui allait construire une liste de 2700 emplacements en allant chercher les infos dans une dizaine de tables aussi. Je ramenais le tout en une seule requête, déjà (donc 2700 requêtes pour les 2700 lignes construites), mais cela prenait une 10aine de secondes. Je trouvais ça beaucoup trop long, alors j'ai simplement descendu des infos pour réduire les tables sur lesquelles aller requêter. Je suis descendu à 2 secondes. Si j'y ajoute un système de pagination, c'est reglé, avoir accès à n'importe laquelle de ces lignes prendra qques micro secondes.
Les lenteurs sql sont souvent dûes à de mauvaises requêtes, ou une mauvaise structure de bdd (pour des bdd de taille raisonnable hein).
0
cs_Arnauti Messages postés 392 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 26 septembre 2009
20 févr. 2006 à 10:49
Hors sujet : ca signifie quoi descendre les infos ?
A++
<hr size="2" width="100%">Si un des membres à poster une reponse qui convient, accepter là !
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
20 févr. 2006 à 11:35
Ajouter des champs dans la table prin cipale interrogée, provenant d'autres tables, et que l'on veut sortir.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
20 févr. 2006 à 13:04
Bon, désolé pour ces deux précédents posts... les anciennes versions de Mozilla ne gèrent pas du tout ce wysiwyg...

En MYSQL 5, tu peux faire une procédure, ce qui ne te fera qu'une requette et sera bien plus rapide que ton programme C du fait du transfert entre php et SQL qui sera moindre...
0
Tilix Messages postés 171 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 31 août 2009
20 févr. 2006 à 19:58
//Boucle de tous les membres du site

$select_membre "SELECT * FROM TableDesMembres WHERE Statut 'Valid' AND Habitants != '0' ORDER BY id";

$envoi_membre = mysql_query($select_membre);

while($recupere_membre = mysql_fetch_assoc($envoi_membre))

{




$TotalDesGains = 0;




//On fait une boucle de tous les types de bâtiments que possèdes le
membre, et on enleve les bâtiments qui ne font pas gagner d'argent (5
tours maxi)


//En fonction du bâtiment, le membre augmente le total de ses gains.


$select_batiment = "SELECT * FROM TableDesBatiments WHERE
Ville='".$recupere_membre['id']."' AND Type != 'Amenagement' AND Type
!= 'Religieux' AND Type != 'Services' AND Type != 'Education'";

$envoi_batiment = mysql_query($select_batiment);

while($recupere_batiment = mysql_fetch_assoc($envoi_batiment))

{



if ($recupere_batiment['Type'] == "Maison")


{



$select_maison = "SELECT * FROM TableMaison WHERE
id='".$recupere_batiment['Batiment']."'";



$envoi_maison = mysql_query($select_maison);



$recupere_maison = mysql_fetch_array($envoi_maison);





$TotalDesGains
= $TotalDesGains +
$recupere_maison['Loyer']*$recupere_maison['Habitants']*$recupere_batiment['Nombre'];


}



}


//Ce genre de " IF " est effectué 5 fois, pour chaque type de bâtiment.....



mysql_query("UPDATE BLABLA...");



}





Voilà a peu pres comment est ma boucle...
0
Tilix Messages postés 171 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 31 août 2009
20 févr. 2006 à 19:59
J'ai mis le commentaire pour le IF 1 poil trop bas (avant le 2e } il devrait être), désolé xD
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
20 févr. 2006 à 20:19
Salut,
$envoi_membre mysql_query('SELECT tout les champs séléctionnés FROM TableDesMembres WHERE Statut \'Valid\' AND Habitants != '0' ORDER BY id')

or die(mysql_error());



while(false!==($recupere_membre = mysql_fetch_assoc($envoi_membre)))

{



même chose pour la suite...



Bon, je ne connais pas ton jeu, mais tu peux optimiser de deux façons : faire une procédure SQL



http://www.nexen.net/docs/mysql/annotee/adding-functions.php


ou bien faire un JOIN

In a dream, I saw me, drop dead... U was there, U cried... It was just a dream, if I die, U won't cry, maybe, U'll be happy

Mon site (articles sur la programmation et programmes)
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
20 févr. 2006 à 20:35
C'est déjà bien crade, tu peux tenter ça (pas besoin de la requête du haut apparemment) :

$TotalDesGains = 0;

$select_batiment = "SELECT b.Ville,b.Nombre,b.Batiment,m.Loyer,m.Habitants,Nombre FROM TableDesBatiments b,TableMaison m WHERE b.Type='Maison' AND m.id=b.Batiment";
$envoi_batiment = mysql_query($select_batiment);

while($recupere_batiment = mysql_fetch_row($envoi_batiment))
{
$TotalDesGains+=$recupere_batiment[3]*$recupere_maison[4]*$recupere_batiment[5];
}


mysql_query("UPDATE BLABLA..."); //? il faudrait que tu nous détailles ta requête ici qu'on puisse voir...

<hr size ="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
20 févr. 2006 à 20:53
Salut,

aparement ça divise déja le nombre de requettes par 10... pas mal déja...

In a dream, I saw me, drop dead... U was there, U cried... It was just a dream, if I die, U won't cry, maybe, U'll be happy

Mon site (articles sur la programmation et programmes)
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
20 févr. 2006 à 22:15
bah là y'a une seule requête et un seul update, mais j'aimerais savoir ce qu'il met à jour avant de transformer ça, car je crains qu'il n'y ait une boucle pour faire les updates par contre...

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
0
Tilix Messages postés 171 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 31 août 2009
20 févr. 2006 à 22:44
SELECT b.Ville,b.Nombre,b.Batiment,m.Loyer,m.Habitants,Nombre

> Ils correspondent à quoi ces b, m ?



Le update, c'est juste un

" UPDATE TablesDesMembres SET Argent '".$totaldesgains."' WHERE id '".$recupere_membre['id'];
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
20 févr. 2006 à 22:54
" Ils correspondent à quoi ces b, m ?"

c'est une syntaxe pour ne pas taper tout le nom de la table, j'aurais pu mettre x ou z...

bon pour l'update faut que je vois si c'est possible, on va voir je verrai demain.

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
0
Tilix Messages postés 171 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 31 août 2009
20 févr. 2006 à 23:44
Je ne peux pas utilisé ta syntaxe, car comme dit plus haut, les tables dans la 2e boucle sont toutes différentes !
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
21 févr. 2006 à 08:20
et alors ?

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
21 févr. 2006 à 09:11
Ce sont aussi des alias, et ça sert ç différencier le noms des champs quand on a les mêmes noms dans plusieurs tables différentes. Dans le cas de clefs étrangères, essentiellement.
Et tu peux très bien l'utiliser, oui.
Il y a autre chose, la structure de ta base est visiblement mauvaise...
Les types de bâtiments devraient faire l'objet d'une autre table, avec un id, et tu ne devrais utiliser que cet id dans ta table TableDesBatiments, cela allègerait le code (WHERE Type NOT IN (id1, id2, id3...). Il est toujours plus léger de jouer avec des entiers qu'avec des chaînes.
De plus, je ne pense pas qu'il soit utile, au vu de ton code, de vérifier le type de bâtiment dans chaque requête. Visiblement, après, tu ne fais qu'une mise à jour d'une variable...

SELECT b.Ville,b.Nombre,b.Batiment,m.Loyer,m.Habitants,Nombre FROM TableDesBatiments b,TableMaison m WHERE m.id=b.Batiment


while (blabla)
if batiment === maison alors...
if batiment === hutte alors....
if batiment === trucmuche alors...
0
Tilix Messages postés 171 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 31 août 2009
21 févr. 2006 à 13:13
Il faut que j'me trouve une aide a propos des synthaxes devant le nom
des champs, que j'comprenne plus en détails comment ça fonctionne...

merci
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
21 févr. 2006 à 13:43
C'est un alias :

SELECT usr.user_id FROM users AS usr

le AS n'est pas indispensable.

Cela dit : dans cette requête, je vais utiliser 'usr' pour préfixer les noms des champs appartenant à la table 'user'.
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
21 févr. 2006 à 20:59
dans sa boucle y'a que un seul if bref je l'ai inclus dans la requête pour faire sauter la condition personnellement. Sinon nous on aimerait bien que tu nous files ta requête UPDATE que tu fais... concernant l'aide des alias tu peux rechercher sur google le manuel est je pense assez explicite.

a +

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
0
Tilix Messages postés 171 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 31 août 2009
22 févr. 2006 à 00:30
Je l'ai donné la requete update



" UPDATE TablesDesMembres SET Argent '".$totaldesgains."' WHERE id '".$recupere_membre['id'];
0
Rejoignez-nous