我有一个PHP脚本,在SQL查询的语句中有两个故意的拼写错误:
try
{
$stmt = $dbh->prepare("SELECT COUNT(*) FROM Product WHERE non-existent_column=?");
$stmt->blindValue(1, $id, PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetchColumn();
}
catch(PDOException $err)
{
var_dump($err->getMessage());
var_dump($dbh->errorInfo());
}
但是,即使将属性设置为PDO::ERRMODE_EXCEPTION
,脚本也不会捕获错误。我在这里缺少什么?
更新
这是完整的脚本。第二个错字blindValue
已被还原。错误仍未解决:
<?php
$user= "user";
$password = "password";
$dsn = "mysql:dbname=Catalogue;host=localhost";
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ERRMODE_EXCEPTION);
$id = 1000;
try
{
$stmt = $dbh->prepare("SELECT COUNT(*) FROM Product WHERE non-existent_column=?");
$stmt->bindValue(1, $id, PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetchColumn();
}
catch(PDOException $err)
{
echo "caught";
var_dump($err->getMessage());
var_dump($dbh->errorInfo());
exit();
}
var_dump($stmt);
var_dump($row);
echo "uncaught";
exit();
?>
答案 0 :(得分:12)
您对setAttribute()的调用缺少第一个参数:
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
如果你没有得到
Warning: PDO::setAttribute() expects exactly 2 parameters, 1 given
您的error_reporting level对于开发服务器来说太低了和/或您没有留意the error log或没有设置display_errors=On(您喜欢哪个;我更喜欢错误记录display_errors)。
编辑:请尝试
<?php
echo 'php version: ', phpversion(), "\n";
try {
$dbh = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
echo 'client version: ', $dbh->getAttribute(PDO::ATTR_CLIENT_VERSION), "\n";
echo 'server version: ', $dbh->getAttribute(PDO::ATTR_SERVER_VERSION), "\n";
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
catch(PDOException $err) {
var_dump($err->getMessage());
die('...');
}
$id = 'foo';
try
{
$stmt = $dbh->prepare("SELECT COUNT(*) FROM Product WHERE `non-existent_column`=?");
$stmt->bindValue(1, $id, PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetchColumn();
}
catch(PDOException $err)
{
var_dump($err->getMessage());
var_dump($dbh->errorInfo());
die('....');
}
echo 'done.';
打印在我的机器上
php version: 5.3.5
client version: mysqlnd 5.0.7-dev - 091210 - $Revision: 304625 $
server version: 5.5.8
string(94) "SQLSTATE[42S22]: Column not found: 1054 Unknown column 'non-existent_column' in 'where clause'"
array(3) {
[0]=>
string(5) "42S22"
[1]=>
int(1054)
[2]=>
string(54) "Unknown column 'non-existent_column' in 'where clause'"
}
....
答案 1 :(得分:3)
$stmt->blindValue(1, $id, PDO::PARAM_INT);
这应该是$stmt->bindValue(1, $id, PDO::PARAM_INT);
您无法捕获致命错误,例如调用未定义的函数/方法。
答案 2 :(得分:-2)
我经历过这一点并意识到这是我的PHP配置文件。
xdebug.show_exception_trace = 1
如果这是真的,将始终出现异常。