2015-08-12 26 views
5

Prima di tutto, sono nuovo di DOP. Sto lavorando a un piccolo progetto per migliorare me stesso.PHP - PDO - Come recuperare più righe con una sola query?

sto usando un codice come questo per andare a prendere singola riga dal mio database:

$sql = "SELECT * FROM users WHERE ID = 1"; 
    $sql_prepare = $db -> prepare($sql); 
    $result = $db -> query($sql); 
    $user = $result -> fetch(PDO::FETCH_ASSOC); 

ed eco alcun risultato di quella riga come questa:

echo $user['ID']; 
    echo $user['Name']; 

ho bisogno di recuperare più righe dal mio database usando solo una query. Non voglio interrogare più e più volte per ogni riga di cui ho bisogno.

La prima cosa che è venuto nella mia mente stava cercando questo:

$sql = "SELECT * FROM users WHERE ID = 1 AND ID = 4 AND ID = 17"; 
    $sql_prepare = $db -> prepare($sql); 
    $result = $db -> query($sql); 
    $user = $result -> fetch(PDO::FETCH_ASSOC); 

Ma non ha funzionato come previsto. Ho ricercato forum di codifica per un paio d'ore, ma tutte le risposte riguardavano l'utilizzo del metodo fetchAll e quindi l'output dei risultati utilizzando il ciclo foreach. Non voglio filtrare il codice caricando l'intera tabella del database. Voglio solo caricare righe specifiche dal mio database usando solo una query.

Quindi la mia domanda è:

Come posso prendere molteplici e specifiche righe dal mio database senza utilizzare il metodo fetchAll e con una sola ricerca?

Grazie per le vostre risposte e il tempo in anticipo.

Ci scusiamo se la domanda è stata posta prima.

+0

Cercare operatore SQL ** O **. – Michas

+0

FetchAll non effettua richieste al tuo database. Funziona sul risultato della tua richiesta. Se la tua query restituisce un risultato allora fetchall ti darà un risultato. Se restituisce 2, quindi sarà fetchall. –

+0

@DanielNielson Grazie per aver spiegato. :) – OnrS90

risposta

6

È necessario modificare query per

SELECT * FROM users WHERE ID IN(1,4,17); 

e utilizzare fetchAll() metodo che restituisce tutti i record invece di uno.

Se non si desidera utilizzare fetchAll();, è necessario utilizzare fetch() in loop ed è necessario modificare la query.

while ($user = $result->fetch(PDO::FETCH_ASSOC)) { 
    print_r($user); 
} 

Avviso: si utilizzano istruzioni preparate senza parametri.

+0

Grazie per la tua risposta. Questo e 'esattamente quello che stavo cercando! Puoi anche digitare un semplice esempio su istruzioni preparate con parametri? – OnrS90

+1

http://stackoverflow.com/questions/14767530/php-using-pdo-with-in-clause-array qui è un buon esempio di utilizzo delle istruzioni preparate con nella clausola – Robert

+0

Grazie ancora! Lo controllerò.:) – OnrS90

4

si dovrebbe usare in questo modo

$sth = $dbh->prepare('SELECT * FROM users WHERE ID IN(?,?,?)'); 
    if($sth->execute([1,2,3])) { 
     //1,2,3 is the value to be send 
     if($sth->rowCount() > 0) { 
      while($result = $sth->fetchObject()) { 
       print_r($result); 
      } 
     } else { 
      echo 'there are no result'; 
     } 
    } else { 
     echo 'there error in the query'; 
} 

ci sono un sacco di modi per fare questa cosa, ma è solo le basi preparare -> execute -> recuperare i dati

+0

Grazie mille! Sopprimerò la tua risposta quando avrò 15 reputazione. :) – OnrS90