Résultats sur deux lignes

Eléphant du PHP | 184 Messages

25 nov. 2011, 10:33

Bonjour,

J'ai un résultat de requête qui va chercher un texte dans un bdd.
J'aimerai que les résultats soient stockés dans un tableau, deux par deux.

( Texte1 - Texte2
Texte3 - Texte4 )

Mais je ne sais pas trop comment le formuler:

<table>

<?php while ($result_categorie = mysql_fetch_array($requete_categorie)){
$texte_categorie = $result_categorie['texte_categorie'];
echo '<td>'.$texte_categorie.'.</td>';
}
?>

</table>
J'ai fait un truc que j'ai trouvé sur le net, mais ça ne marche pas, cela me met mes résultats les uns en dessous des autres:

<table>
<tr>
<td>
<ul>
<?php
$retour = mysql_query('SELECT COUNT(*) AS nb_texte FROM categories_texte');
$donnees = mysql_fetch_array($retour);
$nb = ceil($donnees['nb_poesie']/2);
$i=0;

$return = mysql_query('SELECT * FROM categories_texte ORDER BY ID_categorie');
while ($data = mysql_fetch_array($return))
{
    if ($i == $nb) { echo '</ul></td><td><ul>'; }
    ?><li><?php echo $data['texte_categorie'];?><?php echo $data['texte_categorie'];?></li>
<?php 
}
?>
</ul>
</td>
</tr>
</table>

Mammouth du PHP | 672 Messages

25 nov. 2011, 11:24

Bonjour.

Il faut séparer ton problème :
1. Récupération des données. C'est OK, tu les récupères dans un tableau $result_categorie.

2. Affichage des données. C'est ici que tu as ton problème.
Du coup, on peut éliminer toute la partie SQL. Un des avantages, c'est que tu vas bien séparer ton code, et le jour où tu voudras changer l'affichage tu n'auras que la partie affichage ( :mrgreen: ) à modifier... C'est un premier pas vers le modèle MVC.

Donc, ton problème c'est d'afficher les éléments de ton tableau $result_categorie deux par deux.
Comme tu pourras plus tard vouloir les afficher par trois, on va faire du général, en utilisant la fonction modulo %.

Un exemple avec une liste :
$nb_par_ligne = 2; // Nombre d'éléments par ligne
echo "<ul>\n";
/*
 On prend chaque élément du tableau
 Attention, le tableau commence à Zéro, donc
 aller de zéro à (nombre d'éléments - 1)
*/
for ($i = 0; $i < count($result_categorie); $i++) {
/*
 Si on veut afficher n éléments, on aura :
 0 1 2... (n-1)
 n...(2n-1)
 2n...
 On commence donc une ligne quand le modulo n = 0 (multiple de n).
*/
	if ($i % $nb_par_ligne == 0) {
		// On ferme une éventuelle ligne intermédiaire
		if ($i > 0) echo "</li>\n";
		echo "<li>"; // On commence une nouvelle ligne
	}
	echo $result_categorie[$i];
}
echo "</li></ul>";

Eléphant du PHP | 184 Messages

25 nov. 2011, 16:28

Merci pour la réponse,

Il y a quelque chose que je n'ai pas du comprendre, car cela me met une série de lettres les unes en dessous des autres.

J'en suis là:
<?php

require_once('admin/connexion/localhost.php');

$conn = mysql_connect($hostname_localhost, $username_localhost, $password_localhost) or trigger_error(mysql_error(),E_USER_ERROR);
 
mysql_query("SET CHARACTER SET 'utf8';")or die(mysql_error()); 
 
mysql_select_db($database_localhost, $conn);

$sql_categorie = "SELECT * FROM categories_poetiques";
$requete_categorie = mysql_query($sql_categorie) or die( mysql_error());


while ($result_categorie = mysql_fetch_array($requete_categorie)){
$texte_categorie = $result_categorie['texte_categorie'];

$nb_par_ligne = 2; // Nombre d'éléments par ligne
echo "<ul>\n";
/*
 On prend chaque élément du tableau
 Attention, le tableau commence à Zéro, donc
 aller de zéro à (nombre d'éléments - 1)
*/
for ($i = 0; $i < count($texte_categorie); $i++) {
/*
 Si on veut afficher n éléments, on aura :
 0 1 2... (n-1)
 n...(2n-1)
 2n...
 On commence donc une ligne quand le modulo n = 0 (multiple de n).
*/
        if ($i % $nb_par_ligne == 0) {
                // On ferme une éventuelle ligne intermédiaire
                if ($i > 0) echo "</li>\n";
                echo "<li>"; // On commence une nouvelle ligne
        }
        echo $texte_categorie[$i];
}
echo "</li></ul>";

}
?>

Mammouth du PHP | 672 Messages

25 nov. 2011, 17:28

Je confirme.

Il y a quelque chose que tu n'as pas compris #-o
$texte_categorie = $result_categorie['texte_categorie'];
//...
for ($i = 0; $i < count($texte_categorie); $i++) {
Tu as quoi, dans $texte_categorie ? Une chaîne de caractères certainement.
PHP peut traiter les chaînes comme s'il s'agissait de tableaux. Du coup, là, tu affiche lettre par lettre =D>

Quand je te disais de séparer le problème, ce n'était pas qu'une façon de parler :
Dans ton code PHP, il faudrait traiter la requête+le retour, pour alimenter un tableau.
// Dans un premier temps on gère la récupération des données.
$sql_categorie = "SELECT * FROM categories_poetiques";
$requete_categorie = mysql_query($sql_categorie) or die( mysql_error());
while ($result_categorie = mysql_fetch_array($requete_categorie)){
// On remplit un tableau
}
Et ensuite, gérer l'affichage.
//Dans un second temps on utilise le tableau pour l'affichage
for ($i = 0; $i < count($le_tableau_qu_on_a_cree_avant); $i++) {
// Gestion de l'affichage
}
A la limite, les deux traitements pourraient même être dans deux fichiers différents, ou dans des fonctions...