Création d'un tableau avec PHP et MySQL

Ce topic a été résolu
t0maaah

t0maaah Le 31 juillet 2020 à 00:12

Bonjour à tous, je viens vers vous car cela fait plusieurs jours maintenant que je bloque sur un problème. La création d'un tableau à deux colonnes avec 5 lignes maximum (titre non compris). La version actuel, en HTML/CSS est nickel, mais j'essaie de migré en PHP et je me retrouve coincé avec ce tableau.

Voici ce à quoi il ressemble :

Et voici les cellules en HTML :

<tr>
    <td class="table-positif-cellule">Dark Vador !</td>
    <td class="table-negatif-cellule">Absence de bandeau déroulant en ouverture du film</td>
</tr>

<tr>
    <td class="table-positif-cellule">La bataille finale (surtout la bataille spatiale)</td>
    <td class="table-negatif-cellule">Rythme lent durant les premières 30 minutes</td>
</tr>

<tr>
    <td class="table-positif-cellule">La mis en scène de l’immensité</td>
    <td class="table-vide"></td>
</tr>

<tr>
    <td class="table-positif-cellule">Le retour de certains personnages de la saga</td>
    <td class="table-vide"></td>
</tr>

Dans ma base de données, j'ai une table 'positives' et 'negatives', le tout lié à l'id d'une table 'reviews'.

Mon but final est d'avoir le même tableau, mais alimenté par ma bdd. J'espère que j'ai été assez clair, merci d'avance pour votre aide.

t0maaah

t0maaah Le 3 août 2020 à 12:35

Pas de soucis, je vais tester tout cela et je reviendrais donner de mes nouvelles :) Encore merci pour ton aide et les "petites" leçons qui m'en apprennent beaucoup (genre le PDO::FETCH_COLUMN, l'utilisation du isset pour le résultat, etc.) !

Merci et à bientôt ! :)

Meilleure réponse
PrimFX

PrimFX Le 2 août 2020 à 16:17

Bonjour @t0maaah !

As-tu déjà commencé / fait certains tests en PHP ? Si oui, n'hésite pas à nous les partager dans un prochain post !

Je t'invite également à nous partager une capture d'écran de la structure de tes tables 'positives' et 'negatives' pour que nos échanges à propos de ton code soient cohérents avec l'architecture de ta base de données 😉

De manière générale, la structure en tableau HTML pose le souci suivant : l'affichage se fait par lignes et non par colonnes. Autrement dit, tu ne peux pas faire une boucle sur les avis positifs puis une boucle sur les avis négatifs à la suite. Il faut obligatoirement que les deux se fassent en parallèle.

Tu as ici deux possibilités :

  • Soit il faut songer à passer d'un tableau HTML à des blocs de contenu; par exemple deux <div> côte à côte contenant chacune une liste à puce <ul><li>... : l'avantage de cette technique est que tu pourras faire deux boucles PHP très simples sur tes avis positifs et négatifs
  • Soit il faut rester avec ta structure HTML en tableau, auquel cas il faudrait utiliser une petite astuce pour qu'il y ait autant de lignes dans ton tableau que le maximum d'éléments soit dans les avis positifs soit dans ceux négatifs

En conservant ton code HTML, voici un exemple de ce qui pourrait fonctionner en PHP :

<?php

// On suppose que tu as récupéré tous les avis positifs & négatifs dans deux tableaux séparés depuis ta base de données
$positifs = ['Dark Vador !', 'La bataille finale', 'La mise en scène', 'Le retour de certains personnages de la saga'];
$negatifs = ['Absence de bandeau déroulant en ouverture du film', 'Rythme lent durant les premières 30 minutes'];

// Contient le nombre maximal de lignes nécessaires dans ton tableau
$maxLignes = max(count($positifs), count($negatifs));

?>

<table>

<tr>
    <td class="table-positif-cellule">Positif</td>
    <td class="table-negatif-cellule">Négatif</td>
</tr>

<?php for ($i = 0; $i < $maxLignes; $i++): ?>
    <tr>
        <td class="table-positif-cellule"><?= isset($positifs[$i]) ? $positifs[$i] : '' ?></td>
        <td class="table-negatif-cellule"><?= isset($negatifs[$i]) ? $negatifs[$i] : '' ?></td>
    </tr>
<?php endfor ?>

</table>

Tu noteras ici l'utilisation du isset() qui vérifie à chaque itération si l'index existe bien ou non. En effet, puisqu'on a besoin d'aller jusqu'à un nombre de lignes potentiellement plus grand qu'un des deux tableaux $positifs ou $negatifs, le isset() permet de s'assurer que l'élément existe bien dans le tableau (dans le cas contraire, une cellule vide sera affichée).

Évidemment, tu peux également afficher une cellule <td> sans classe pour ne pas avoir de fond coloré sur tes cellules vides par exemple !

En espérant avoir pu t'aider ou au moins te donner quelques pistes de réflexion 😉

A bientôt,

PrimFX

t0maaah

t0maaah Le 3 août 2020 à 12:10

Déjà merci pour ta réponse @PrimFX ! J’ai effectivement fait plusieurs tests en PHP et ces derniers, ce sont avérés peu concluant. J’ai testé des “while” imbriqué et forcément, ça n’a pas marché, j’ai testé avec des “if”, des “for”, parfois les trois en même temps, mais je pense avoir fini par me mélanger les pinceaux au fil des jours… J’ai même fait un test avec une autre table qui regroupe les avis positifs et négatifs en une seule, la différence étant que j’avais ajouté un champ “type” qui contenait soit “Positive”, soit “Negative”.

Comme demander, voici la structure de mes tables :

Positives : positives

Negatives : negatives

Et voici mon dernier code en date :

<?php
//Connexion à la base données
include("../includes/bdd.php");

$getId = 1;

//Récupération du ou des point(s) positif(s)
$positives = $bdd->prepare('SELECT positives.libelle FROM positives WHERE positives.review_id = ?');
$positives->execute(array($getId));
$positive = $positives->fetchAll();

//Récupération du ou des point(s) négatif(s)
$negatives = $bdd->prepare('SELECT negatives.libelle FROM negatives WHERE negatives.review_id = ?');
$negatives->execute(array($getId));
$negative = $negatives->fetchAll();

?>
<table border="1">
    <?php
    foreach ($positive as $key => $value) {
        if ($key % 2 == 0) {
            ?>
            <tr>
            <?php
            if ($value == "") {
                ?>
                <td>????</td>
                <?php
            } else {
                ?>
                <td><?php echo $value['libelle'] ?></td>
            </tr>
            <?php
            }
        }

        if ($key % 2 != 0) {
            ?>
            <tr>
            <?php
            if ($value == "") {
                ?>
                <td>????</td>
                <?php
            } else {
                ?>
                <td><?php echo $value['libelle'] ?></td>
            </tr>
            <?php
            }
        }        
    }

    ?>
</table>
<?php
?>

Le résultat : Résulat 1

Histoire d'être complet, voici ma deuxième méthode :

La table positives_negatives : positives_negatives

Le code :

<?php
//Connexion à la base données
include("../includes/bdd.php");

$getId = 1;

//Récupération du ou des point(s) positif(s)
$positivesNegatives = $bdd->prepare('SELECT positives_negatives.libelle, positives_negatives.type FROM positives_negatives WHERE positives_negatives.review_id = ?');
$positivesNegatives->execute(array($getId));
$positiveNegative = $positivesNegatives->fetchAll();

?>
<table border="1">
    <?php
    foreach ($positiveNegative as $key => $value) {
        if ($key % 2 == 0) {
            ?>
            <tr>
            <?php
            if ($value == "") {
                ?>
                <td>????</td>
                <?php
            } else {
                ?>
                <td><?php echo $value['libelle'] ?></td>
            </tr>
            <?php
            }
        }

        if ($key % 2 != 0) {
            ?>
            <tr>
            <?php
            if ($value == "") {
                ?>
                <td>????</td>
                <?php
            } else {
                ?>
                <td><?php echo $value['libelle'] ?></td>
            </tr>
            <?php
            }
        }        
    }

    ?>
</table>
<?php
?>

Le résultat : Résulat 2

J'espère que ces précisions seront utiles. En tout cas, ton aide l'est beaucoup, merci ! :)

Je vais tout de suite tester tes solutions proposées !

PrimFX

PrimFX Le 3 août 2020 à 12:22

Hello @t0maaah,

De rien, content que ma réponse ait pu t'aider 😉

Pour les tables, je pense effectivement que de tout regrouper en une seule table est un peu plus propre. Tu peux par contre toujours récupérer tes avis positifs et négatifs dans deux tableaux séparés (avec deux requêtes SQL par exemple) :

<?php
//Connexion à la base données
include("../includes/bdd.php");

$getId = 1;

// Récupération des points positifs dans le tableau $positives
$positives = $bdd->prepare("SELECT libelle FROM positives_negatives WHERE `type` = 'positive' AND review_id = ?");
$positives->execute(array($getId));
$positives = $positives->fetchAll(PDO::FETCH_COLUMN);

// Récupération des points négatifs dans le tableau $negatives
$negatives = $bdd->prepare("SELECT libelle FROM positives_negatives WHERE `type` = 'negative' AND review_id = ?");
$negatives->execute(array($getId));
$negatives = $negatives->fetchAll(PDO::FETCH_COLUMN);

Petites précisions :

  • J'ai placé "type" entre `...` pour que ce soit bien "la colonne type" de ta table qui soit considérée et non le mot-clé SQL type (qui est un mot-clé réservé)
  • L'utilisation de PDO::FETCH_COLUMN dans le fetchAll() permet de retourner toutes les lignes dans un tableau à une dimension, c'est-à-dire dans le même format que j'ai utilisé dans l'exemple de ma précédente réponse

Je te laisse tester avec les solutions que je t'ai proposées, n'hésite pas à poster ce que tu obtiens comme résultat et/ou si tu as des questions 😉

A bientôt,

PrimFX

t0maaah

t0maaah Le 3 août 2020 à 12:35

Pas de soucis, je vais tester tout cela et je reviendrais donner de mes nouvelles :) Encore merci pour ton aide et les "petites" leçons qui m'en apprennent beaucoup (genre le PDO::FETCH_COLUMN, l'utilisation du isset pour le résultat, etc.) !

Merci et à bientôt ! :)

Meilleure réponse
t0maaah

t0maaah Le 3 août 2020 à 13:00

Me revoilà avec une très bonne nouvelle ! @PrimFX tes solutions proposées on était au top !

Voici le code (avec mon css pour voir le résulat voulu) :

<?php
//Connexion à la base données
include("../includes/bdd.php");

$getId = 1;

// Récupération des points positifs dans le tableau $positives
$positives = $bdd->prepare("SELECT libelle FROM positives_negatives WHERE `type` = 'positive' AND review_id = ?");
$positives->execute(array($getId));
$positives = $positives->fetchAll(PDO::FETCH_COLUMN);

// Récupération des points négatifs dans le tableau $negatives
$negatives = $bdd->prepare("SELECT libelle FROM positives_negatives WHERE `type` = 'negative' AND review_id = ?");
$negatives->execute(array($getId));
$negatives = $negatives->fetchAll(PDO::FETCH_COLUMN);

// Contient le nombre maximal de lignes nécessaires dans ton tableau
$maxLignes = max(count($positives), count($negatives));

?>

<!DOCTYPE html>
<html lang="fr" id="page-top">

<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

    <!-- CSS -->
    <link rel="stylesheet" href="../css/style.css">
</head>

<table class="table table-note">
    <thead>
        <tr>
            <th scope="col" class="table-positif-head">Positif</th>
            <th scope="col" class="table-negatif-head">Négatif</th>
        </tr>
    </thead>

    <tbody>
        <?php for ($i = 0; $i < $maxLignes; $i++) : ?>
            <tr>
                <?php
                if (isset($positives[$i])) {
                    ?>
                    <td class="table-positif-cellule"><?php echo $positives[$i] ?></td>
                    <?php
                } else {
                    ?>
                    <td class="table-vide"></td>
                    <?php
                }

                if (isset($negatives[$i])) {
                    ?>
                    <td class="table-negatif-cellule"><?php echo $negatives[$i] ?></td>
                    <?php
                } else {
                    ?>
                    <td class="table-vide"></td>
                    <?php
                }
                ?>
            </tr>
        <?php endfor ?>
    </tbody>
</table>

Et voici le résultat : Résultat final

Le résultat est parfait ! Je suis tellement heureux et soulagé, cela faisait une semaine que je bloquais sur ce problème et je me rends compte que mes problèmes étaient un manque de connaissances sur certains points en PHP et un manque de logique parfois.

Encore merci mille fois ! :D

PrimFX

PrimFX Le 3 août 2020 à 13:08

Bien joué @t0maaah 😃 🚀 Super que tout fonctionne comme tu le voulais !

Au passage, n'hésite pas à passer le topic en "Résolu" 😉

A bientôt,

PrimFX

Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte