Afficher requête sql sur 2 colonnes

Mammouth du PHP | 687 Messages

28 déc. 2010, 03:22

Bonjour à tous,
je voudrais savoir si quelqu'un aurait la gentillesse de me dire comment je peux afficher les résultats d'une seule requête sur 2 colonnes ?

Voici ce que j'ai fait :
<table><tr>
<th>Colonne 1</th>
<th>Colonne 2</th>

</tr>

<?php
$retour = mysql_query("SELECT * FROM coordonnees WHERE num_ad = '$num_ad' ORDER BY ID DESC ");
while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les résultats
{
?>

<tr>
<td><?php echo $donnees['activite'].'">'; ?></td>
<td><?php echo $donnees['activite']; ?></td>


</tr>
<?php
} // Fin de la boucle
?>
</table>
Le problème de mon codage c'est que dans les deux colonnes il y a les mêmes résultats... normal me direz-vous puisqu'il y a dans chaque colonne la même requête... le problème c'est que je ne sais pas faire autrement...

Merci par avance.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 déc. 2010, 05:56

salut,

faut utiliser l'opérateur modulo pour arriver a tes fins (c'est le reste de la division). en php c'est le %
<table><tr>
<th>Colonne 1</th>
<th>Colonne 2</th>
</tr>
<?php
$retour = mysql_query("SELECT * FROM coordonnees WHERE num_ad = '$num_ad' ORDER BY ID DESC ");
$i = 0; initialisation du compteurs
$nbparligne = 2; // ici on indique le nombre d'élément que l'on veut sur chaque ligne
echo '<tr>';
while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les résultats
{
if ( $i !=0 && ($i % $nbparligne)==0) {
echo '</tr><tr>';
}
echo '<td>',$donnees['activite'].'>';
$i++;
} // Fin de la boucle
//on ferme le tableau proprement
while ( ($i%$nbparligne)!=0) {
echo '<td>&nbsp;</td>';
$i++;
}
}
?>
</tr>
</table>
@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 687 Messages

28 déc. 2010, 12:02

Merci,
je viens d'essayer le code mais tous les résultats s'affichent dans la colonne 1.

Voici le code :
<table><tr>
<th>Colonne 1</th>
<th>Colonne 2</th>
</tr>
<?php
$retour = mysql_query("SELECT * FROM coordonnees WHERE num_ad = '$num_ad' ORDER BY ID DESC ");
$i = 0; // initialisation du compteurs
$nbparligne = 2; // ici on indique le nombre d'élément que l'on veut sur chaque ligne
echo '<tr>';
while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les résultats
{
if ( $i !=0 && ($i % $nbparligne)==0) {
echo '</tr><tr>';
}
echo '<td>',$donnees['activite'].'>';
$i++;
} // Fin de la boucle
//on ferme le tableau proprement
while ( ($i%$nbparligne)!=0) {
echo '<td>&nbsp;</td>';
$i++;
}

?>
</tr>
</table>

Merci beaucoup.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 déc. 2010, 12:41

En fait, pour pouvoir afficher l'enregistrement suivant, il faut faire appel à l'une des fonctions mysql_fetch_xxx. Donc si l'on prend ton premier code, il suffit simplement d'insérer un appel à cette fonction entre tes deux colonnes :)

La contrainte, c'est ensuite de gérer le fait qu'il y ait ou non un deuxième enregistrement, mais ce n'est pas ce qu'il y a de plus compliqué si tu n'as que deux colonnes...

Pour ton problème avec le module, peut être est-ce parce que ta balises <td> n'est pas correctement fermée ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 687 Messages

28 déc. 2010, 14:40

