[RESOLU] problème de boucle

Eléphant du PHP | 345 Messages

28 avr. 2023, 00:22

<table>
<?php
$sql = "SELECT * FROM avatars ORDER BY name ASC";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
$rowAll = $pdostat->fetchAll();
?>
<table>
<tr>
<?php
foreach ( $rowAll as $row )
    {
        // DONNEES A AFFICHER dans chaque cellule de la ligne
?>
<td><a href="/choix_avatar_fin.php?id=<?php echo $row['id']; ?>"><?php echo '<img src="'.$row['name'].'">'; ?></a>
    </td>
	</tr>
	<?php
}
}
?>
</table>

Ce script affiche les avatars verticalement et l'un sous l'autre. Je voudrais qu'ils s'affichent sous forme de tableau lignes et colonnes. Pouvez vous me donner une piste concernant les éléments manquants?

Mammouth du PHP | 1967 Messages

28 avr. 2023, 08:51

Il faut que tu insère des </tr><tr> à chaque fin de ligne, pour cela il faut compter chaque affichage et utiliser la fonction modulo (%) pour savoir quand.

D'ailleurs si tu regarde ton code html généré, tu verra qu'il n'est pas correct. trop de </tr> pour un seul <tr> et 2 balise <table>
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 345 Messages

28 avr. 2023, 14:15

Je souhaite obtenir cela

