Bdd et array()

Eléphant du PHP | 114 Messages

23 mars 2007, 14:07

Bonjour
J'affiche une portion de carte. Cette carte contient 2500 cellules (50 x 50), chacune inscrite dans une table nommée Parcelle.

Chaque joueur possède une cellule et son nom est dans cette table.
J'affiche juste une portion de cette carte de 7x7.
Chaque cellule fait 32px.

Grace à une boucle, je parcours la table et suivant la valeur de "objet", j'affiche une icone à la position correspondante.

L'ennui c'est que je fais 49 requêtes (7x7). je pense que la bonne méthode serait plutôt de lire la table une fois,et mémoriser le tout dans un array .
Voici mon code avec commentaire, un peu archaique mais j'ai touvé ça tout seul ;) :
$id = $_SESSION['id'];

// obtenir id du joueur
$sql = "SELECT id FROM parcelle WHERE id_proprio = '$id' AND objet='1'";
$req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
$data = mysql_fetch_array($req);

$id_ville = $data['id']; // id village

//empêcher de dépasser les extremes
//le 24 et 48 est pour afficher l'objet du joueur au centre de la carte

$limite_inf = $id_ville - 24; if($limite_inf <= 0){$limite_inf = 1;}
$limite_sup = $limite_inf + 48;if($limite_sup > 2500){$limite_sup = 2502;}

// afficher la portion de carte
echo '<div id="carte">';
$x = 0;
$y = 0;
$cp = 0;

for ($i=$limite_inf;$i<=$limite_sup;$i++){

	$sql = "SELECT objet,nom_proprio FROM parcelle WHERE id='$i'";
	$req=mysql_query($sql);
	$data = mysql_fetch_array($req);
	$chef = $data['nom_proprio'];
	
        // afficher l'icone suivant valeur de objet, je prend ici que le premier cas : 1
	if ($data['objet'] == 1 ){
		echo '<span style="position: absolute; width: 32px; height: 32px;left: ',$x,'px; top:',$y,'px;"title="',$chef,'">';
		echo '<img class="s_bord" src="deco_2/village.png">';
		echo '</span>';
	}
	
	
	$x = $x + 32; //décalage de 32 px car icone = 32x32px
	$cp =$cp + 1;
        // si bout de ligne gauche atteint, on décale de 32px vers le bas pour changer de ligne donc $y auguement de 32 px, et $x repart à 0 (bord droit)
	if ($cp == 7) {$cp = 0; $y = $y + 32; $x = 0;}
}
Il est possible que je n'utilise pas la bonne méthode. Surtout avec ces 49 requêtes.
L'idée de l'array est-elle bonne ou suis-je carrément à côté de la plaque ?

ViPHP
ViPHP | 1996 Messages

23 mars 2007, 20:03

Bonjour,

Pourquoi ne fais tu pas :
$sql = "SELECT id, objet,nom_proprio FROM parcelle";
$req=mysql_query($sql); 

$i=0; // si tu veux démarrer à 0
while ($resultat = mysql_fetch_array($req)) {

         $tableau[$i]["id"] = $resultat["id"];
         $tableau[$i]["objet"] = $resultat["objet"];
         $tableau[$i]["nom_proprio"] = $resultat["nom_proprio"];

         $i++; // si tout va bien $i arrivera à 49
         }
comme cela tu auras un tableau indexé numérique avec toutes les valeurs.
Tu peux ensuite retravailler dans le tableau à loisir.

Ensuite vérifie quand même que le tableau est celui que tu voulais...A++
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 114 Messages

23 mars 2007, 20:11

J'y avais pensé mais je ne peux pas.

Imagine une grille de 50 x 50 carrés.
je place un pion en plein millieu par exemple.

Maintenant je veux afficher une grille de 7 x 7 contenant mon pion et au centre.

Si je prend les 49 carrés qui se suivent, j'aurais une ligne et pas une grille.
je ne sais pas trop si je m'explique bien :?

Mammouth du PHP | 693 Messages

23 mars 2007, 20:41

Une alternative serait de rentrer toutes les info de chaque case dans un tableau à deux dimension, puis après manipuler le tableau suivant tes besoins. Ca évitera de faire plusieurs requete SQL.

Eléphant du PHP | 114 Messages

23 mars 2007, 20:43

Et oui.....
Je pense que c'est ce que je vais faire.
Aller hop, je vais prendre des cours sur les tableaux à deux dimenssions.
Merci.