Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie zeige ich Bildalben in Beiträgen an? [nur mit PHP und MYSQL]

Ihre erste SQL-Abfrage ist in Ordnung, aber für die zweite möchten Sie nur die Bilder für den aktuellen Beitrag (Zeile) in der äußeren While-Schleife auswählen, also sollte die zweite SQL-Abfrage lauten:

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

Update, um nur Bild3 von Post1 anzuzeigen:

<!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>

Ich habe die zweite SQL-Abfrage in eine if-Anweisung eingefügt, die überprüft, ob die ID des aktuellen Beitrags gleich 1 ist. Wenn dies der Fall ist, wählt die SQL-Abfrage nur die Zeile mit "img3" darin aus. (Und wenn nicht, wird die vorherige SQL-Abfrage ausgeführt, die alle Zeilen auswählt.)

Dies funktioniert natürlich nur, wenn Sie die ID des Beitrags und den Titel des Bildes kennen, das Sie anzeigen möchten. Eine allgemeinere Lösung, um immer nur das dritte Bild des ersten Beitrags anzuzeigen, wäre etwa so:

<!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>

Hier habe ich das gesamte Ergebnis der ersten SQL-Abfrage in einem Array gespeichert, denn dann entsprechen die Schlüssel des Arrays der Nummer jedes Posts minus eins. Wenn $key =0 ist, ist die aktuelle Zeile der erste Beitrag und dann verwenden wir die SQL-Abfrage, die nur das dritte Bild aus der Bildertabelle auswählt. Wenn $key nicht 0 ist, verwenden wir die andere SQL-Abfrage, die alle Bilder auswählt.

In der neuen SQL-Abfrage bedeutet LIMIT 1, dass nur 1 Zeile ausgewählt wird, und OFFSET 2 bedeutet, mit Zeile 3 zu beginnen (die Zählung beginnt bei 0, sodass Offset 2 Zeile 3 zurückgibt).

Ich habe ORDER BY id_img hinzugefügt, um sicherzustellen, dass Bilder immer in derselben Reihenfolge zurückgegeben werden, der Reihenfolge, in der sie der Datenbank hinzugefügt wurden. (Und ich habe dasselbe mit id_post in der ersten Abfrage gemacht.)