2016-01-11 3 views
2

Я использую следующий класс для того, чтобы создать и открыть соединение PDO ДБ:PDO исключение не поймают при доступе с помощью класса

class DBCxn { 
    // What Data Source Name to connect to? 
    public static $dsn='mysql:host=localhost;dbname=dbname'; 
    public static $user = 'root'; 
    public static $pass = 'root'; 
    public static $driverOpts = null; 

    // Internal variable to hold the connection 
    private static $db; 
    // no cloning or instantiating allowed 
    final private function __construct() {} 
    final private function __clone() {} 

    public static function get() { 
     // Connect if not allready connected 
     if (is_null(self::$db)) { 
      self::$db = new PDO(self::$dsn, self::$user, self::$pass, self::$driverOpts);  
     } 

    // Return the connection 
    return self::$db; 
    } 

} 

При попытке доступа к нему следующим образом и подается запрос выходит из строя (тес вместо теста) не будет сгенерирован исключение:

$db = DBCxn::get(); 


try { 

    foreach($db->query('SELECT * from tes') as $row) { 
     print_r($row); 
    } 
    $db = null; 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 

код возвращает предупреждение: Недопустимый аргумент, поставляемый для Еогеаспа()

Почему не исключение существа поймают?

ответ

2

Предупреждения и ошибки, сгенерированные PHP (например, предупреждение о недопустимом аргументе, которое вы получаете): не всегда исключения. Даже когда они есть, вы специально поймаете PDOException, а недопустимый аргумент - не PDOException.

PDO::query обычно возвращает false, если в запросе есть ошибка (следовательно, почему foreach жалуется на недопустимый аргумент). Чтобы вызвать исключение, вместо этого вы должны позвонить

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

перед тем, как сделать запрос.

Смежные вопросы