PHP 即使我设置了错误处理也不显示 PDO 错误

PHP doesn't display PDO error even if I set error handling

我需要使用 PDO 向数据库中插入一行。但它不起作用,也没有打印任何错误,所以我不知道问题出在哪里。

连接没问题,因为我可以 运行 UPDATE 查询。

但是在这个查询上它卡住了,没有打印任何错误:

$dbtype     = "mysql";
$dbhost     = "xxx";
$dbname     = "xxx";
$dbuser     = "xxx";
$dbpass     = "xxx";

$db = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "INSERT INTO users (id, name) VALUES (:id,:name)";
$q = $db->prepare($sql);

$q->execute(array(
    ':id'=>$id,
    ':name'=>$name
));

除了这个命令还有其他调试方式吗?

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

可能您关闭了 error reporting,并且您没有尝试在代码抛出异常时捕获异常。

因此您必须将代码放入 try and catch 块中,例如

try {
    //your stuff
} catch(PDOException $e) {
    echo $e->getMessage();
}

因为你的 PDO 被设置为在发生错误时抛出异常,所以你必须用这个块来捕获它。此外,我建议您打开错误报告以获取有用的错误消息(仅在暂存时从未在生产中使用)。

我遇到了同样的问题,没有看到来自 mysql 的任何错误消息。经过研究,问题似乎与 PHP 本身无关,而与 mysql 服务器配置有关。变量 lc_messages_dir 的默认值指向不存在的目录。在mysqld.cnf中添加一行后,重启mysql服务器,终于成功了。对我来说,以下是正确的:

lc_messages_dir=/usr/share/mysql

在mysql参考手册中有描述: https://dev.mysql.com/doc/refman/5.7/en/error-message-language.html