执行多个查询时的 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

避免使用Doctrine DBAL查询构建器select语句将驼峰别名名称转换为小写

Doctrine DBAL 参数不起作用