2012-12-26 19 views
8

Ich versuche, nicht frustriert zu werden, aber ich habe kürzlich gelernt, dass mysql_* in PHP abgeschrieben wird. Ich habe beschlossen, dass ich lernen würde, PDO zu verwenden. Ich habe es mir heute Nachmittag angeschaut, und es war einfach, mich mit der Datenbank zu verbinden, aber dann wollte ich eine Zeile damit holen und die Zeile als ein Array speichern, das durch die Spaltennamen indiziert wurde (genau wie die Funktion) mysql_fetch_array tat). Ich kann es nicht herausfinden, um mein Leben zu retten. Ich werde meinen Code posten, um klarzustellen, und ich bin mir sicher, dass es etwas Einfaches ist (alle Programmierfehler sind immer einfach), aber ich mache definitiv etwas falsch.Wie Zeile mit PDO holen

//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"]; 

Vielen Dank für die Hilfe.

Alex

+6

Können Sie die Syntaxhervorhebung hier sehen? Haben Sie eine Fehlermeldung erhalten? Falls nicht, haben Sie error_reporting aktiviert? – mario

+2

Die 'prepare()' Zeile hier hat einige fehlende Anführungszeichen, aber Sie wussten das wahrscheinlich. –

+2

Programmierung ist frustrierend, wenn Sie keine Fehlermeldungen erhalten, um Sie zu helfen. Sie müssen PHP konfigurieren, um Ihnen Fehler anzuzeigen. – goat

Antwort

19

fetchAll tut, was es sagt: es alle Ergebnisse für eine Abfrage abruft. Da es viele Ergebnisse abruft, erhalten Sie ein indiziertes Array.

fetch macht das, wonach Sie suchen, wenn Sie nur eine Zeile haben wollen: es holt ein Ergebnis für eine Abfrage. Wenn Sie den Code mysql_* in PDO konvertieren, ist der schnellste Weg, diese Methode anstelle von mysql_fetch_assoc zu verwenden.

Wenn Sie sich immer noch mit fetchAll: Ihr Code würde wahrscheinlich so aussehen gerade:

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

Wie ich schon sagte, wenn Sie nur Legacy-Code zu PDO Code konvertieren, könnte es einfacher sein, ändern Sie einfach alle Anfragen an vorbereiteten Anweisungen und ersetzen Sie die folgenden Schritte aus:

  • 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

Das macht Sinn, ich schätze Ihre schnelle Antwort und ich werde Ihren Ratschlag verwenden. Ich änderte den Code und es gibt mir den Fehler nicht Fataler Fehler: Aufruf zu undefinierter Methode Database :: prepare() in \ xxxx.php on line. Warum sagt es mir, dass es undefiniert ist? Danke – Alex

+0

Ich vermute, dass Ihre "Datenbank" -Klasse kein PDO-Objekt ist, weshalb Sie nicht darauf vorbereiten() können. –

0

Verwenden

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

Sie das erste Abfrage Ergebnis.