PHP MySQL PDO::exec不会引发或抛出多命令脚本的错误

PHP MySQL PDO::exec不会引发或抛出多命令脚本的错误,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,当执行多命令脚本(例如,一些CREATE TABLE命令和一些INSERT命令)时,特别是对于PHP的MySQL PDO驱动程序,即使脚本包含语法或逻辑错误,返回值始终为0(无任何错误信息) 这会阻止您运行长构建脚本,然后检查脚本是否成功执行。如果发生错误,进程将在脚本失败时终止,但仍然存在,并且没有错误信息 我在这个网站和网上搜索了这个问题的答案,似乎普遍的回答是“你对此无能为力”。我目前的解决方案是运行一个“验证构建”查询,检查一些数据并评估对此的响应——这似乎效率极低 有人遇到过这个问题吗

当执行多命令脚本(例如,一些
CREATE TABLE
命令和一些
INSERT
命令)时,特别是对于PHP的MySQL PDO驱动程序,即使脚本包含语法或逻辑错误,返回值始终为0(无任何错误信息)

这会阻止您运行长构建脚本,然后检查脚本是否成功执行。如果发生错误,进程将在脚本失败时终止,但仍然存在,并且没有错误信息

我在这个网站和网上搜索了这个问题的答案,似乎普遍的回答是“你对此无能为力”。我目前的解决方案是运行一个“验证构建”查询,检查一些数据并评估对此的响应——这似乎效率极低


有人遇到过这个问题吗?如果是这样,您是如何确保构建脚本成功执行的?

作为一种解决方法,您可以将包含脚本的字符串拆分为:;然后分别执行每个语句

然后,您可以将任何问题隔离到特定的语句中


在php.net上,PDO::exec没有提到在失败时返回false,但是PDO::query提到了。只要创建一个存储函数来运行脚本,函数在成功时应该返回一个值,并使用选择而不是执行。这样你就知道你的脚本是否成功了。如果命令成功终止,您可以删除安装功能。

您可以使用以下结构获取每个单独命令的信息:

do
{
    // do something with your current rowset
}
while($pdo->nextRowSet());

感谢大家的回答-我没有找到解决方案,而是使用了与数据库迁移紧密相关的原则。

感谢您的回答。我起初考虑过这个解决方案,但后来放弃了,因为您必须对包含“;”的字符串文本预解析build.sql脚本性格当然PDO应该处理这个问题?这听起来是一个有趣的工作。我是否能够在数据库中创建一个只“包装”构建脚本的存储函数?是否可以将整个构建脚本放在一个事务中,然后根据结果提交或返回角色?是的,我遇到了这个问题。真的很痛苦。因为没有错误信息,所以无法知道是否出了问题,以及是什么出了问题。然而,我注意到,PDO在成功时实际返回0,在失败时返回1,但仍然没有错误信息。如果我能把这个问题投两次赞成票,我会的。