voilà ce que j'ai fait mais ça ne fonctionne toujours pas...
Je crois que je n'ai pas trop compris le fait d'ajouter un mysql_fetch_xxx entre les deux colonnes... :(
<table><tr>
<th>Colonne 1</th>
<th>Colonne 2</th>
</tr>
<?php
$retour = mysql_query("SELECT * FROM coordonnees WHERE num_ad = '$num_ad' ORDER BY ID DESC  ");
$i = 0; // initialisation du compteurs
$nbparligne = 2; // ici on indique le nombre d'élément que l'on veut sur chaque ligne
echo '<tr>';
while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les résultats
{
if ( $i !=0 && ($i % $nbparligne)==0) {
echo '</tr><tr>';
}
echo '<td style="width: 300px;">',$donnees['activite'].'</td></tr>';
$i++;
} // Fin de la boucle
//on ferme le tableau proprement
while ( ($i%$nbparligne)!=0) {
	echo '</tr><tr>';
echo '<td style="width: 300px;">',$donnees['activite'].'</td></tr>';
$i++;
}

?>
</tr>
</table>
peux-tu m'aider stp, je pense que j'en suis pas très loin mais là je bloque surtout avec cette contrainte...

Merci beaucoup!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 déc. 2010, 15:18

Ben la tu fermes non seulement la cellule mais également la ligne et ça ne va pas ... de plus tu as modifié la partie "fermeture propre du tableau" qui permet de compléter avec des cellules vides lorsqu'il n'y a pas assez d'enregistrements et qui était correcte...

Pour plus d'infos sur le fonctionnement de l'opérateur modulo et la gestion de colonnes, tu as ce topic de la FAQ :
faq-tutoriels/nombre-colonnes-dynamique ... 41626.html
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 687 Messages

28 déc. 2010, 16:28

Merci pour ce tuto ! il est très bien.
<?php
$nbCols = 2; // nombre de colonnes du tableau
$cpt = 0; // compteur d'éléments
?>

<table>
  <tr>
    <th style="width:<?php echo round(100/$nbCols);?>50%;">Colonne 1</th>
    <th style="width:<?php echo round(100/$nbCols);?>50%;">Colonne 2</th>
<?php /*?>    <th style="width:<?php echo round(100/$nbCols);?>1%;">Colonne 3</th><?php */?>
  </tr>
<?php

$rs = mysql_query("SELECT * FROM coordonnees WHERE num_ad = '$num_ad'"); // exécution de la requête
// Nota : on pourrait tout aussi bien parcourir les éléments d'un tableau ou les fichiers d'un dossier

while ($row=mysql_fetch_assoc($rs)) { // parcours des résultats

    // début d'une ligne
    if ($cpt%$nbCols==0) // on divise le nb d'élément par le nb de colonnes. Si le reste est de 0 ...
        echo '<tr>'; // ..., alors on est sur le premier élément d'une ligne


    // On place chaque élément dans une cellule du tableau
    echo '<td>';
    echo $row['activite']; // affichage de tout ce qu'on veut dans la cellule
    echo '</td>';


    // fin d'une ligne
    if ($cpt%$nbCols==($nbCols-1)) // on divise le nb d'élément par le nb de colonnes. Si le reste est de ($nbCols-1) ...
        echo '</tr>'; // ..., on est sur le dernier élément d'une ligne

    $cpt++; // on incrémente le compteur pour savoir où on en est
}

// Au cas où ...
if ($cpt!=0 && $cpt%$nbCols!=0) { // S'il n'y a pas eu assez de cellules dans la boucle pour finir la ligne ...
    echo '<td colspan="'.($nbCols - ($cpt%$nbCols) ).'">&nbsp;</td>'; // ... on complète avec une cellule vide de la bonne taille...
    echo '</tr>'; // ... et on ferme la ligne
}

?>

</table>
Hélàs mes résultats se trouvent toujours sur la première colonne... il y a forcément un truc que je n'ai pas fait mais lequel...
:cry:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 déc. 2010, 18:59

Montre nous le code source du tableau qui est généré... on verra rapidement dans le html ou se trouve le problème d'affichage :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 687 Messages

28 déc. 2010, 20:24

Voici l'affichage HTML... Merci
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans nom</title>
</head>

<body>

<page class="page"><legend class="legend">SITS FRANCE</legend>

<table>
  <tr>
    <th style="width:5050%;">Colonne 1</th>
    <th style="width:5050%;">Colonne 2</th>

  </tr>
<td>Pose automatisée de caniveaux
, Pose mécanisée de câbles au soc et par trancheuse
, Pose de câble, signalisation, énergie, télécoms
, Forage dirigé et forage horizontal
, Manutention, levage, matage
, Signalisation, câblage ferroviaire
, Métallerie - serrurerie
, Pose de câble à fibre optique par flottage et par portage
, Génie civil 
, Réseaux fibre optique mono-mode / multi-mode
, Vidéo surveillance
, Électricité MT / BT
, Réseaux informatiques catégorie 5 et 6
, Contrôle d'accès - Alarme - Incendie
, Éclairage</td><td colspan="1">&nbsp;</td></tr>
</table>
 
</page>

    </div>


 </body>
</html>

Eléphant du PHP | 109 Messages

28 déc. 2010, 20:53

J'étais dans le même cas que toi il y a peu et voila comment j'avais fait :
<?php
          $reponse = $base->prepare($maRequete); //Requete
          $reponse->execute(array($mesVariables));
  
          $i = 0; // Initialisation du compteur
          while($donnees = $reponse->fetch())
          {
                    if(($i % 2) == 0) // Si on est à la première case
                    {
                              echo '<tr> <td> Contenu de la première case </td>';
                              $i++; // On incrémente le compteur
                    }
                    else //Si on est dans la deuxième
                    {
                              echo '<td> Contenu deuxième case </td> </tr>';
                              $i++; //Idem
                    }
         }
?>                            
Le tableau générer est donc le suivant :
 <table> 
 <tr>
      <td> Contenu de la première case </td>
      <td> Contenu deuxième case </td> 
</tr>
<tr> 
      <td> Contenu de la première case </td>
      <td> Contenu deuxième case </td> 
</tr>
<tr>
      <td> Contenu de la première case </td>
      <td> Contenu deuxième case </td>
</tr>
[...]
</table> 
J'espère t'avoir permis d'avancer.
Bonne soirée ;)
ANSI <font> <font> <font> <li> <p> <title> Mar I/O .NET

Mammouth du PHP | 687 Messages

28 déc. 2010, 21:09

Merci beaucoup!
Je suis désolé mais je ne comprends pas ton code, pourtant il est bien expliqué !
En fait je ne sais pas ou je place ma connexion à la base, et ou dois-je paramétrer mes colonnes (par exemple mes résultats sont divisés par deux colonnes (le résultat est le fruit d'une seule requête))...
:cry: :cry: :cry:
que dois-je mettre à la place de $maRequete et $mesariables ???

Merci

Eléphant du PHP | 109 Messages

28 déc. 2010, 21:30

Désolé, j'avais mis directement mon code mais ce dernier est à adapter.
J'ai considéré que la connection à la base était déjà établie.
Ceci devrait être plus clair :
<table>

<?php
          //Connection à ta base de donnée déjà établie

          $retour = mysql_query("SELECT * FROM coordonnees WHERE num_ad = '$num_ad'"); // Requête
  
          $i = 0; // Initialisation du compteur
          while($donnees = mysql_fetch_array($retour))
          {
                    if(($i % 2) == 0) // Si on est à la première case
                    {
                              echo '<tr> <td> ' . $donnees['activite'] ' . </td>';
                              $i++; // On incrémente le compteur
                    }
                    else //Si on est dans la deuxième
                    {
                              echo '<td> ' . $donnees['activite'] ' . </td> </tr>';
                              $i++; //Idem
                    }
         }
?>                            
</table>
Ainsi, lors de son premier passage dans la boucle, le compteur vaut 0. Donc 0 % 2 aussi. On peut donc créer la ligne du tableau et insérer la première cellule.
Lors de son deuxième passage dans la boucle, $i vaut 1. Donc 1 % 2 != 0. On rentre donc dans le else afin de créer la deuxième cellule et fermer la ligne.
Et ainsi de suite...
Tu peux paramétrer tes colones entre <table> et <?php (ligne 2).

Ainsi, le résultat de ta requête est afficher dans un tableau sur deux colones. C'est bien se que tu voulais? :?:
ANSI <font> <font> <font> <li> <p> <title> Mar I/O .NET

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 déc. 2010, 21:41

En fait j'ai l'impression que toutes tes valeurs sont stockées dans un seul champ d'un même enregistrement... du coup puisque tu n'as qu'une seule "valeur", il est normale que celle-ci soit affichée dans la première colonne.

D'après ton code, il faudrait en fait que tu récupères la valeur que tu as en base, puis que tu construises un tableau à partir de chaque activité contenue dans cette valeur (vu qu'elles ont l'air d'être séparées par des virgules).

En gros, tu aurais deux boucles : un pour parcourir les enregistrements, l'autre pour parcourir les activités d'un enregistrement :
$rs = mysql_query("SELECT * FROM coordonnees WHERE num_ad = '$num_ad'"); // exécution de la requête
// Nota : on pourrait tout aussi bien parcourir les éléments d'un tableau ou les fichiers d'un dossier

while ($row=mysql_fetch_assoc($rs)) { // parcours des résultats

  $tabActivite = explode(',',  $row['activite']); // construit le tableau d'activités

  foreach($tabActivite as $activite) { // on parcours le tableau

    // début d'une ligne
    if ($cpt%$nbCols==0) // on divise le nb d'élément par le nb de colonnes. Si le reste est de 0 ...
        echo '<tr>'; // ..., alors on est sur le premier élément d'une ligne

    // On place chaque élément dans une cellule du tableau
    echo '<td>';
    echo $activite; // affichage de tout ce qu'on veut dans la cellule
    echo '</td>';

    // fin d'une ligne
    if ($cpt%$nbCols==($nbCols-1)) // on divise le nb d'élément par le nb de colonnes. Si le reste est de ($nbCols-1) ...
        echo '</tr>'; // ..., on est sur le dernier élément d'une ligne

    $cpt++; // on incrémente le compteur pour savoir où on en est
  }
}
Maintenant, le problème semble plus être un problème de conception, car tes activités stockées en base semblent difficilement exploitables... mais bon, au moins comme ça tu peux gérer l'affichage :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 déc. 2010, 21:50

hum j'ai oublié une partie de la fermeture de la balise td

ce qui donne
<table><tr>
<th>Colonne 1</th>
<th>Colonne 2</th>
</tr>
<?php
$retour = mysql_query("SELECT * FROM coordonnees WHERE num_ad = '$num_ad' ORDER BY ID DESC ");
$i = 0; initialisation du compteurs
$nbparligne = 2; // ici on indique le nombre d'élément que l'on veut sur chaque ligne
echo '<tr>';
while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les résultats
{
if ( $i !=0 && ($i % $nbparligne)==0) {
echo '</tr><tr>';
}
echo '<td>',$donnees['activite'].'</td>';
$i++;
} // Fin de la boucle
//on ferme le tableau proprement
while ( ($i%$nbparligne)!=0) {
echo '<td>&nbsp;</td>';
$i++;
}
}
?>
</tr>
</table>
faudrait que tu vérifie ce que l'on te donne ;)

