2010-09-16 3 views
55

Io non riesco a ottenere qualsiasi messaggio di errore da PDO:Come spremere il messaggio di errore da PDO?

#$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
try { 
    $sth = $dbh->prepare('@$%T$!!!'); 
    print_r($sth); 
    print_r($dbh->errorInfo()); 
} catch (PDOException $e) { 
    echo $e->getMessage(); 
} 

Si sta dando solo:

PDOStatement Object 
(
    [queryString] => @$%T$!!! 
) 
Array 
(
    [0] => 00000 
    [1] => 
    [2] => 
) 

setAttribute non aiuta nulla.

E 'PHP 5.3.3 Apache 2.0 Handler
DOP driver per MySQL abilitato
client versione API mysqlnd 5.0.7-dev - 091.210 - $ Revision: 300.533 $

Che cosa posso fare per ottenere informazioni sugli errori ?

+0

Cosa viene stampato 'print_r ($ sth-> errorInfo())'? – shamittomar

+0

@shamittomar L'ho provato anche io, distribuendo una serie di 3 elementi vuoti –

risposta

2

È necessario prima execute la query e quindi verificare la presenza di errori: Quindi fare in questo modo:

$sth->execute(); 

e poi controllare gli errori. Quindi riceverai errori, se ce ne sono.

+4

E come "verifichi gli errori"? –

+0

che è, dopo tutto, di che cosa si tratta. Perché questo è stato pubblicato come risposta, e non un commento? E perché ha ottenuto così tanti voti? – Mawg

64

setAttribute sarà causare PDO per vomitare errori o eccezioni - più tardi quando si esegue la query.

Per istruzioni preparate emulati, non c'è alcun controllo in prepare():

emulato istruzioni preparate non comunica con il server di database in modo PDO :: preparare() non verifica la dichiarazione.

Ma ci sarà uno in execute() quando la query viene inviata al server.

Tuttavia, il driver MySQL supporta le istruzioni preparate native da MySQL 4.1 in ogni caso, quindi questo non dovrebbe applicarsi. Utilizzando

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

deve causare un'eccezione per la query che si usa.

+0

l'esempio di pagina man non viene eseguito neanche: http://ru2.php.net/manual/en/pdo.errorinfo.php e con execute ancora senza fortuna –

+2

@Col cosa succede se si imposta '$ dbh-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION); '? –

+0

@Col Se si imposta 'ERRMODE_EXCEPTION' e non ci sono eccezioni né da' prepare() 'né da' exec() 'allora qualcos'altro è sbagliato - in questo caso, non ho idea di cosa abbia funzionato questo –

4

troppo stavo cercando di ottenere le informazioni dal errorInfo() a livello di gestore del database, ma ho finito per ottenere le informazioni dal livello di istruzione con PDOStatement::errorInfo()

Per PHP sito web:

DOP: : errorInfo() recupera solo le informazioni sugli errori per le operazioni eseguite direttamente sull'handle del database. Se si crea un oggetto PDOStatement tramite PDO :: prepare() o PDO :: query() e si richiama un errore sull'istruzione handle, PDO :: errorInfo() non rifletterà l'errore dall'handle dell'istruzione. È necessario chiamare PDOStatement :: errorInfo() per restituire le informazioni sull'errore per un'operazione eseguita su un particolare handle di istruzione.

2

Questo stamperà il codice di errore e il relativo messaggio dettagliato.

Avviso: questa è solo una dimostrazione. Basta usare per scopi di debug. Non abilitare la visualizzazione di messaggi di errore al pubblico in una versione di rilascio.

try{ 
connection=$this->get_connection();//here i brought my connection string 
connection->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 
connection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 
/** 
Do your works here.. 
//$statement=$connection->prepare($sql); 
//if you are using errorInfo use after prepare statement before execute.here in this method i am not using it. 
//print_r($statement->errorInfo()); 
**/ 

$statement->execute(); 
} 
catch(PDOException $e) { 
       //this will echo error code with detail 
       //example: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'nasme' in 'field list' 
       echo $e->getMessage(); 
      } 
//$statement=null; 
+1

http://phpdelusions.net/try-catch –

+0

non capisco perché la mia risposta è stata modificata così male n meno votata (-) come sappiamo che era una dimostrazione di come fare qualcosa. è l'unico modo per ottenerlo mentre esegue il debug del codice. mostra un messaggio di errore dettagliato con errore code.now non sembra che questa risposta sia qualcosa:/perché non eliminarlo .. – aimme

+0

Ah, hai ripristinato il codice originale - abbastanza giusto. Se viene modificato in un modo che cambia di nuovo il tuo intento, ti preghiamo di alzare un flag di moderatore piuttosto che ingaggiare una guerra di modifica - grazie. Sistemerò le maiuscole: abbiamo una regola "no shouting" qui :-) ' – halfer