Lignes autonomes malgré une boucle php

ViPHP
ViPHP | 5462 Messages

04 janv. 2011, 17:51

$reponse = $bdd->query('SELECT * FROM MATABLE');
et après
foreach ($reponse as $case) {
c'est pas bon, tu fait ton foreach sur le statement mais pas sur les résultat

il va falloir rajouter un fetchAll ou faire un while sur les fetch

Eléphanteau du PHP | 18 Messages

04 janv. 2011, 23:00

Merci, ce code semble fonctionner correctement (sous réserve du problème des fetch ??) En tout cas il fonctionne, mais j'ai cherché à l'adapter un peu, en essayant 2 modifications:

1/ Je voulais afficher uniquement les données du champ "chose", et pas tout (*)... Je pense l'avoir fait correctement en remplaçant * par CHOSE (rigolez pas, il a fallu que je me pose la question quand même !!)

2/ Je voulais afficher en commençant le tout sur la 1ère ligne, alors que pour le moment il affiche tout à partir de la 1ère case, mais à la verticale dans la 1ère colonne:
Voici ce que j'ai essayé de faire, pour qu'il commence en ligne dès la 1ère case:
<?php

// On se connecte à MySQL

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;

$bdd = new PDO('mysql:host=localhost;dbname=MABASE', 'root', '', $pdo_options);



// On récupère tout le contenu de la table MATABLE

$req = $bdd->prepare('SELECT CHOSE FROM MATABLE');

$req->execute();

$reponse = $req->fetchAll(); //lire tous les résultats de la requête dans un tableau $reponse



$nbcolonnes = 10;

$nblignes = 100;



echo '<table>'; //début de la table HTML











for ($ligne = 0; $ligne<$nblignes; $ligne++) {

    echo '<tr>'; //début de la ligne Table HTML

    if (isset($reponse[$ligne])) {
echo $case = $reponse[$ligne]; 
}
else $case = null; 





   for ($colonne=0; $colonne<$nbcolonnes; $colonne++){

       echo '<td>'; 

       if (isset($case[$colonne]))  $case = $reponse[$colonne]; else $case = null;

            

       echo '</td>'; //fin de la cellule Table HTML

    }

   echo '</tr>'; //fin de la ligne Table HTML

}



echo '</table>';  //fin de la Table HTML



?>
Je pense que j'y suis presque (grâce à votre aide !!), mais il m'affiche, hors des cases du tableau, 'array array array array array array' (à la suite sur une ligne), et je crois que c'est parce que j'ai mal défini quelque chose dans les crochets, mais je ne sais pas vraiment où !!!

@+

Alex

ViPHP
ViPHP | 5462 Messages

04 janv. 2011, 23:10

$nblignes = 100;
ca te sert pas a grand chose utilise LIMIT de mysql

ici
for ($ligne = 0; $ligne<$nblignes; $ligne++) 
utilise plutôt le foreach sur $reponse ca sera plus simple, et grace a la clé du tableau tu va pouvoir faire un modulo

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

05 janv. 2011, 11:11

Bonjour,

Pour n'afficher que le champ CHOSE, il faut déplacer la lecture des lignes du résultat de la requête dans la boucle FOR de $colonne. C'est logique, puisque tu veux afficher les enregistrements du champ 'CHOSE' du tableau $reponse par colonne.
On laisse alors les boucles $ligne et $colonne indépendante du déroulement du tableau $reponse, car ces boucles affiche l'ossature du tableau HTML sans se soucier qu'il y'ait des données à afficher. Et on ajoutera un compteur indépendant $i pour dérouler le tableau $reponse et ce dans la boucle des colonnes pour afficher les enregistrements par colonne.

Voici la modification :
<?php
// On se connecte à MySQL
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=MABASE', 'root', '', $pdo_options);

// On récupère tout le contenu de la table MATABLE
$req = $bdd->prepare('SELECT CHOSE FROM MATABLE');
$req->execute();
$reponse = $req->fetchAll(); //lire tous les résultats de la requête dans un tableau $reponse

$nbcolonnes = 10;
$nblignes = 5;
$i = 0; //compteur d'enregistrements du tableau $reponse

echo '<table>'; //début de la table HTML

for ($ligne = 0; $ligne<$nblignes; $ligne++) {
    echo '<tr>'; //début de la ligne Table HTML
    for ($colonne=0; $colonne<$nbcolonnes; $colonne++){
       echo '<td>';

       if (isset($reponse[$i])) { $case = $reponse[$i]; } else $case = null;  //lire l'enregistrement $reponse dans $case
       if (isset($case['CHOSE']))  echo $case['CHOSE'];  //Afficher la donnée de la colonne 'CHOSE'
       $i ++;  //incrémenter le compteur d'enregistrements

       echo '</td>'; //fin de la cellule Table HTML
    }
   echo '</tr>'; //fin de la ligne Table HTML
}
echo '</table>';  //fin de la Table HTML
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

ViPHP
ViPHP | 5462 Messages

05 janv. 2011, 11:39

c'est parait bien compliqué pour pas grand chose je ferais plus un truc du style
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=mabase', 'root', '', $pdo_options);

$req = $bdd->prepare('SELECT `case` FROM `mabase` LIMIT 100');
$req->execute();
$reponse = $req->fetchAll();

$nbcolonnes = 10;
$nbresult = $req->rowCount();

echo "<table>\n";

foreach($reponse as $id => $item)
{
    if(($id % $nbcolonnes) === 0)
    {
        echo "\t<tr>\n";
    }
    
    echo "\t\t<td>", $item['case'], "</td>\n";

    if((($id + 1 + $nbcolonnes) % $nbcolonnes) === 0 || ($id + 1) === $nbresult)
    {
        echo "\t</tr>\n";
    }
}
echo '</table>';

Eléphanteau du PHP | 18 Messages

05 janv. 2011, 13:56

Bonjour !

J'ai essayé les 2 codes pour voir ce que ça donne:

* Le 1er code (Sadeq)
Il est génial car il me permet d'afficher le nombre de case que je veux, qu'elles soient pleines ou vides lorsqu'il n'y a pas de donnée dans la base,
Et je crois avoir compris sa structure et son fonctionnement, enfin presque... En effet, ce code m'affiche systématiquement 'array' avant chaque donnée inscrite dans chaque case, et je ne trouve pas comment empêcher cela pour qu'il n'affiche que la donnée (et sans array devant)...
--> J'ai certainement oublié de mettre des ' ' dans un [ ], mais je ne sais pas où !!

* Le 2nd code (Stealth35)
A vous lire, il aurait l'avantage d'être plus léger...
Mais je rencontre 2 difficultés avec ce code:
1/ Il ne me permet pas de déterminer le nombre de lignes voulu, et je n'ai pas réussi à le modifier correctement pour qu'il le fasse
2/ Je dois avouer avoir quelques difficultés pour le comprendre (vous en faites pas, c'est moi et mon niveau en php !!)

Voilà... Si il est préférable que j'utilise ce 2nd code car plus simple (donc plus léger et rapide), j'aimerais arriver à le comprendre...

Que pourrais je faire pour adapter le 2nd pour qu'il affiche le nombre de lignes que je veux, à la manière du 1er code ?
En fait je ne pense pas avoir besoin de la fonction LIMIT (simplement j'avais changé à 100 juste pour voir :) ... je l'ai ramené à 5). Ce que je voudrais pouvoir faire, c'est justement pouvoir déterminer dans le code, qu'il y aura 'n' lignes de toutes façons (et après que les cases soient remplies si il y a des données dans la table, ou qu'elles soient vides si la table ne contient pas de données dans le champ demandé).

En tout cas, merci pour vos réponses utiles !!

Alex

ViPHP
ViPHP | 5462 Messages

05 janv. 2011, 14:18

tu veux juste faire un un tableau de X ligne de Y colonne et Z valeurs suivant la base ? ou un nombre de case ?
le limit va te te permettre de prendre le bon nombre de résultats, si ton tableau a 25 case c'est ridicule d'aller chercher tout les résultats de la base.

EDIT : voila, tu choisies juste $nbcolonnes et $nblignes, le reste se fait tout seul, et il ira pas en chercher plus dans la base :wink:
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);

$nbcolonnes = 5;
$nblignes   = 2;

$req = $bdd->prepare('SELECT `value` FROM `tokens` LIMIT ?');
$req->bindValue(1, $nbcolonnes * $nblignes, PDO::PARAM_INT);
$req->execute();

$reponse = $req->fetchAll();

echo "<table>\n";

foreach($reponse as $id => $item)
{
    if(($id % $nbcolonnes) === 0)
    {
        echo "\t<tr>\n";
    }
   
    echo "\t\t<td>", $item['value'], "</td>\n";

    if((($id + 1 + $nbcolonnes) % $nbcolonnes) === 0 || ($id + 1) === $req->rowCount())
    {
        echo "\t</tr>\n";
    }
}
echo '</table>';

Eléphanteau du PHP | 18 Messages

05 janv. 2011, 14:51

Merci,

En fait, ce que je cherche à faire doit vous sembler inutile... Mais c'est ce dont j'ai besoin, j'ai dû mal vous présenter mon objectif :oops: :

Je voudrais afficher le tableau, avec 10 colonnes, et 'n' lignes, qu'il y ait ou non des données correspondantes dans MySQL à afficher: Si il y a des données à afficher dans ces cases, alors elles s'affichent. Et si il n'y a pas de données, alors les cases du table html n'affichent rien (et restent vides)...

Mais j'ai besoin que la structure table html apparaisse dans tous les cas, avec le nombre de lignes que je fixe dans le code à la variable $nblignes par exemple...
Ce dernier code php a l'air très léger, et une modification (mais laquelle) devrait suffire pour faire cela

Thx !!

Alex

ViPHP
ViPHP | 5462 Messages

05 janv. 2011, 15:07

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);

$nbcolonnes = 10;
$nblignes   = 5;
$nbmax      = $nbcolonnes * $nblignes;

$req = $bdd->prepare('SELECT `value` FROM `tokens` LIMIT ?');
$req->bindValue(1, $nbmax, PDO::PARAM_INT);
$req->execute();

echo "<table>\n";

for($i = 0; $i < $nbmax; ++$i)
{
    if(($i % $nbcolonnes) === 0)
    {
        echo "\t<tr>\n";
    }
   
    $item = $req->fetch();
    echo "\t\t<td>", $item['value'], "</td>\n";

    if((($i + 1 + $nbcolonnes) % $nbcolonnes) === 0)
    {
        echo "\t</tr>\n";
    }
}
echo '</table>';
Modifié en dernier par stealth35 le 05 janv. 2011, 21:39, modifié 1 fois.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

05 janv. 2011, 15:17

Dans mon code, il t'affiche un 'array' car il y avait une instruction 'echo' qui trainait là où il faut pas dans la ligne:
if (isset($reponse[$i])) { echo $case = $reponse[$i]; } ....
voici le correctif:
<?php
// On se connecte à MySQL
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=MABASE', 'root', '', $pdo_options);

// On récupère tout le contenu de la table MATABLE
$req = $bdd->prepare('SELECT CHOSE FROM MATABLE');
$req->execute();
$reponse = $req->fetchAll(); //lire tous les résultats de la requête dans un tableau $reponse

$nbcolonnes = 10;
$nblignes = 5;
$i = 0; //compteur d'enregistrements du tableau $reponse

echo '<table>'; //début de la table HTML

for ($ligne = 0; $ligne<$nblignes; $ligne++) {
    echo '<tr>'; //début de la ligne Table HTML
    for ($colonne=0; $colonne<$nbcolonnes; $colonne++){
       echo '<td>';

       if (isset($reponse[$i])) { $case = $reponse[$i]; } else $case = null;  //lire l'enregistrement $reponse dans $case
       if (isset($case['CHOSE']))  echo $case['CHOSE'];  //Afficher la donnée de la colonne 'CHOSE'
       $i ++;  //incrémenter le compteur d'enregistrements

       echo '</td>'; //fin de la cellule Table HTML
    }
   echo '</tr>'; //fin de la ligne Table HTML
}
echo '</table>';  //fin de la Table HTML
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 18 Messages

05 janv. 2011, 18:23

Merci pour l'info !!

Les 2 codes fonctionnent, et je vais donc les étudier pour comprendre leur mécanisme et m'en inspirer pour d'autres choses éventuellement (ou en tout cas essayer... non ne rigolez pas s'il vous plaît !)

Ils font tous les 2 exactement ce que je recherche, sauf que:
Le 1er (celui de Stealth35) affiche bien toutes les cases (grâce à variable $nblignes) comme je voulais, mais elles sont systématiquement vides, même lorsque la DB contient des données...
J'ai fait plusieurs essais, mais je n'arrive pas à obtenir l'affichage des données dans les cases concernées...

Est ce que j'ai fait une erreur quelque part en faisant une modification ??
<?php



$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;

$bdd = new PDO('mysql:host=localhost;dbname=MABASE', 'root', '', $pdo_options);



$nbcolonnes = 10;

$nblignes   = 10;

$nbmax      = $nbcolonnes * $nblignes;



$req = $bdd->prepare('SELECT * FROM `MATABLE` LIMIT ?');

$req->bindValue(1, $nbmax, PDO::PARAM_INT);



echo "<table>\n";



for($i = 0; $i < $nbmax; ++$i)

{

    if(($i % $nbcolonnes) === 0)

    {

        echo "\t<tr>\n";

    }

   

    $item = $req->fetch();

    echo "\t\t<td>", $item['CHOSE'], "</td>\n";



    if((($i + 1 + $nbcolonnes) % $nbcolonnes) === 0)

    {

        echo "\t</tr>\n";

    }

}

echo '</table>';

?>
Alex

ViPHP
ViPHP | 5462 Messages

05 janv. 2011, 18:27

t'es sur de ta requête ?
que donne
$item = $req->fetch();
var_dump($item);

Eléphanteau du PHP | 18 Messages

05 janv. 2011, 19:23

var_dump($item); me renvoie bool(false) 100 fois (nombre de cases dans mon exemple), et tout est placé hors du tableau, au dessus de la 1ère ligne...

Donc ma requête est certainement fausse, mais je ne vois pas où car mes instructions me semblaient pourtant correctes, après re vérification...

Alex

ViPHP
ViPHP | 5462 Messages

05 janv. 2011, 20:28

var_dump($item); me renvoie bool(false) 100 fois (nombre de cases dans mon exemple), et tout est placé hors du tableau, au dessus de la 1ère ligne...

Donc ma requête est certainement fausse, mais je ne vois pas où car mes instructions me semblaient pourtant correctes, après re vérification...

Alex
quand tu fait la requete dans phpmyadmin en remplaçant le ? par 10 par exemple c'est bon ?

Eléphanteau du PHP | 18 Messages

05 janv. 2011, 21:17

Quand j'entre la requête directement dans MySQL:
$req = $bdd->prepare('SELECT * FROM MATABLE LIMIT 10')
SQL me renvoie un message d'erreur: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '$req = $bdd->prepare('SELECT * FROM MATABLE LIMIT 10')' at line 1

C'est curieux parce que mes autres requêtes via php étaient similaires et fonctionnaient bien !!

Alex
Modifié en dernier par swampsong le 05 janv. 2011, 21:29, modifié 1 fois.