oublie le code de Simbert si tu ne connait pas PDO.

Pour ce qui est de ton code il est fonctionnel (je viens de le tester avec les données fournies) il faut utiliser correctement la taille car la tu obtient une colonne de 5050% ...

l'avis de Ryle est une bonne piste !

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 687 Messages

28 déc. 2010, 23:15

Effectivement les résultats affichés sont extraits d'une seule colonne d'une base.
je viens d'essayer ce code :
$rs = mysql_query("SELECT * FROM coordonnees WHERE num_ad = '$num_ad'"); // exécution de la requête
// Nota : on pourrait tout aussi bien parcourir les éléments d'un tableau ou les fichiers d'un dossier

while ($row=mysql_fetch_assoc($rs)) { // parcours des résultats

  $tabActivite = explode(',',  $row['activite']); // construit le tableau d'activités

  foreach($tabActivite as $activite) { // on parcours le tableau

    // début d'une ligne
    if ($cpt%$nbCols==0) // on divise le nb d'élément par le nb de colonnes. Si le reste est de 0 ...
        echo '<tr>'; // ..., alors on est sur le premier élément d'une ligne

    // On place chaque élément dans une cellule du tableau
    echo '<td>';
    echo $activite; // affichage de tout ce qu'on veut dans la cellule
    echo '</td>';

    // fin d'une ligne
    if ($cpt%$nbCols==($nbCols-1)) // on divise le nb d'élément par le nb de colonnes. Si le reste est de ($nbCols-1) ...
        echo '</tr>'; // ..., on est sur le dernier élément d'une ligne

    $cpt++; // on incrémente le compteur pour savoir où on en est
  }
}
 

mais il y a deux erreurs qui correspondent aux lignes ci dessous (ERREUR = Warning: Division by zero in..........)
1) if ($cpt%$nbCols==0) // on divise le nb d'élément par le nb de colonnes. Si le reste est de 0 ...
2) if ($cpt%$nbCols==($nbCols-1)) // on divise le nb d'élément par le nb de colonnes. Si le reste est de ($nbCols-1) ...
En revanche mes résultats s'affichent correctement MAIS dans la première colonne uniquement... :cry: