Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment afficher les albums d'images dans les publications ? [en utilisant PHP et MYSQL uniquement]

Votre première requête SQL est correcte, mais pour la seconde, vous ne souhaitez sélectionner que les images pour le message actuel (ligne) dans la boucle while externe, donc la deuxième requête SQL doit être :

"SELECT img_file, img_title FROM images WHERE post_id = $row[id_post]"

Mise à jour pour afficher uniquement img3 de post1 :

<!DOCTYPE html>
<html>
<body>
<?php
$db = mysqli_connect("localhost", "root", "", "post_images");    

$result = mysqli_query($db, "SELECT * FROM posts");
while ($row = mysqli_fetch_array($result)) {
   echo "<div class=\"post_container\">";
     echo $row['post_title'];
     echo "<div class=\"image_container\">";

    if ($row['id_post'] == 1) {
        $resultx = mysqli_query($db, "SELECT img_file, img_title FROM images WHERE post_id = " .$row['id_post']. " AND img_title = 'img3'");
    } else {
        $resultx = mysqli_query($db, "SELECT img_file, img_title FROM images WHERE post_id = " .$row['id_post']);
    }

     if(mysqli_num_rows($resultx) > 0) {
     while ($rowx = mysqli_fetch_array($resultx)) {
        echo "<img src='../folder_image_uploads/".$rowx['img_file']."' >";
        echo $rowx['img_title'];
        }
     }
     echo "</div>";
   echo "</div>";
}
?>
</body
</html>

J'ai placé la deuxième requête SQL dans une instruction if, qui vérifie si l'identifiant du message actuel est égal à 1. Si c'est le cas, la requête SQL ne sélectionne que la ligne contenant "img3". (Et si ce n'est pas le cas, il exécute la requête SQL précédente qui sélectionne toutes les lignes.)

Bien sûr, cela ne fonctionne que si vous connaissez l'identifiant du message et le titre de l'image que vous souhaitez afficher. Une solution plus générique pour toujours afficher uniquement la troisième image du premier message serait quelque chose comme ceci :

<!DOCTYPE html>
<html>
<body>
<?php
$db = mysqli_connect("localhost", "root", "", "post_images");    

$result = mysqli_query($db, "SELECT * FROM posts ORDER BY id_post");
$rows = mysqli_fetch_all($result,MYSQLI_ASSOC);
foreach ($rows as $key => $value)
   echo "<div class=\"post_container\">";
     echo $row['post_title'];
     echo "<div class=\"image_container\">";

    if ($key == 0) {
        $resultx = mysqli_query($db, "SELECT img_file, img_title FROM images WHERE post_id = " .$row['id_post']. " ORDER BY id_img LIMIT 1 OFFSET 2");
    } else {
        $resultx = mysqli_query($db, "SELECT img_file, img_title FROM images WHERE post_id = " .$row['id_post']);
    }

     if(mysqli_num_rows($resultx) > 0) {
     while ($rowx = mysqli_fetch_array($resultx)) {
        echo "<img src='../folder_image_uploads/".$rowx['img_file']."' >";
        echo $rowx['img_title'];
        }
     }
     echo "</div>";
   echo "</div>";
}
?>
</body
</html>

Ici, j'ai stocké le résultat complet de la première requête SQL dans un tableau, car les clés du tableau correspondent alors au numéro de chaque message moins un. Si $key =0, la ligne actuelle est le premier article, puis nous utilisons la requête SQL qui sélectionne uniquement la troisième image de la table des images. Si $key n'est pas 0, nous utilisons l'autre requête SQL qui sélectionne toutes les images.

Dans la nouvelle requête SQL, LIMIT 1 signifie sélectionner 1 seule ligne et OFFSET 2 signifie commencer par la ligne 3 (le comptage commence à 0, donc l'offset 2 renvoie la ligne 3).

J'ai ajouté ORDER BY id_img pour m'assurer que les images sont toujours renvoyées dans le même ordre, l'ordre dans lequel elles ont été ajoutées à la base de données. (Et j'ai fait la même chose avec id_post dans la première requête.)