2010-10-22 22 views
25

Ecco un frammento del mio codice:messaggio di errore PDO?

$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()); 

Questo mi dovrebbe dare un errore perché non esistono neppure i tavoli. Tutto quello che ottiene è però questo:

Array ([0] => 00000)

Come posso ottenere una migliore descrizione dell'errore in modo da poter eseguire il debug del problema?

+0

provare a stampare l'errore dopo la preparazione, ma prima che l'esecuzione – thetaiko

+0

L'errore sembra piuttosto chiaro per me,: search_string otterrà sostituito con qualcosa di simile a 'foobar' (comprese le virgolette), quindi la tua l'istruzione sql finale sarebbe simile a "% 'foobar'%" quello che devi fare è aggiungere% ai $ dati nell'istruzione -> execute().Dal momento che questo è stato 3 anni fa, sono sicuro che hai capito l'errore – relipse

+0

A proposito, sto incontrando lo stesso problema, nessun messaggio di errore. L'unico modo per imparare a risolverlo è copiare e incollare l'SQL in phpmyadmin e cercare l'output. Qualcun altro lo ha capito? Ho provato le risposte qui sotto. – relipse

risposta

68

Prova a modificare:

print_r($sth->errorInfo()); 

EDIT:

Aggiungi questa prima della preparazione:

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

Questo cambierà il tipo di segnalazione degli errori PDO e indurlo a emettere un avviso ogni volta che c'è un errore PDO. Dovrebbe aiutarti a rintracciare, anche se il tuo errorInfo dovrebbe avere una scommessa impostata.

+0

Grazie, mi dà esattamente la stessa cosa, 'Array ([0] => 00000)'. –

+0

Ho aggiunto un'altra cosa che puoi provare, ma se errorInfo non viene impostato correttamente potrebbe esserci qualcos'altro in corso. –

+0

Sembra funzionare. –

2

Dal manuale:

Se il server di database con successo prepara la dichiarazione, PDO :: preparare() restituisce un oggetto PDOStatement. Se il server di database non riesce correttamente a preparare la dichiarazione, PDO :: prepare() restituisce FALSE o emette PDOException (a seconda della gestione degli errori).

La dichiarazione di preparazione probabilmente ha causato un errore perché il db non sarebbe stato in grado di preparare la dichiarazione. Prova a verificare un errore subito dopo aver preparato la tua query e prima di eseguirla.

$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

L'ho provato e non ha aiutato né – relipse

3

Forse questo post è troppo vecchio, ma può essere utile come un suggerimento per chi cerca in giro su questo: Invece di usare:

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

Utilizzare PHP implode() funzione:

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

Questo dovrebbe stampare il codice di errore, le informazioni dettagliate sull'errore ecc. Che si otterrebbero in genere se si stesse utilizzando un'interfaccia utente SQL.

Spero che sia utile

+1

Devi dire "echo" Si è verificato un errore: ".implode (": ", $ this-> pdo-> errorInfo();'. Non ha senso usare 'print_r' se l'oggetto non è un array :-) –

+0

@ShaquinTrifonoff pdo-> errorInfo() è davvero un array. Vedi qui: http://php.net/manual/en/pdo.errorinfo.php – Vikram

+0

Questo è quello che sto dicendo - 'implode' lo trasforma in una stringa, quindi non c'è motivo di usare' print_r' su una stringa . –

4

Vecchio thread, ma forse la mia risposta aiuterà qualcuno. Ho risolto eseguendo prima la query, quindi impostando una variabile di errore, quindi controllando se tale matrice di variabili di errore fosse vuota. vedi esempio semplificato:

$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. 
} 
Problemi correlati