[RESOLU] affichage images propre depuis requete

Eléphant du PHP | 345 Messages

16 nov. 2023, 11:34

Je souhaite afficher des images sélectionnées selon un critère et qu'elles apparaissent sous forme de tableau 10 x10.
$sql = "SELECT * FROM map WHERE pays_name='$situation_pays'";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
$nb_par_ligne =10;
// compteur
$i = 0;
while ($resultat = $pdostat->fetch())    
{
$pos_x= $resultat['pos_x'];
$pos_y= $resultat['pos_y'];
$tile= $resultat['tile'];

echo '<table><tr><td>';	
    if ($i !== 0 && ($i%$nb_par_ligne ===0)){
        echo '</tr><tr>';
    }
	?>
	<td>
	<?php 	echo '.<img src="'.$tile.'">.';?></td>
<?php
    $i++;
}
while( ($i % $nb_par_ligne) !==0) {
echo '<td>&nbsp;</td>';
$i++;
echo '</tr></table>';
}
Dans cet exemple, j'ai 12 images à extraire mais elles s'affichent que sur une seule colonne verticale.
(a chaque tile correspond des coordonnées 'pos_x' et 'pos_'y')

Image

Avatar du membre
Mammouth du PHP | 1564 Messages

16 nov. 2023, 22:14

Prends l’habitude de correctement indenter ton code pour y voir clair. :wink:

Tu n'a pas vraiment posé de question, que souhaite tu ? Retourner à la ligne après 10 images ?

Eléphant du PHP | 345 Messages

17 nov. 2023, 01:43

En fait, et c'est là que ça se complique beaucoup, la requète de base
$sql = "SELECT * FROM map_océanie WHERE pays_name='$situation_pays'";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
peut afficher de 1 à n "case terrain" ($tile) selon l'étendue du pays du joueur....

Avatar du membre
Mammouth du PHP | 1564 Messages

17 nov. 2023, 08:20

C'est quoi la question ?

Eléphant du PHP | 345 Messages

17 nov. 2023, 09:51

DANS un premier temps, avec le script ci-dessus, obtenir 1 retour à la ligne apres 10 images.

Avatar du membre
Mammouth du PHP | 1564 Messages

17 nov. 2023, 10:17

D'accord, avec ton itérateur : $i = 0; (que tu va initialiser à 1 dès le départ : $i = 1; )

Dans ton while, tu l'incrémente de 1 : $i ++; (à la fin de la boucle, pas au début, sinon la condition suivante va être faussée)

Puis dans ton while toujours, tu fais une condition (en dessus de "$i ++;") : si i == 10, alors fait un retour à la ligne, puis on remet i à 1
if($i == 10){
//retour à la ligne
$i = 1;
}else{
$i++;
}

Eléphant du PHP | 345 Messages

17 nov. 2023, 15:19

Tu as supprimé un while alors?
$sql = "SELECT * FROM map WHERE pays_name='$situation_pays'";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
$nb_par_ligne = 10;
// compteur
$i = 1;
while ($resultat = $pdostat->fetch())    
{
$pos_x= $resultat['pos_x'];
$pos_y= $resultat['pos_y'];
$tile= $resultat['tile'];
echo '<table><tr><td>';	
    if ($i !== 1 && ($i%$nb_par_ligne ===0)){
        echo '</tr><tr>';
    }
	?>
	<td>
	<?php 	echo '.<img src="'.$tile.'">.';?></td>
<?php
    $i++;
}
if($i == 10){
//retour à la ligne
echo '<td>&nbsp;</td>';
echo '</tr></table>';
$i = 1;
}else{
$i++;
}
toujours affichage vertical

Avatar du membre
Mammouth du PHP | 1564 Messages

17 nov. 2023, 16:41

Je dois peut être pas parler français des fois :mrgreen:
D'accord, avec ton itérateur : $i = 0; (que tu va initialiser à 1 dès le départ : $i = 1; )

Dans ton while, tu l'incrémente de 1 : $i ++; (à la fin de la boucle, pas au début, sinon la condition suivante va être faussée)

Puis dans ton while toujours, tu fais une condition (en dessus de "$i ++;") : si i == 10, alors fait un retour à la ligne, puis on remet i à 1
if($i == 10){
//retour à la ligne
$i = 1;
}else{
$i++;
}

Eléphant du PHP | 345 Messages

18 nov. 2023, 01:57

Tu maitrises parfaitement la langue de Molière , rassure toi :lol:
C'est juste que j'ai deux boucles while dans mon script. J'ai modifié ainsi:
$sql = "SELECT * FROM map WHERE pays_name='$situation_pays'";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
$nb_par_ligne =10;
// compteur
$i = 1;
while ($resultat = $pdostat->fetch())    
{
$pos_x= $resultat['pos_x'];
$pos_y= $resultat['pos_y'];
$tile= $resultat['tile'];

echo '<table><tr><td>';	
    if ($i !== 0 && ($i%$nb_par_ligne ===0)){
        echo '</tr><tr>';
		$i ++;
		if($i == 10){
//retour à la ligne
$i = 1;
}else{
$i++;
}
    }
  ?>
  <td>
  <?php 	echo '.<img src="'.$tile.'">.';?></td>
<?php
}
while( ($i % $nb_par_ligne) !==0) {
echo '<td>&nbsp;</td>';
echo '</tr></table>';
}
?>
là, pas de message erreur mais le script "mouline" dans le navigateur...
Modifié en dernier par nestor94 le 18 nov. 2023, 02:04, modifié 1 fois.

Avatar du membre
Mammouth du PHP | 1564 Messages

18 nov. 2023, 02:02

Au temps pour moi, désolé !

Je trouve ton deuxième while mal employé, voire inutile car tu peux faire les retours directement dans ton premier while.

SI le script mouline, c'est peut être le second while qui tourne en boucle sans arrêt car la condition peut être toujours vraie. Tu es bon pour redémarrer le serveur local pour arrêter le cauchemar. :mrgreen:

As tu essayé de mettre mon bout de code dans ton while principal ? Ajuste le en mettant des saut de ligne quand c'est == 10.

Après, perso, je serai passé par un tableau PHP et coupé à 10 entrées via array_chunk : https://www.php.net/manual/fr/function.array-chunk.php pour plus de liberté à traiter les informations une fois extraites de la BDD.

Eléphant du PHP | 345 Messages

18 nov. 2023, 10:42

Hello,
j'ai repris ton dernier post pour appliquer? les consignes en supprimant le second while remplacé par un if dans le premier (while)
je reviens sur un affichage vertical :cry:

que signifie exactement ceci ?
$i%$nb_par_ligne ===0)
if( ($i % $nb_par_ligne) !==0) {

$nb_par_ligne =10;
// compteur
$i = 1;
while ($resultat = $pdostat->fetch())    
{
$pos_x= $resultat['pos_x'];
$pos_y= $resultat['pos_y'];
$tile= $resultat['tile'];

echo '<table><tr><td>';	
    if ($i !== 0 && ($i%$nb_par_ligne ===0)){
        echo '</tr><tr>';
    $i ++;
    if($i == 10){
//retour à la ligne
$i = 1;
}else{
$i++;
if( ($i % $nb_par_ligne) !==0) {
echo '<td>&nbsp;</td>';
echo '</tr></table>';
}

}
    }
  ?>
  <td>
  <?php 	echo '.<img src="'.$tile.'">.';?></td>
<?php
}
?>
je vais peut-etre tenté ton autre solution avec array_chuck ? car ce script est loin d'etre finalisé. Il faudrait ensuite que l'affichage des images soit dans l'ordre par rapport à la map d'origine (et en fonction donc des coordonnées pos_x et pos_y)

Avatar du membre
Mammouth du PHP | 1564 Messages

18 nov. 2023, 11:08

Prends l'habitude d'indenter ton code, c'est une horreur à lire. https://www.youtube.com/watch?v=6uPYxXWSkzI

(EDIT : après une bonne indentation, j'ai remarqué que non ) A vue d’œil, on dirait que tu n'englobe pas mes conditions avec ton while, met que tu fait while/else, c'est while, if/else, fermeture while

Le % est un modulo : language.operators.arithmetic

Cadeau, un code bien indenté, dis moi si ça fonctionne, adapte le selon ta convenance :
//paramètre
$nb_par_ligne = 10;

//on commence par ouvrir le tableau (1 seule fois ! à pas mettre dans la boucle)
echo '<table><tr>';

//initialisation du compteur
$i = 1;

while($resultat = $pdostat->fetch()){
	
	//afiichage de la tile
	echo '<td><img src="' . $resultat['tile'] . '"></td>';
	
	//si le nombre de tile est de 10, on passe à la ligne
	if($i == $nb_par_ligne){
		
		//retour à la ligne
		echo '</tr><tr>';
		$i = 1;
	
	//sinon, on continu l'affichage horizontal
	}else{
		
		//compte le nombre de tile affichées
		$i ++;
		
	}
}

//fermeture du tableau
echo '</tr></table>';

Eléphant du PHP | 345 Messages

20 nov. 2023, 12:46

Bonjour two3d,

Mille mercis pour ce code épuré et compréhensible, Il fonctionne parfaitement. =D>
La seconde partie va nécessiter un nouveau topic... :?