Bạn cần đặt thuộc tính chế độ lỗi PDO ::ATTR_ERRMODE thành PDO ::ERRMODE_EXCEPTION.
Và vì bạn mong đợi ngoại lệ được đưa ra bởi phương thức chuẩn bị (), bạn nên tắt tính năng PDO ::ATTR_EMULATE_PREPARES * . Nếu không, máy chủ MySQL sẽ không "nhìn thấy" câu lệnh cho đến khi nó được thực thi.
<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->prepare('INSERT INTO DoesNotExist (x) VALUES (?)');
}
catch(Exception $e) {
echo 'Exception -> ';
var_dump($e->getMessage());
}
bản in (trong trường hợp của tôi)
Exception -> string(91) "SQLSTATE[42S02]: Base table or view not found:
1146 Table 'test.doesnotexist' doesn't exist"
xem http://wezfurlong.org/blog/2006/apr/using -pdo-mysql /
EMULATE_PREPARES =true có vẻ là cài đặt mặc định cho trình điều khiển pdo_mysql ngay bây giờ. Bộ nhớ cache truy vấn đã được sửa / thay đổi kể từ đó và với trình điều khiển mysqlnd, tôi không gặp vấn đề gì với EMULATE_PREPARES =false (mặc dù tôi chỉ một người có sở thích php, đừng coi thường tôi ...)
*) và sau đó là PDO ::MYSQL_ATTR_DIRECT_QUERY - Tôi phải thừa nhận rằng tôi không hiểu sự tương tác của hai thuộc tính đó (?), Vì vậy tôi đã đặt chúng cả hai, như
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
PDO::ATTR_EMULATE_PREPARES=>false,
PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
));