2014-04-07 9 views
8

Sto provando a restituire quattro record dal mio database MySQL ma viene restituito solo il primo record. Ho cercato ma non sono sicuro del motivo. Qualcuno può indicarmi la giusta direzione?Perché viene restituito solo il primo record da questo array PHP?

<?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; 
    } 
?> 
+1

"// Questo è un ciclo while per memorizzare i risultati SQL in ......" - No, non lo è. Vuoi qualcosa come 'while ($ row = mysql_fetch_assoc ($ result) {...}' ma mentre ci sei, per favore considera di passare al PDO. – hank

+0

Hai una vulnerabilità di SQL injection qui, tra l'altro - è necessario – halfer

risposta

5

Come altri qui hanno detto, è necessario utilizzare un mentre faccio un ciclo per questo, ho riordinato il codice un po 'e ho aggiunto un paio di altre cose da considerare.

Il vero motivo per questo è che quando si utilizza mysql_fetch_assoc viene ripristinata una risorsa risultato e rimossa dalle risorse che ha lasciato per tornare. Quindi, se provi a memorizzarlo in un array, ottieni il primo nell'array e nient'altro. Quando usi un ciclo while funziona praticamente dicendo "se mysql_fetch_assoc ha qualcosa da dare, allora fai il codice all'interno 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; 
} 

I commenti nel codice passano attraverso i miei punti principali.

Ho spostato anche $ cam = $ _POST ['cam'] dall'interno del ciclo, all'esterno di esso, in quanto non ha bisogno di entrare nel ciclo perché il suo valore sarà sempre lo stesso, indipendentemente di quale oggetto del ciclo stai passando.

+1

corretto il mio codice, grazie a tutti per l'aiuto. ma visto che la mia reputazione è troppo bassa, grazie ancora ragazzi, ho passato praticamente tutto ieri cercando di capirlo. –

+0

@GrahamSnowdon Puoi segnare la risposta corretta alla tua reputazione –

6

Si dovrebbe usare ciclo per recuperare risultato:

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

Perché votare, è corretto –

3

Il modo di usare mysql_fetch_assoc o mysql_fetch_array è questo:

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

Se hai ancora bisogno di una spiegazione:

1. Perché si ha un solo record ??

Quando si dichiara:

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

Ciò significa che si ottiene un record dal database, il metodo mysql_fetch_assoc() è stato eseguito solo una volta, in modo che le chiamate di metodo 1 riga dalla tabella del database.

2. Come farlo funzionare?

Come nell'esempio fornito da altri, utilizzare invece un ciclo while.

2.1 Come funziona il ciclo?

quando si chiama:

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

In un primo momento hanno gestito somecommand1. Se restituisce true, esegui qualche comando2. Al termine di command2, eseguire nuovamente somecommand1. Se è ancora vero, fai somecommand2 e così via ... Un buon esempio è il comando che stai usando.

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

In questo loop $ row = mysql_fetch_assoc ($ result) è Somecommand1 come spiegato. Questa funzione restituisce una risorsa che equivale a true se è presente un'altra riga restituita dal database. Dopo aver eseguito il codice nel ciclo while, salta sulla riga successiva. Quindi esegue nuovamente la funzione mysql_fetch_assoc.Se c'è ancora qualche record nella tabella che corrisponde alla query, questa funzione farà comunque tutto ciò che è nel tuo ciclo while.

Se avete bisogno di più esempi, date un'occhiata a w3schools.com. Ho avviato PHP da lì.

+0

Grazie per la modifica, Seer –

+0

Stai dicendo che il nome di una variabile è collegato al suo contenuto? Se una riga è una linea verticale, cos'è una colonna? –

+0

una linea orizzontale ovviamente. (la verticale è lasciata stretta e orizzontale è su giù, giusto?) Puoi vedere in microsoft word quando fai un tavolo, un bel esempio –

Problemi correlati