Pregunta ¿Por qué solo se devuelve el primer registro de este conjunto de PHP?


Estoy tratando de devolver cuatro registros de mi base de datos MySQL, pero solo se devuelve el primer registro. He buscado pero no estoy seguro de por qué es esto. ¿Alguien me puede apuntar en la dirección correcta?

    <?php
session_start();
function displayImage($username){
    $imageDate  = $_POST['imageDate'];
    $result = mysql_query("
        SELECT
            imageName
        FROM
            images AS i
        INNER JOIN
            users AS u ON i.userID = u.UserID
        WHERE
            u.username = '$username'
        AND
            i.imageDate = '$imageDate'

    ") or die(mysql_error());

    //return a message to the users explaining ......
        if (!isset($_POST['Submit'])) {
            // this does nowt yet!!!
            $output = "Nothing selected yet.";
        }
        else {
        //This is a while loop to store the SQL results into ......
        $row = array(mysql_fetch_assoc($result));
        foreach ($row as $picName) {
        $cam = $_POST['cam'];
        $fullPath = $username . "/" . $cam . "/" . $picName['imageName'];
        // $output = //this works fine
                reset($images);
            }
        }
        var_dump($row);
        echo "<br />";
        return $output;
    }
?>

8
2018-04-07 09:01


origen


Respuestas:


Como han dicho otros aquí, necesitas usar un ciclo while para esto, he ordenado un poco el código y he agregado un par de cosas más para que consideres.

La razón real de esto es que cuando usa mysql_fetch_assoc devuelve un recurso de resultado y lo elimina de los recursos que le quedan para devolver. Entonces, si intenta almacenarlo en una matriz, obtendrá el primero en la matriz y nada más. Cuando usas un ciclo while funciona básicamente diciendo "si mysql_fetch_assoc tiene algo que dar, luego haz el código dentro del ciclo".

<?php

session_start();

function displayImage($username) {
    // Also, as others have said, check out PDO, or MySQLi, as they
    // both provide a better interface with MySQL an have better
    // security features.
    $username  = mysql_real_escape_string($username);
    $imageDate = mysql_real_escape_string($_POST['imageDate']);

    $result = mysql_query("
        SELECT
            imageName
        FROM
            images AS i
        INNER JOIN
            users AS u ON i.userID = u.UserID
        WHERE
            u.username = '$username'
    AND 
            i.imageDate = '$imageDate'
    ") or die(mysql_error());

    //return a message to the users explaining
    if (!isset($_POST['Submit'])) {
        // this does nowt yet!!!
        $output = "Nothing selected yet.";
    } else {
        $cam = $_POST['cam'];

        $images = array(); // This is part of the "you could do something 
                           // like" further down.
        while ($row = mysql_fetch_assoc($result)) {
            $fullPath = $username . '/' . $cam . '/' . $row['imageName'];
            // $output = //this works fine
            var_dump($row);
            echo "<br />";

            // Or you could do something like:

            $images[] = $username . '/' . $cam . '/' . $row['imageName'];

            // Then outside of this while loop you'd have all of your image 
            // paths stored in this $images array. 
            // 
            // It depends on how you want to handle outputting them.
        }
    }

    return $output;
}

Los comentarios en el código pasan por mis puntos principales.

También moví esa $ cam = $ _POST ['cam'] desde el interior del bucle, a fuera de él, ya que no es necesario ir en el bucle porque su valor siempre será el mismo, independientemente de qué elemento del bucle estás yendo


5
2018-04-07 09:19



Deberías usar loop para obtener el resultado:

    while ($row = mysql_fetch_assoc($result)) {
        $cam = $_POST['cam'];
        $fullPath = $username . "/" . $cam . "/" . $row['imageName'];
    }

6
2018-04-07 09:03



La forma de usar mysql_fetch_assoc o mysql_fetch_array es esta:

while ($row = mysql_fetch_assoc($result)) {
    // This is an example...
    echo $row["id"];
    echo $row["name"];
}

3
2018-04-07 09:15



Si aún necesitas una explicación:

1. ¿Por qué tienes solo un registro?

Cuando declaras:

$row=array(mysql_fetch_assoc($result));

Esto significa que obtiene un registro de la base de datos, el mysql_fetch_assoc() El método se ejecutó solo una vez, por lo que su método llama a 1 fila de la tabla de la base de datos.

2. ¿Cómo hacer que esto funcione?

Como ha visto en el ejemplo dado por otros, use un while bucle en su lugar.

2.1 ¿Cómo funciona el bucle?

Cuando usted llama:

     while (<some command1 equates to true or false>) {<some command2>}

Al principio ejecutan algún comando1. Si devuelve verdadero, haga algún comando2. Después de que command2 haya terminado, ejecute somecommand1 nuevamente. Si sigue siendo cierto, ejecute alguna orden 2 y así sucesivamente ... Un buen ejemplo es el comando que está utilizando.

     while ($row = mysql_fetch_assoc($result))
     {
         echo $row['fieldname1'];
         echo $row['fieldname2'];
     }

En este ciclo $ row = mysql_fetch_assoc ($ result) es Somecommand1 como se explicó. Esta función devuelve un recurso que equivale a verdadero si hay otra fila devuelta desde la base de datos. Después de un recorrido del código dentro del ciclo while, se salta a la siguiente fila. Luego vuelve a ejecutar el mysql_fetch_assoc función. Si todavía hay algún registro en la tabla que coincida con la consulta, esta función seguirá haciendo lo que esté en su ciclo while.

Si necesita más ejemplos, eche un vistazo a w3schools.com. Empecé PHP desde allí.


2
2018-04-07 09:42