2 requetes à la place de 26 ? aide?

Fermé
small - 16 mai 2005 à 23:20
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 17 mai 2005 à 12:22
Bonjour à tous,

J’essaie de réaliser un petit jeu en php, tout fonctionne (c’est très basique..).
Mais j’ai un soucis pour alléger la requête qui affiche la carte de 5*5 cases.
En gros il faut une requête pour sélectionner et afficher tous les 25 fonds de cellule. Ca c’est nickel.
Mais je n’arrive pas à faire pareil pour afficher les personnages. Enfin plutôt j’y arrive mais je me retrouve avec un seul perso par case même si il y en a plusieurs. J’ai donc mis une requête qui me permet de contourner le problème, mais comme elle est dans le while de la première elle est lancée 25 fois…

HELP me, pitié, j'ai plus de cheveux dans les mains que sur la tete :)


<?
// requete et mise en forme pour les fonds de cellule
$requetefondcarte = doquery("SELECT latitude,longitude,img FROM {{table}} WHERE latitude>='$latitude'-2 AND latitude<='$latitude'+2 AND longitude>='$longitude'-2 AND longitude<='$longitude'+2 ", "carte");

for ($i = $latitude+2; $i >= $latitude-2; $i--) 
	{ for ($j = $longitude-2; $j <= $longitude+2; $j++ ) 
	  {  $carte[$i][$j] = 0 ; } 
	} 
while ($data = mysql_fetch_assoc($requetefondcarte)) 
	{ 
	$carte[$data['latitude']][$data['longitude']] = $data['img']; 
	} 

//Affichage de la carte (en 1 requete)
   $page .='<table width="320" border="0" cellspacing="0" cellpadding="0" align="right">'; 
   for ($i = $latitude+2; $i >= $latitude-2; $i-- ) { 
      $page .='<tr>'; 
   for ($j = $longitude-2; $j <= $longitude+2; $j++ ) { 
      $page .="<td width=\"64\" height=\"64\" background=\"images/carte64/"; 
     if ($carte[$i][$j] != "") { 
        $page .="".$carte[$i][$j]."\">"; 
     }
	 else{ 
			$rn = rand (1,5); $fond = "".$rn.".gif";
            $page .="$fond \">"; 
		} 
				
// affichage des persos (+25 requetes !!!)
  $cartequery6 = doquery("SELECT charname,charclass FROM {{table}} WHERE latitude='$i' AND longitude='$j'  LIMIT 25", "users");
	$nombre6 = mysql_num_rows($cartequery6); 

 $page .= "<span class=\"carte\">  nbs. $nombre6</span><br>";	
 while ($persorow = mysql_fetch_array($cartequery6))
		{	
		 if ($persorow["charclass"] == '1') {$classe= 'magot'; $page .= "<img src=\"images/magot.gif\" alt=\"".$persorow["charname"]." | $classe\">";}
		  if ($persorow["charclass"] == '2') {$classe= 'voleur'; $page .= "<img src=\"images/voleur.gif\" alt=\"".$persorow["charname"]." | $classe\">";}
		   if ($persorow["charclass"] == '3') {$classe= 'troll'; $page .= "<img src=\"images/troll.gif\" alt=\"".$persorow["charname"]." | $classe\">";}
		    if ($persorow["charclass"] == '4') {$classe= 'paladin'; $page .= "<img src=\"images/paladin.gif\" alt=\"".$persorow["charname"]." | $classe\">";}
		}}} 
   $page .="</table>"; 
?>

1 réponse

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
16 mai 2005 à 23:27
Euh... Ce qui te gêne, c'est le seul fait que la requête est exécutée 25 fois?

En ce cas tu peux te créer une variable témoin pour savoir si la requête est déjà executée...

Au tout début du script:
<?
$deja_execute=False;


puis lors de la requête:
if (!$deja_execute)
{
            $cartequery6 = doquery("SELECT charname,charclass FROM {{table}} WHERE latitude='$i' AND longitude='$j'  LIMIT 25", "users");
	   $nombre6 = mysql_num_rows($cartequery6); 
           $deja_execute=True;
}


Et voilà :-)
0
Oui c’est ce qui me dérange, d’etre obligé de la lancer pour chaque case, alors que j’aimerais trouver un moyen d’en lancer une seule pour toutes les cases. Comme ce qui est fait pour le fond des cases si tu regardes mon script ;)
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
16 mai 2005 à 23:46
Ok. Ben du coup tu peux essayer comme je t'ai expliqué plus haut.

