【发布时间】:2012-01-01 01:52:14
【问题描述】:
我有一个 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();
?>
【问题讨论】:
-
如果异常以默认错误处理程序结束,你能显示消息吗?你也确实在
->blindValue中有错字。这将导致致命错误,而不是异常。 -
@mario,您的意思是上面添加的
$err中的默认值?我也加了一个,没有错误信息。脚本会跳过整个 catch 块。 -
@mario,是的,这是第二个错字。第一个是不存在的列。
-
如果您确实收到错误消息
PHP Fatal error: Call to undefined method PDOStatement::blindValue(),则无法通过try/catch声明捕获。这不是例外,是解释器错误。 -
@mario,我明白了.. 但是即使我纠正了第二个错误,也无法捕获第一个错误。
标签: php mysql pdo error-handling