Page 1 sur 1

Affichage en colonnes : Transformer un foreach() en variable

Posté : 08 oct. 2008, 15:35
par Kayak
Salut,


j'essaie d'effectuer un script mais je bute sur un dernier souci. Je fais une requète SQL à partir de laquelle je détermine deux variables que j'affiche ensuite avec une autre fichier .php en include, le tout par l'intermédiaire d'un foreach. Voici le code pour que ca soit plus clair :
$db = mysql_connect('localhost', '', ''); 
mysql_select_db('',$db);

$sql = "SELECT * FROM tbvilles WHERE pays='france' LIMIT 0,4";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 


while($data = mysql_fetch_assoc($req)) 
{  
    // stockage $data dans une nouvelle cellule de $tableau
    $tableau[] = $data; 
} 

    // affichage du résultat
    foreach($tableau as $produit) { 

$cville = $produit['codepos'];
$vnom= $produit['nom'];
include('jour.php'); 
    } 
Là aucun problème ca marche parfaitement : il m'affiche bien le contenu du fichier jour.php pour chaque variable définit avec ma requète. Seulement il m'affiche le contenu les résultats les uns end essous des autres alors que je voudrais faire deux colonnes. Pour ce faire je compte donc rajouter ce code :
    //détermine le nombre de colonnes
  $nbcol=2;

  echo '<table>';
  $nb=count($tableau);
  for($i=0;$i<$nb;$i++){
   
  //les valeurs à afficher
  $valeur1=$tableau[$i]['nom'];

  if($i%$nbcol==0)
  echo '<tr>';
  echo '<td>',$valeur1,'<br/></td>';

  if($i%$nbcol==($nbcol-1))
  echo '</tr>';

  }
  echo '</table>';
?> 

Pris séparément ce code permettant d'afficher en colonnes marche parfaitement seulement lorsque je veux l'appliquer à mon 1er code ca ne fonctionne pas. En fait logiquement pour que ca fonctionne il faudrait que j'attribue à la variable $valeur1 tout ce qui suit :
    foreach($tableau as $produit) { 

$cville = $produit['codepos'];
$vnom= $produit['nom'];
include('jour.php'); 
    }
Mais malgré mes différents essais ca ne marche pas. Pourtant je dois pas être loin c'est dommage. Je ne sais pas trop comment faire autrement car ici ce n'est pas les résultats de ma requète que je veux afficher en colonnes mais les résultats du fichier jour.php qui est en include dans le foreach...

Vous voyiez comment faire ? :(

Posté : 08 oct. 2008, 15:52
par guilt92
Bonjour,

Tu n'as pas besoin d'avoir $valeur1, car tu as déjà $tableau[$i]['nom'] qui sera en fait $vnom à chaque passage du foreach...

Si tu veux tu peux avoir une valeur $i que tu incrémentes à chaque passage du foreach pour calculer les retours à la ligne, ou remplacer le foreach par un for($i=0;$i<count($tableau);$i++) et à ce moment la au lieu d'utiliser $vnom tu utilises $tableau[$i]['nom'].

Mais le vrai problème à mon avis c'est que tu redéfinis les balises <table> et </table> à chaque passage, donc ca pourra pas marcher !
Il faut que <table> et </table> soit en dehors du foreach (ou du for) donc pas dans le fichier jour.php... Sinon tu auras un tableau par résultat....

Posté : 08 oct. 2008, 16:14
par Kayak
He bien en fait à priori c'est exactement ce que je veux faire : avoir un tableau par résultat et classer ces tableaux en deux colonnes.

En fait au lieu de trier les résultats de ma requète en colonnes, c'est les tableaux générés par le fichier jour.php (qui est en include dans le foreach) que je veux trier en colonnes.

Mon foreach appelle le fichier jour.php qui créé un tableau avec les résultats générés par ma requète, puis à droite un second tableau avec les seconds résultats générés par ma requète, puis la même chose à la ligne suivante avec la suite des résultats généras par ma requète. Je sais pas si c'est très clair... :oops:


En gros mon code donnerait ca sauf que je ne sais pas comment implémenter mon foreach avec le tri des colonnes (indiqué en rouge) :

Code : Tout sélectionner

$db = mysql_connect('localhost', '', ''); mysql_select_db('',$db); $sql = "SELECT * FROM tbvilles WHERE pays='france' LIMIT 0,4"; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); while($data = mysql_fetch_assoc($req)) { // stockage $data dans une nouvelle cellule de $tableau $tableau[] = $data; } //détermine le nombre de colonnes $nbcol=2; echo '<table>'; $nb=count($tableau); for($i=0;$i<$nb;$i++){ //les valeurs à afficher $valeur1= [color=red]ICI LOGIQUEMENT $valeur1 SERAIT L'EQUIVALENT DE foreach($tableau as $produit){$cville = $produit['codepos']; vnom= $produit['nom']; include('jour.php'); } [/color] if($i%$nbcol==0) echo '<tr>'; echo '<td>',$valeur1,'<br/></td>'; if($i%$nbcol==($nbcol-1)) echo '</tr>'; } echo '</table>'; ?>

Posté : 08 oct. 2008, 16:22
par Kayak
En fait je ne veux pas trier les résultats de ma requète mais les résultats du foreach : à chaque résultat de ma requète, mon foreach éxécute le fichier jour.php (qui est en include dans le foreach) et créé un "sous-tableau" pour chaque résultat de ma requète.

A Requète -> B résultats de la requète -> C éxécution du fichier jour.php à chaque résultat de la requète -> D Affichage du contenu du fichier jour une ligne en dessous l'autre pour chaque résultat

C'est ce dernier point, D, que je veux trier en colonne et pas le B

Je suis pas sur que ca soit plus clair :D

Posté : 13 oct. 2008, 14:38
par Kayak
J'ai beau essayer des tas de variantes j'ai du mal à m'en sortir, j'arrive pas à obtenir l'affichage en colonnes que je souhaite... Ce que j'ai trouvé de plus approchant donne ça mais c'est pas ce que je veux pour autant :

Code : Tout sélectionner

$db = mysql_connect('localhost', '', ''); mysql_select_db('',$db); $sql = "SELECT * FROM tbvilles WHERE pays='france' LIMIT 0,4"; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); while($data = mysql_fetch_assoc($req)) { // stockage $data dans une nouvelle cellule de $tableau $tableau[] = $data; } //détermine le nombre de colonnes $nbcol=2; echo '<table>'; $nb=count($tableau); for($i=0;$i<$nb;$i++){ if($i%$nbcol==0) echo '<tr>'; echo '<td>; foreach($tableau as $produit){$cville = $produit['codepos']; vnom= $produit['nom']; include('jour.php');} echo </td>'; if($i%$nbcol==($nbcol-1)) echo '</tr>'; } echo '</table>'; ?>

Avec ce code les tableaux générés par le fichier jour.php qui est en include s'affichent de cette facon :

A-A-A-A-A-A-A-A-A
B-B-B-B-B-B-B-B-B
C-C-C-C-C-C-C-C
D-D-D-D-D-D-D-D

Alors que je voudrais simplement qu'ils s'affichent de cette façon :

A-B
C-D

Ca doit pas être compliqué pourtant mais le fait que l'affichage en colonnes s'applique au contenu du fichier jour.php et pas au résultat de ma requète m'embrouille complètement. Quelqu'un voit d'ou vient le problème ? :?

Posté : 13 oct. 2008, 21:48
par Aureusms
Bien même si je n'aime pô l'affichage en tableau... je vais te filer un coup de main :

Bon si A = ['codepos']
et Si B = ['nom']
Je simplifierai comme ceci :
$db = mysql_connect('localhost', '', '');
mysql_select_db('',$db);

$sql = "SELECT * FROM tbvilles WHERE pays='france' LIMIT 0,4";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());


?>
<table>
<?php
while($data = mysql_fetch_assoc($req))
{ 
?>
<tr>
   <td><?php echo $data['codepos']; ?></td>
   <td><?php echo $data['nom']; ?></td>
</tr>
<tr>
   <td><?php include('jour.php'); ?></td> 
</tr>
<?php    
}
?>
</table>


Un autre truc je ne sais pas ce que cela va donner avec include('jour.php');...
Mais je pense que tu devrais t'approcher...

Posté : 14 oct. 2008, 15:24
par Kayak
Merci Aureusms mais ca n'est pas ca que je veux faire. C'est de ma faute, je me suis mal exprimé je sais pas comment expliquer ce que je cherche à faire. Je vais vous montrer ca sera plus simple.


Le fichier jour.php tout seul affiche ca :

http://www.ecovoyages.com/villes/jour.php



Mais ce que je veux faire c'est afficher 4 villes sur la même page c'est pourquoi je fais une requète sur bdd ce qui donne ca :

http://www.ecovoyages.com/villes/tout.php


