sql >> Database >  >> RDS >> Mysql

Hoe beeldalbums in berichten weergeven? [alleen met PHP en MYSQL]

Je eerste SQL-query is prima, maar voor de tweede wil je alleen de afbeeldingen voor de huidige post (rij) in de buitenste while-lus selecteren, dus de tweede SQL-query zou moeten zijn:

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

Update voor het tonen van alleen img3 van 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>

Ik heb de tweede SQL-query in een if-statement geplaatst, die controleert of de id van het huidige bericht gelijk is aan 1. Als dat zo is, selecteert de SQL-query alleen de rij met "img3" erin. (En als dat niet het geval is, voert het de vorige SQL-query uit die alle rijen selecteert.)

Dit werkt natuurlijk alleen als je de id van het bericht en de titel van de afbeelding die je wilt weergeven weet. Een meer algemene oplossing om altijd alleen de derde afbeelding van het eerste bericht weer te geven, zou zoiets zijn als dit:

<!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 heb ik het volledige resultaat van de eerste SQL-query in een array opgeslagen, omdat dan de sleutels van de array overeenkomen met het nummer van elke post minus één. Als $key =0, is de huidige rij het eerste bericht en gebruiken we de SQL-query die alleen de derde afbeelding uit de afbeeldingentabel selecteert. Als $key niet 0 is, gebruiken we de andere SQL-query die alle afbeeldingen selecteert.

In de nieuwe SQL-query betekent LIMIT 1 slechts 1 rij selecteren, en OFFSET 2 betekent beginnen met rij 3 (tellen begint bij 0, dus offset 2 geeft rij 3 terug).

Ik heb ORDER BY id_img toegevoegd om ervoor te zorgen dat afbeeldingen altijd in dezelfde volgorde worden geretourneerd, de volgorde waarin ze aan de database zijn toegevoegd. (En ik heb hetzelfde gedaan met id_post in de eerste zoekopdracht.)




  1. Meerdere mysql INSERT-instructies in één query php

  2. MySQL-prestaties - Trage query en innodb_buffer_pool_size

  3. MySQL - MINST en GROOTSTE vergelijkingsoperators

  4. Ontsnappen van gebruikersinvoer uit database nodig?