执行多个查询时的 Doctrine (DBAL) 错误处理
Posted
技术标签:
【中文标题】执行多个查询时的 Doctrine (DBAL) 错误处理【英文标题】:Doctrine (DBAL) Error Handling while Executing Multiple Queries 【发布时间】:2016-04-18 09:43:29 【问题描述】:我有一个架构 sql 文件(有语法错误),包括对设置数据库的多个查询
example.sql
CREATE TABLE IF NOT EXISTS `example` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
CREATExxxxxxxxxx TABLE IF NOT EXISTS `example2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
example.php
$sqlContent = file_get_contents("example.sql");
$stmt = $conn->prepare($sqlContent);
$result = $stmt->execute();
即使我的 sql 不正确,execute 方法也不会抛出任何异常。它的文档说它在失败时返回false
,但它返回true
。
这里应该如何处理异常?如何检查我的查询是否有错误?
【问题讨论】:
Doctrine DBAL 使用 mysqli 驱动程序。我检查了最新的代码,当 mysqli 的 prepare 为语法错误返回 false 时,DBAL 应该抛出异常。 mysqli驱动有问题吗? doctrine-project.org/api/dbal/2.5/… @MattS 问题不在于 Doctrine DBAL,而在于 PDO。我添加了我的答案。 【参考方案1】:问题不在于 Doctrine DBAL,而在于 PDO。如果您将驱动程序更改为mysqli
(而不是pdo_mysql
),则会收到如下错误消息:
[Doctrine\DBAL\Exception\SyntaxErrorException] 执行 'CREATE TABLE IF NOT EXISTS 时发生异常
example
(`id` int(11) NOT NULL AUTO_INCREMENT, `name` text COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
AUTO_INCREMENT=1 ; CREATExxxxxxxxxx 表如果不存在
example2
(`id` int(11) NOT NULL AUTO_INCREMENT, `name` text COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
AUTO_INCREMENT=1 ;': 您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 'CREATExxxxxxxxxx TABLE IF NOT EXISTS
example2
(id
int(11) NOT NULL AUTO_I' 在第 8 行附近
如果您直接使用 PDO(不是通过 Doctrine),那么您也不会收到错误。
如果您希望它正常工作,那么您必须禁用准备好的语句的模拟(将 PDO::ATTR_EMULATE_PREPARES
设置为 0)。
【讨论】:
以上是关于执行多个查询时的 Doctrine (DBAL) 错误处理的主要内容,如果未能解决你的问题,请参考以下文章
Doctrine DBAL 2:fetchAll() 不必要的数组维度
Doctrine DBAL 查询生成器上缺少 insert() 方法
Prooph Eventstore (PDO) 和 Doctrine DBAL 导致多个连接
学说:ORM QueryBuilder 或 DBAL QueryBuilder