2012-12-26 11 views
8

Sto cercando di non essere frustrato, ma di recente ho appreso che mysql_* è ammortizzato in PHP. Ho deciso che avrei imparato come usare PDO. L'ho visto solo oggi pomeriggio e collegarmi al database usando questo è stato facile, ma poi ho voluto recuperare una riga e salvare la riga come una matrice indicizzata dai nomi delle colonne (allo stesso modo della funzione mysql_fetch_array ha fatto). Non riesco a capirlo per salvarmi la vita. Pubblicherò il mio codice per chiarire, e sono sicuro che sia qualcosa di semplice (tutti gli errori di programmazione sono sempre semplici) ma sto sicuramente facendo qualcosa di sbagliato.Come recuperare riga con PDO

//CONNECT TO DATABASE 
$host = $_PARAM["DatabaseServer"]; 
$db  = $_PARAM["MainDatabase"]; 
$dbuser = $_PARAM["DatabaseUser"]; 
$dbpass = $_PARAM["DatabasePass"]; 
try 
{ 
    $Database = new PDO("mysql:host=$host;dbname=$db", $dbuser, $dbpass); 
} 
catch (PDOException $e) 
{ 
    echo "There was an unexpected error. Please try again, or contact us with concerns"; 
} 

$stmt = $Database->prepare("SELECT * FROM users WHERE username=?"); 
$stmt->execute(array($sUserCook)); 
$row = $stmt->fetchAll(PDO::FETCH_ASSOC); 

echo $row["username"]; 

Grazie per l'aiuto.

Alex

+6

Riesci a vedere l'evidenziazione della sintassi qui? Hai ricevuto un messaggio di errore? In caso contrario, hai abilitato error_reporting? – mario

+2

La riga 'prepare()' ha alcune virgolette mancanti, ma probabilmente lo sapevate. La programmazione di –

+2

è frustrante quando non si ricevono messaggi di errore per guidarti. è necessario configurare php per mostrare errori. – goat

risposta

19

fetchAll fa quello che dice: si recupera tutti i risultati di una query. Poiché recupera molti risultati, otterrai un array indicizzato.

fa ciò che si potrebbe cercare se si desidera una sola riga: recupera un risultato per una query. Se stai convertendo il codice mysql_* in PDO, il modo più rapido sarebbe utilizzare semplicemente questo metodo invece di mysql_fetch_assoc.

Se siete ancora in corso con fetchAll: il codice sarà probabilmente solo simile a questa:

$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 
foreach ($rows as $row) { 
    echo $row['username']; 
} 

Come ho detto, se si sta solo la conversione di codice legacy in codice DOP, potrebbe essere più facile basta cambiare tutte le query per le istruzioni preparate e sostituire il seguente:

  • mysql_fetch_assoc($result)
    ->$stmt->fetch(PDO::FETCH_ASSOC)
  • mysql_num_rows($result)
    ->$stmt->rowCount()
  • while ($row = mysql_fetch_assoc($result)) {}
    ->foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {}
+0

Questo ha senso, apprezzo la tua rapida risposta e userò il tuo consiglio. Ho cambiato il codice e non mi ha dato l'errore Errore fatale: chiamata al metodo non definito Database :: prepare() in \ xxxx.php in linea. Perché mi sta dicendo che non è definito? Grazie – Alex

+0

Suppongo che la tua classe "Database" non sia un oggetto PDO, motivo per cui non puoi prepararla(). –

0

Usa

$row = $stmt->fetch(PDO::FETCH_ASSOC); 

Si otterrà il primo risultato della query.