sql >> Databasteknik >  >> RDS >> Mysql

Hur visar man bildalbum i inlägg? [använder endast PHP och MYSQL]

Din första SQL-fråga är bra, men för den andra vill du bara välja bilderna för det aktuella inlägget (raden) i den yttre while-slingan, så den andra SQL-frågan bör vara:

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

Uppdatering för att endast visa img3 av 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>

Jag har placerat den andra SQL-frågan i en if-sats, som kontrollerar om id:t för det aktuella inlägget är lika med 1. Om det är det, väljer SQL-frågan bara raden med "img3" i den. (Och om det inte är det kör den den föregående SQL-frågan som väljer alla rader.)

Naturligtvis fungerar detta bara om du känner till inläggets id och titeln på bilden som du vill visa. En mer generisk lösning för att alltid visa endast den tredje bilden av det första inlägget skulle vara ungefär så här:

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

Här har jag lagrat hela resultatet av den första SQL-frågan i en array, för då motsvarar arrayens nycklar numret på varje post minus ett. Om $key =0 är den aktuella raden det första inlägget och sedan använder vi SQL-frågan som endast väljer den tredje bilden från bildtabellen. Om $key inte är 0 använder vi den andra SQL-frågan som väljer alla bilder.

I den nya SQL-frågan betyder LIMIT 1 att välj endast 1 rad, och OFFSET 2 betyder att börja med rad 3 (räkningen börjar vid 0, så offset 2 returnerar rad 3).

Jag har lagt till ORDER BY id_img för att se till att bilder alltid returneras i samma ordning, den ordning som de lades till i databasen. (Och jag har gjort samma sak med id_post i den första frågan.)




  1. Förbättra prestanda för Galera Cluster för MySQL eller MariaDB

  2. Hur begränsar man flera nummer genom att filtrera flera kolumner på MySql?

  3. mysqldump med utf8 kan inte exportera rätt emojis-sträng

  4. Hur man installerar Azure Data Studio på en Mac