2016-01-26 19 views
5

Ho familiarità con MySQLi e stavo provando PDO, ho sentito che è meglio. Stavo passando per il tutorial presente here. Dicono che PDO genera un'eccezione quando PDO :: ERRMODE_EXCEPTION è impostato e accidentalmente si sbaglia qualcosa con la query (ad esempio, digitandola in modo errato, DELECT invece di SELECT). Ho digitato la stessa query errata per vedere il messaggio di errore ed eccezione sul mio ambiente locale. Ho installato WAMP di ultima generazione con PHP 5.5, MySQL 5.6 e Apache 2.4.9 nel mio PC Windows 7 a 32 bit, ma non ho ottenuto ciò che mi aspettavo, nessuna eccezione è stata lanciata lì. Ho provato lo stesso codice pubblicato nel tutorial:PDO che non genera eccezioni su query SQL errate

try { 
$DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); 
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

# UH-OH! Typed DELECT instead of SELECT! 
$DBH->prepare('DELECT name FROM people'); 
} 
catch(PDOException $e) { 
echo "I'm sorry, Dave. I'm afraid I can't do that."; 
file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); 
} 

No PDOError.txt, nessun messaggio di errore. Qualcosa non va nel tutorial o nel mio ambiente? O ci sono casi in cui PDO non riesce a generare eccezioni? Ho installato un driver PDO per MySQL.

+3

Probabilmente non riuscendo perché la query non viene eseguito ed è in attesa di ulteriori istruzioni. Eseguilo e vedi se genera un'eccezione. –

+0

$ DBH-> query ('DELECT name FROM people'); eseguirà la query –

+0

Indovina cosa Fred, hai assolutamente ragione. L'esecuzione fa il lavoro. Grazie mille. –

risposta

5

Probabilmente non funziona perché la query non viene mai eseguita ed è in attesa di ulteriori istruzioni.

Dal momento che non rileva che nulla attiva, quindi è tutto valido nell'occhio del PDO; questa è la mia analogia su questo.

Eseguilo e vedrai che genererà un'eccezione.

O eseguendolo dopo la preparazione o un semplice ->query() anziché ->prepare().

+0

Grazie, ancora ... –

+0

@Devashish Siete i benvenuti, * evviva * –

5

Questo in realtà ha a che fare con un altro attributo della connessione PDO che potresti non aver ancora considerato. E questo è PDO::ATTR_EMULATE_PREPARES

Se si aggiunge questo attributo, e impostarlo a false vi dirà l'estensione PDO per il rilascio del prepare alla banca dati per la compilazione, l'ottimizzazione e la pianificazione di esecuzione, in corrispondenza del punto si emette il ->prepare(). Se lo lasci scollegato, prende il valore predefinito di true, che indica all'estensione di EMULARE la compilation. In altre parole, aspetterà che venga emesso lo ->execute() prima che l'istruzione venga compilata e vengano riportati gli errori.

PDO :: ATTR_EMULATE_PREPARES Abilita o disabilita l'emulazione delle istruzioni preparate. Alcuni driver non supportano le istruzioni preparate native o hanno un supporto limitato per loro. Utilizzare questa impostazione per forzare PDO a emulare sempre le istruzioni preparate (se TRUE), o per provare a utilizzare le istruzioni preparate native (se FALSE). Ricorrerà sempre all'emulazione dell'istruzione preparata se il driver non è in grado di preparare correttamente la query corrente.

Quindi, esegui il codice con questa impostazione Attributi aggiuntiva e osserva la differenza.

try { 
    $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); 
    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $DBH->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); 

    # UH-OH! Typed DELECT instead of SELECT! 
    $DBH->prepare('DELECT name FROM people'); 
} 
catch(PDOException $e) { 
    echo "I'm sorry, Dave. I'm afraid I can't do that."; 
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); 
} 

Ora si otterrà il messaggio e il file verrà creato contenente il messaggio di errore

+0

Niente come uno sforzo di squadra per capire le cose, * huh Smokey? * ;-) –

+0

@ Fred-ii- Gotcha back man, hai il mio? Corso che hai! – RiggsFolly

+0

Tutto il tempo Smokey ;-) –