D'ailleurs, je rectifie, il faudra que tu fasses la même chose pour mysql_fetch_array():
if (!$deja_execute)
{
         $cartequery6 = doquery("SELECT charname,charclass FROM {{table}} WHERE latitude='$i' AND longitude='$j'  LIMIT 25", "users");
	$nombre6 = mysql_num_rows($cartequery6); 

        $page .= "<span class=\"carte\">  nbs. $nombre6</span><br>";	
        while ($persorow[] = mysql_fetch_array($cartequery6))
        {
                 continue;
        }
       $deja_execute=true;
}


Bon pour le coup $persorow devient un tableau multidimensionnel.
Il faudra donc faire:
$persorow[0]['charclass']
$persorow[1]['charclass']
etc...

Finalement, tu auras juste à faire comme avant, sauf qu'au lieu d'écrire
while ($persorow = mysql_fetch_array($cartequery6))

Il faudra écrire
foreach $persorow as $one_persorow
{
            // Et là tu remplaces tes $persorow['charclass'] par $one_persorow['charclass']
}

Mais peut être que tu n'as q'un seul tuple de données pour $persorow, en ce cas, $persorow=mysql_fetch_array(gnagnagna) suffira.
0
small > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
17 mai 2005 à 00:42
Oula, ça m’embrouille complet et ça marche pas..
Comprend pas d’ou vient le $one_persorow (entre autre..)
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
17 mai 2005 à 01:11
Je te réexplique tout pas à pas...

(J'aurais préféré tester chez moi avant de te balancer ces bouts de code mais ça serait long de reproduire la situation :-)

Donc comme prévu au début du script. Une variable booléenne qui prend la valeur de "faux". On part du principe que le requête n'a pas encore été executée.
<?
$deja_execute=FALSE;


Ensuite on reprend la requête:
if (!$deja_execute) //Equivalent de if ($deja_execute==FALSE)
{
            $cartequery6 = doquery("SELECT charname,charclass FROM {{table}} WHERE latitude='$i' AND longitude='$j'  LIMIT 25", "users");
	$nombre6 = mysql_num_rows($cartequery6); 
       $page .= "<span class=\"carte\">  nbs. $nombre6</span><br>";	
 
       while ($persorow[] = mysql_fetch_array($cartequery6))
      {
                    /* On fait tourner cette boucle dans le vide. Pour récupérer tous les résultats de ta requête. Comme ça pour
$personrow[0] tu as le premier personnage, $persorow[1] sera le deuxième. Et avec $persorow[0]['charname'] tu as la classe du premier personnage par exemple. C'est juste qu'on ajoute une nouvelle dimension à ton tableau.
                    continue;
       }
       // On mets ça à TRUE comme ça tout ce bloc conditionnel au dessus ne sera plus executé .
       $deja_execute=TRUE;
}


Là tu as ton tableau $persorow remplis complètement avec tous les personnages.
Dans l'absolu, il faudrait faire pour tous les index de ton tableau $persorow :
if ($persorow[0]["charname"] == '1') {$classe= 'magot'; $page .= "<img src=\"images/magot.gif\" alt=\"".$persorow[0]["charname"]." | $classe\">";} etc....


Même chose avec $persorow[1].
Pour ça on va faire une boucle avec foreach qui traite tous les index de ton tableau un à un.
=>http://fr.php.net/foreach
foreach $persorow as $one_persorow
{
             /* Au fur et à mesure de la boucle, $one_persorow prendra la valeur de $persorow[0], puis persorow[1]  etc.... Donc tu pourras utiliser $one_persorow['charname'] et $one_persorow['charclass'] */

            // Donc 
            if ($one_persorow["charclass"] == '1') {$classe= 'magot'; $page .= "<img src=\"images/magot.gif\" alt=\"".$one_persorow["charname"]." | $classe\">";}
 
           // Etc etc.....
}		 
?>


Si tu n'as pas compris n'hésite pas à le dire.
En gros, on fais la requête et la récupèration des valeurs de la requête une bonne fois pour toutes.
Le reste c'est l'exploitation du tableau $persorow qui contient les valeurs pour tes personnages. J'ai pris foreach comme j'aurais pu prendre une autre methode, mais c'est bien pratique.

Et j'ai pris $one_persorow comme nom de variable qui contiendra un à un chaque champs de $persorow mais j'aurais aussi pu prendre $bidule. Tu choisis ce que tu veux....

C'est juste que pour un tableau
$tableau[0]='truc';
$tableau[1]="machin";

Avec foreach tu le parcoures comme ceci:
(Sachant que $un_index_du_tableau est un nom au pif. C'est une variable qui prendra les valeurs des index de $tableau tour à tour à chaque itération de la boucle foreach.)
foreach $tableau as $un_index_du_tableau
{
           echo $un_index_du_tableau;
}

C'est l'equivalent de
echo $tableau[0];
echo $tableau[1];
0
small > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
17 mai 2005 à 01:34
Ha ok c’est bien plus clair merci beaucoup !

Je test ça :)
0