2017-08-09 4 views
1

Ich verbinde mich mit einer mySQL-Datenbank mit PDO. Wenn die Anmeldung falsch ist, gibt es einen ganzen Stack von Fehlern, obwohl ich try-catch verwendet habe.Fehler "Uncaught PDOException", obwohl ich try-catch

try 
{ 
    $this->db = new PDO("mysql:host='host' dbname='db' charset=utf8", $username, $password);   

    // Tried both with and without these attributes 
    $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
} 
catch(PDOException $e) 
{ 
    echo "Database connection error: " . $e->getMessage()); 
    exit; 
} 

Wenn dieser Code ausgeführt wird - mit einer nicht vorhandenen Datenbankname - bekomme ich folgende Fehlermeldung:

Fatal error: Uncaught PDOException: SQLSTATE[HY000] [1044] Access denied for user 'user' to database 'db' in .....

Er druckt alle Daten aus. Falls ein Fehler in der Anmeldung auftritt, möchte ich nur, dass der Code beendet wird und eine Nachricht in eine Protokolldatei geschrieben wird.

Warum fängt die fangen diese Ausnahme nicht?

Ich verwende einen lokalen Apache-Server auf meinem Windows-Computer. Vielleicht liegt das an einer Fehlkonfiguration?

Jede Hilfe wird geschätzt.

+3

Führen Sie diesen Code in einem Namespace aus? Versuchen Sie vielleicht, vor PDOException ('\ PDOException') einen Backslack einzufügen, um den Root-Namespace zu verwenden? Wenn Sie dies nicht tun, durchsucht es Ihren aktuellen Namespace (zB. 'KMK \ apps \ PDOException') – h2ooooooo

+0

das könnte Ihnen helfen: https://stackoverflow.com/questions/10890813/pdoexception-not-being-caught – user1915746

+0

Vielen Dank @ h2ooooooo. Der Code befand sich in einem Namespace. Wenn Sie es als Antwort schreiben, werde ich es als das richtige markieren – KMK

Antwort

2

Sie erhalten diesen Fehler, weil Sie den Code in einem Namespace ausführen.

Nehmen Sie den folgenden Code ein:

<?php 

namespace foo\bar; 

// This PDOException has the full class name \foo\bar\PDOException 
// because it's created in a namespace 
class PDOException extends \Exception {} // Just so PHP won't throw an error 

$exception1 = new PDOException('foo'); // Referencing the local namespace (foo\bar) 
$exception2 = new \PDOException('foo'); // Referencing the global namespace 
//    ^-- The backslash means we are refering to the global namespace 

var_dump(get_class($exception1)); // string(20) "foo\bar\PDOException" - local scope 
var_dump(get_class($exception2)); // string(12) "PDOException" - global scope 

DEMO

Wie Sie, wenn wir innerhalb eines Namespace sind sehen und nicht unsere globale Klassen mit einem Backslash voranstellen, wird es automatisch Angenommen, die Klasse, auf die Sie verweisen, ist eine untergeordnete Klasse unter demselben Namespace.

Lösung:

Daher müssen Sie \PDOException anstatt PDOException verwenden. Auf diese Weise weiß es, in der globalen Bereich der Klassen statt in Ihrem aktuellen Namespace zu suchen.

Verwandte Themen