执行多个查询时的Doctrine(DBAL)错误处理

Mur*_*SAÇ 5 php sql pdo doctrine dbal

我有一个架构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 ;
Run Code Online (Sandbox Code Playgroud)

使用example.php

$sqlContent = file_get_contents("example.sql");
$stmt = $conn->prepare($sqlContent);
$result = $stmt->execute();
Run Code Online (Sandbox Code Playgroud)

即使我的sql不正确,execute方法也不会抛出任何异常.它的文档说它false在失败时返回,但它返回true.

我该如何处理异常处理?如何检查我的查询是否有错误?

Neo*_*dan 2

问题不在于 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
Run Code Online (Sandbox Code Playgroud)

自动增量=1;
如果不存在则创建Exxxxxxxxxx表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
Run Code Online (Sandbox Code Playgroud)

AUTO_INCRMENT=1 ;':
您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 8 行的'CREATExxxxxxxxxx TABLE IF NOT EXISTS example2( int(11) NOT NULL AUTO_I' 附近使用的正确语法
id

如果您直接使用 PDO(不通过 Doctrine),那么您也不会收到错误。

如果您希望它正常工作,则必须禁用准备语句的模拟(设置PDO::ATTR_EMULATE_PREPARES为 0)。