Je cherche un moyen pour afficher un tableau croisé dynamique. La particularité est donc que je ne sais ni le nom des champs ni le nombre de colonnes ou de lignes.
Voici la requête SQL :
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT('COUNT(CASE WHEN VLT.Lieux = ''', VLT.Lieux, ''' THEN IDR ELSE NULL END) AS `', DC_Lieux.Nom, '`')) INTO @sql
FROM DC_V_Resume_Lieux_Types VLT
INNER JOIN DC_Lieux ON VLT.Lieux = DC_Lieux.Id;
SET @sql
= CONCAT('SELECT DC_Types.Nom AS Types,COUNT(IDR) AS Total,', @sql, 'FROM DC_V_Resume_Lieux_Types VLT INNER JOIN DC_Types ON VLT.Types = DC_Types.Id INNER JOIN DC_Lieux ON VLT.Lieux = DC_Lieux.Id GROUP BY DC_Types.Nom');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Voici un visuel dans PhpMyAdmin du résultat :
Pour afficher le résultat dans une page PHP, je me suis inspiré de ce sujet, de celui-ci ou encore de celui-là. Voici le début de ma requête :
Warning: Illegal string offset 'name' in C:\wamp64\www\Site DVL Phase 3\DOC200807-TYP.php on line 70
Et enfin si je mets ceci (que j'ai pris sur le premier lien cité ci-dessus) qui me conviendrait le mieux du point de vue du principe :
foreach ($req as $valeur)
{
echo '<tr>';
for ($i=0; $i<count($valeur); $i++)
{
echo '<td>'.$valeur[$i].'</td>';
}
echo '</tr>';
}
Il affiche la première ligne et l'erreur :
Notice: Undefined offset: 18 in C:\wamp64\www\Site DVL Phase 3\DOC200807-TYP.php on line 56
En cherchant un peu, j'ai vu que l'erreur "offset" indiquant qu'on avait atteint la valeur $i, mais je n'arrive pas à comprendre comment c'est possible puisque il n'a pas affiché toutes les lignes...
Est-ce que quelqu'un pourrait, s'il vous plaît, m'orienter vers une piste pour résoudre ce problème. J'ai un peu de mal, malgré les liens consultés, à concevoir une logique pour afficher un tableau "dont on ne sait rien".
Multiplié par 23 lignes. Je comprends mieux le message d'erreur : il y a 18 colonnes (de 0 à 17) et il ne trouve pas la suivante.
Mais j'ai du mal à voir comment je peux faire pour qu'il passe à la ligne suivante. J'ai essayé de faire une boucle avec un fetch, mais cela ne fonctionne pas non plus.
Problème quasi-résolu... C'est en cherchant des réponses sur le rowCount(); que j'ai finalement trouvé le moyen d'afficher tous mes résultats, grâce à ce lien. (une sorte de sérendipité :))
En fait je restais bloqué au niveau for() voulant afficher ligne par ligne. Et l'imbrication de deux foreach me paraissait improbable mais je comprends la logique du code maintenant.
Pour le rowCount(), c'est un peu plus compliqué. La doc déconseille son utilisation avec SELECT et recommande un SELECT COUNT(*) avec un fetchColumn. Sauf que si je rajoute un COUNT(*) dans ma requête, vu que c'est dynamique, cela va rajouter automatiquement une colonne. Ou alors il faut préciser dans les foreach() de ne pas prendre la première colonne, mais là je c'est, à mon sens, bien au-dessus de mes compétences.
Merci pour la suggestion, je vais la faire. Mais je trouve cela bête de devoir faire deux requêtes parce que le rowCount() n'est pas "aux normes" de PHP, surtout que cela fonctionne.
Merci pour ton aide.
Afficher un tableau croisé dynamique
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales