Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como exibir álbuns de imagens em postagens? [usando apenas PHP e MYSQL]


Sua primeira consulta SQL está bem, mas para a segunda, você só quer selecionar as imagens para a postagem atual (linha) no loop while externo, então a segunda consulta SQL deve ser:
"SELECT img_file, img_title FROM images WHERE post_id = $row[id_post]"

Atualização para mostrar apenas 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>

Coloquei a segunda consulta SQL em uma instrução if, que verifica se o id da postagem atual é igual a 1. Se for, a consulta SQL seleciona apenas a linha com "img3". (E se não for, ele executa a consulta SQL anterior que seleciona todas as linhas.)

Claro que isso só funciona se você souber o id da postagem e o título da imagem que deseja exibir. Uma solução mais genérica para sempre exibir apenas a terceira imagem do primeiro post seria algo assim:
<!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>

Aqui eu armazenei todo o resultado da primeira consulta SQL em um array, pois então as chaves do array correspondem ao número de cada post menos um. Se $key =0, a linha atual é a primeira postagem e então usamos a consulta SQL que seleciona apenas a terceira imagem da tabela de imagens. Se $key não for 0, usamos a outra consulta SQL que seleciona todas as imagens.

Na nova consulta SQL, LIMIT 1 significa selecionar apenas 1 linha e OFFSET 2 significa iniciar com a linha 3 (a contagem começa em 0, portanto, o deslocamento 2 retorna a linha 3).

Adicionei ORDER BY id_img para garantir que as imagens sejam sempre retornadas na mesma ordem, a ordem em que foram adicionadas ao banco de dados. (E eu fiz o mesmo com id_post na primeira consulta.)