Sauf qu'ici les 4 tableaux s'affichent les uns en dessous des autres alors que je voudrais qu'ils s'affichent sur deux colonnes :

Cagliari - Palerme
Turin - Venise




C'est tout simple mais je n'y arrive pas...

Voici le code du fichier tout.php qui affiche les 4 tableaux les uns en dessous des autres. J'ai essayé différentes facon d'afficher le résultat en colonnes mais il y a toujours quelque chose qui cloche malheureusement...

Code : Tout sélectionner

$db = mysql_connect('localhost', '', ''); mysql_select_db('',$db); $sql = "SELECT * FROM tbvilles WHERE pays='france' LIMIT 0,4"; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); while($data = mysql_fetch_assoc($req)) { // stockage $data dans une nouvelle cellule de $tableau $tableau[] = $data; } // affichage du résultat foreach($tableau as $produit) { $cville = $produit['codepos']; $vnom= $produit['nom']; include('jour.php'); }

Posté : 14 oct. 2008, 20:41
par Aureusms
C'est pour cela que j'aime pas les tableaux... Dans ton cas, je crois qu'il va falloir changer un peu la méthode : du PHP + HTML + CSS. On va utiliser la propriété float:left; pour mettre la portion crée à côté de l'autre.

Bien commençons. Comme tu restes discret sur ville.php car à mon avis il y a un ch'tite requête à l'intérieur, je vais faire avec les moyens du bords.
Dans ville.php débrouille toi pour afficher ce genre de HTML (je mets les CSS intégré mais tu pourras les sortir par la suite) :

Code : Tout sélectionner

<div style="float: left; border: 1px solid #6699CC; width: 270px; margin-right : 2em;"> <p style="margin: 0; background-color: #FFF; text-align :left; padding-bottom : 2em;"> <strong>Caglari : Peu nuageux </strong> </p> <div style="background-color : #F5F9FC;"> <div style="float:left; width:20%;"> <img src="../pays/img2/29.png" border="0"> <p style="font-weight: bold; margin: 0; padding : 1em 0 1em 0; text-align:center;" class="textBlack2">21°C</p> </div> <div style="width: 79%;"> <p class="textBlack2"> Temp&eacute;rature ressentie: 21°C </p> <p class="textBlack2"> Humidit&eacute; : 83% </p> <p class="textBlack2"> Vent à 11 km/h </p> <p style="padding-top : 1em; "class="textBlack2"> Index UV : 0 </p> <p class="textBlack2"> Protection faible </p> <p style="padding-top : 1em; "class="textBlack2"> Visibilité : 10 km </p> <p class="textBlack2"> Pression : 1019 mbar </p> </div> </div> </div>
Ensuite à chaque modulo pair tu insères cette ligne : <br style="clear:both; />

je crois que c'est cette portion de code :
$sql = "SELECT * FROM tbvilles WHERE pays='france' LIMIT 0,4";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());


$i= 0;
while($data = mysql_fetch_assoc($req))
{ 
    $cville = $produit['codepos'];
    $vnom= $produit['nom'];
    include('jour.php');
    $i++;
    if ($i%2 == 0) echo '<br style="clear:both; />'; 
} 
Ce qui donnera :
La première div avec ta ville Calgary, la deuxième ville, <br style="clear:both; />, troisième ville, quatrième ville.

Il y aura peut être des erreurs de positionnements mais là au moins cela devient beaucoup plus clair que tes tableaux (et en plus cela s'affichera plus vite)

J'espère que tu vas avancer.

Posté : 15 oct. 2008, 00:03
par Kayak
Ha je vois très bien ce que tu veux dire, c'est pas bête en effet. Je suis resté bloqué à essayer de résoudre ca en php, et du coup j'ai pas du tout pensé à combiner ca avec du css, mais effectivement ca serait peut-être plus simple.

Je vais essayer ca demain dès que j'aurais le temps !

Merci pour la piste et le temps que tu as pris pour y réfléchir, je te tiens au courant

:)

Posté : 16 oct. 2008, 12:19
par Kayak
Ca marche parfaitement avec l'ajout des css Aureusms ! J'étais tellement bloqué à le réaliser en php que j'ai pas du tout pensé à combiner les deux mais c'était très judicieux.

Merci pour ton aide et avoir pris le temps de réfléchir à mon pb :)

Posté : 16 oct. 2008, 16:16
par Aureusms
Aucun problème (comme cela tu n'a même plus de tableau :wink: )