2010-10-22 13 views
25

Hier ist ein Ausschnitt aus meinem Code:PDO-Fehlermeldung?

$qry = ' 
    INSERT INTO non-existant-table (id, score) 
    SELECT id, 40 
    FROM another-non-existant-table 
    WHERE description LIKE "%:search_string%" 
    AND available = "yes" 
    ON DUPLICATE KEY UPDATE score = score + 40 
'; 
$sth = $this->pdo->prepare($qry); 
$sth->execute($data); 

print_r($this->pdo->errorInfo()); 

Das bin ich einen Fehler geben sollte, weil die Tabellen existieren nicht einmal. Ich jedoch erhalten, ist das alles:

Array ([0] => 00000)

Wie kann ich eine bessere Beschreibung des Fehlers erhalten, damit ich das Problem debuggen kann?

+0

Drucken Sie den Fehler nach der Vorbereitung, aber vor dem Ausführen – thetaiko

+0

Der Fehler sieht ziemlich klar für mich,: search_string wird mit so etwas wie ‚foobar‘ ersetzt bekommen (einschließlich der Anführungszeichen) ein, so dass Ihr finally sql statement würde ungefähr wie "% 'foobar'%" aussehen. Sie müssen% an die $ data in der Anweisung -> execute() anhängen.Da dies vor 3 Jahren war, bin ich sicher, dass Sie den Fehler – relipse

+0

herausgefunden haben. Übrigens, ich stoße auf das gleiche Problem, keine Fehlermeldung. Die einzige Methode, die ich gelernt habe, es zu beheben, besteht darin, das SQL einfach in phpmyadmin zu kopieren und einzufügen und nach der Ausgabe zu suchen. Hat das jemand herausgefunden? Ich habe die Antworten unten versucht. – relipse

Antwort

68

Versuchen Sie stattdessen:

print_r($sth->errorInfo()); 

EDIT:

Fügen Sie diese vor Ihrer Vorbereitung:

$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 

Dies wird die PDO Fehlerberichtstyp verändern und dazu führen, dass eine Warnung ausgeben, wenn Es gibt einen PDO-Fehler. Es sollte Ihnen helfen, es aufzuspüren, obwohl Ihre errorInfo Wette gesetzt haben sollte.

+0

Danke, das gibt mir genau das gleiche, 'Array ([0] => 00000)'. –

+0

Ich habe eine andere Sache hinzugefügt, die Sie ausprobieren können, aber wenn errorInfo nicht korrekt eingestellt wird, kann etwas anderes passieren. –

+0

Dies scheint zu funktionieren. –

2

Aus dem Handbuch:

Wenn der Datenbankserver erfolgreich die Anweisung vorbereitet, PDO :: prepare() ein PDOStatement Objekt zurückgibt. Wenn der Datenbankserver die Anweisung nicht erfolgreich vorbereiten kann, gibt PDO :: prepare() FALSE zurück oder gibt PDOException aus (je nach Fehlerbehandlung).

Die Prepare-Anweisung verursachte wahrscheinlich einen Fehler, da die Datenbank die Anweisung nicht vorbereiten konnte. Versuchen Sie sofort nach dem Vorbereiten der Abfrage und vor dem Ausführen des Tests einen Fehler zu testen.

$qry = ' 
    INSERT INTO non-existant-table (id, score) 
    SELECT id, 40 
    FROM another-non-existant-table 
    WHERE description LIKE "%:search_string%" 
    AND available = "yes" 
    ON DUPLICATE KEY UPDATE score = score + 40 
'; 
$sth = $this->pdo->prepare($qry); 
print_r($this->pdo->errorInfo()); 
+0

Ich habe das versucht und es hat nicht geholfen entweder – relipse

3

Vielleicht ist dieser Beitrag zu alt, aber es kann für jemanden, um auf diese als Anregung helfen: Anstelle der Verwendung von:

print_r($this->pdo->errorInfo()); 

Verwenden Sie PHP implodieren() Funktion:

echo 'Error occurred:'.implode(":",$this->pdo->errorInfo()); 

Dies sollte den Fehlercode, detaillierte Fehlerinformationen usw. drucken, die Sie normalerweise erhalten würden, wenn Sie eine SQL-Benutzeroberfläche verwenden würden.

Hoffe es hilft

+1

Sie müssen sagen 'Echo' Ein Fehler ist aufgetreten: '.implode (":", $ this-> pdo-> errorInfo(); '. Es hat keinen Sinn,' print_r' zu verwenden wenn das Objekt kein Array ist :-) –

+0

@ShaquinTrifonoff pdo-> errorInfo() ist in der Tat ein Array. Sehen Sie hier: http://php.net/manual/en/pdo.errorinfo.php – Vikram

+0

Das ist, was ich sage - 'implode' verwandelt es in eine Zeichenkette, also gibt es keinen Grund,' print_r' auf einer Zeichenkette zu verwenden . –

4

Alter Thread, aber vielleicht hilft meine Antwort jemandem. Ich löste, indem ich zuerst die Abfrage ausführte, dann eine Fehlervariable einstellte und dann prüfte, ob dieses Array fehlerhafter Variablen leer ist. siehe vereinfachtes Beispiel:

$field1 = 'foo'; 
$field2 = 'bar'; 

$insert_QUERY = $db->prepare("INSERT INTO table bogus(field1, field2) VALUES (:field1, :field2)"); 
$insert_QUERY->bindParam(':field1', $field1); 
$insert_QUERY->bindParam(':field2', $field2); 

$insert_QUERY->execute(); 

$databaseErrors = $insert_QUERY->errorInfo(); 

if(!empty($databaseErrors)){ 
    $errorInfo = print_r($databaseErrors, true); # true flag returns val rather than print 
    $errorLogMsg = "error info: $errorInfo"; # do what you wish with this var, write to log file etc...   

/* 
$errorLogMsg will return something like: 
error info: 
Array(
    [0] => 42000 
    [1] => 1064 
    [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'table bogus(field1, field2) VALUES             ('bar', NULL)' at line 1 
) 
*/ 
} else { 
    # no SQL errors. 
}