Page 1 sur 1

Bdd et array()

Posté : 23 mars 2007, 14:07
par Florent
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 ?

Posté : 23 mars 2007, 20:03
par Aureusms
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++

Posté : 23 mars 2007, 20:11
par Florent
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 :?

Posté : 23 mars 2007, 20:41
par orgerix
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.

Posté : 23 mars 2007, 20:43
par Florent
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.