[url= https://i.postimg.cc/TPJYBw0d/Sans-titre-2.jpg[url]

j'ai modifié ainsi mais ca coince :oops:
<?php
$sql = "SELECT count(*) FROM avatars ORDER BY name ASC";
$pdostat = $bdd->prepare($sql);
$pdostat->execute(array($name));
$rows= $pdostat->fetchAll();
$num_rows = count($rows);
?>
<center>
<table>
<tr>
<td><a href="/choix_avatar_fin.php?id=<?php echo $rows['id']; ?>"><?php echo '<img src="'.$rows['name'].'">'; ?></a>
    </td>
  </tr>
</table>
Warning: Undefined variable $name in /home/clients/78f15c369c0786c4a419608e9e60028a/sites/xxxxx/choix_avatar.php on line 40

Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /home/clients/78f15c369c0786c4a419608e9e60028a/sites/xxxxx/choix_avatar.php:40 Stack trace: #0 /home/clients/78f15c369c0786c4a419608e9e60028a/sites/xxxx.fr/choix_avatar.php(40): PDOStatement->execute(Array) #1 {main} thrown in /home/clients/78f15c369c0786c4a419608e9e60028a/sites/xxxxx/choix_avatar.php on line 40
Modifié en dernier par nestor94 le 28 avr. 2023, 14:35, modifié 1 fois.

Mammouth du PHP | 2703 Messages

28 avr. 2023, 14:33

css float pour avoir un nombre de colonne qui s'adapte à la largeur de l'écran.
https://jsfiddle.net/xg5hudze/ cliquer sur run et faire varier la taille de la fenêtre de son navigateur.

Eléphant du PHP | 345 Messages

28 avr. 2023, 14:37

c'est déjà au niveau de php que cela déconne.

Mammouth du PHP | 2703 Messages

28 avr. 2023, 14:48

c'est mille fois plus simple de générer le code html avec du float que de le faire avec une table, et la table, bonjour pour l'adapter à la taille de l'écran.

Avatar du membre
Mammouth du PHP | 1609 Messages

28 avr. 2023, 16:14

Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

Je suppose qu'il s'agit de cette requête "SELECT count(*) FROM avatars ORDER BY name ASC" qui ne contient pas de paramètre, il ne faut donc pas passer de paramètre au execute $pdostat->execute(array($name));.

Le code était bon au départ ($pdostat->execute();), pourquoi avoir ajouter ce tableau (array($name)) ?
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1564 Messages

28 avr. 2023, 16:40

Spols ta pas dit d'enlever ton foreach ;) seulement rajouter des tr dans ton foreach (boucle)

Eléphant du PHP | 345 Messages

28 avr. 2023, 19:24

<?php    
require_once 'config.php';
$id = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;
?>
<html>
 <head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
 <title>choix avatar</title>
<style type="text/css">
body {
color:black;
background-color:white;
background-image:url(images/fond.jpg);
background-attachment:fixed;
background-repeat: no-repeat;
background-size: cover;
background-position: center;
color:#000000;
text-align:center;
margin: auto;
}
img{
  float: center;
}
table, th, td {
  border: 1px solid black;
  border-collapse: collapse;
}
th, td {
  padding: 5px;
  text-align: left;
}

</style>
 </head>
<body>
<div id="entete">
<center><img src="images/banniere.jpg"></center>
</div>
<br>
<table>
<tr>
<td>
<?php
$sql = "SELECT * FROM avatars ORDER BY name ASC";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
$rowAll = $pdostat->fetchAll();
foreach ( $rowAll as $row )
    {
?>
<a href="/choix_avatar_fin.php?id=<?php echo $row['id']; ?>"><?php echo '<img src="'.$row['name'].'">'; ?></a>
</tr>
</td>
<?php
}
?>
</body>
</html>
là, j'ai la banniere a gauche suivi de tous les avatars horizontalement.

Avatar du membre
Mammouth du PHP | 1564 Messages

28 avr. 2023, 19:51

Raisonne logiquement : une table c'est quoi ? :
<table>
  <tr>
    <td>Info 1</td>
  </tr>
  <tr>
    <td>Info 2</td>
  </tr>
  etc...
</table>
Tu dois absolument boucler avec les balises nécessaires, donc
  <tr> <!-- un tr d'ouverture -->
    <td>...</td> <!-- un td de contenu -->
  </tr> <!-- un tr de fermeture -->
Plus d'infos sur la balise table

Mammouth du PHP | 2703 Messages

28 avr. 2023, 20:19

une table, c'est à utiliser quand on veut que des cellules aient une bordure. est-ce le cas ici ? non, donc il faut virer cette table inutile. la mise en page, cela se fait en css.

Eléphant du PHP | 345 Messages

28 avr. 2023, 21:02

J'ai laissé tomber la table et cela semble presque bon ( ai mis center pour attribut css de img float).

dernier bémol ?
les avatars affichés prennent toute la largeur de l'écran, ça fait un peu mal aux yeux.
Comment faire pour faire un "saut de ligne" toutes les 20 images, par exemple?

Mammouth du PHP | 2703 Messages

28 avr. 2023, 21:18

mettre le tout dans un div et fixer en css une largeur maximale.

Avatar du membre
Mammouth du PHP | 1564 Messages

28 avr. 2023, 22:45

Comment faire pour faire un "saut de ligne" toutes les 20 images, par exemple?
C'est hors sujet mais utilise les flexbox pour gérer le nombre d'élément sur une ligne :

Maîtriser le passage à la ligne des éléments flexibles

Eléphant du PHP | 345 Messages

29 avr. 2023, 00:14

Génial, c'est bon à présent. Merci à vous :wink:

<?php    
require_once 'config.php';
$id = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;
?>
<html>
 <head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
 <title>choix avatar</title>
<style type="text/css">
body {
color:black;
background-color:white;
background-image:url(images/fond.jpg);
background-attachment:fixed;
background-repeat: no-repeat;
background-size: cover;
background-position: center;
color:#000000;
text-align:center;
margin: auto;
}
img{
  float: center;
}
</style>
 </head>
<body>
<center><img src="images/banniere.jpg"></center>
<br><b>CHOISISSEZ UN AVATAR</b><br>
<center>
<br>
<style type="text/css">
div {
max-width: 60%; 
}
img{
  float: center;
}
</style>
<div>
<?php
$sql = "SELECT * FROM avatars ORDER BY name ASC";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
$rowAll = $pdostat->fetchAll();
foreach ( $rowAll as $row )
    {
?>
<a href="/choix_avatar_fin.php?id=<?php echo $row['id']; ?>"><?php echo '<img src="'.$row['name'].'">'; ?></a>
<?php
}
?>
</div>
</body>
</html>