sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo mostrar álbumes de imágenes en las publicaciones? [solo usando PHP y MYSQL]

Su primera consulta SQL está bien, pero para la segunda, solo desea seleccionar las imágenes para la publicación actual (fila) en el ciclo while externo, por lo que la segunda consulta SQL debería ser:

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

Actualización para mostrar solo img3 de la publicación 1:

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

Coloqué la segunda consulta SQL en una declaración if, que verifica si la identificación de la publicación actual es igual a 1. Si lo es, entonces la consulta SQL solo selecciona la fila con "img3". (Y si no es así, ejecuta la consulta SQL anterior que selecciona todas las filas).

Por supuesto, esto solo funciona si conoce la identificación de la publicación y el título de la imagen que desea mostrar. Una solución más genérica para mostrar siempre solo la tercera imagen de la primera publicación sería algo como esto:

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

Aquí he almacenado el resultado completo de la primera consulta SQL en una matriz, porque entonces las claves de la matriz se corresponden con el número de cada publicación menos uno. Si $key =0, la fila actual es la primera publicación y luego usamos la consulta SQL que selecciona solo la tercera imagen de la tabla de imágenes. Si $key no es 0, usamos la otra consulta SQL que selecciona todas las imágenes.

En la nueva consulta SQL, LIMIT 1 significa seleccionar solo 1 fila, y OFFSET 2 significa comenzar con la fila 3 (el conteo comienza en 0, por lo que el desplazamiento 2 devuelve la fila 3).

Agregué ORDER BY id_img para asegurarme de que las imágenes siempre se devuelvan en el mismo orden, el orden en que se agregaron a la base de datos. (Y he hecho lo mismo con id_post en la primera consulta).