主义(DBAL)错误处理,同时执行多个查询

问题描述:

我有一个模式SQL文件(语法错误),包括设置数据库主义(DBAL)错误处理,同时执行多个查询

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是我ncorrect。它的文档说它失败时返回false,但它返回true

我应该如何在这里做异常处理?我如何检查我的查询是否有错误?

+1

主义DBAL使用m ysqli驱动程序。我检查了最新的代码,当mysqli的prepare为语法错误返回false时,DBAL应该抛出一个异常。问题与mysqli驱动程序? http://www.doctrine-project.org/api/dbal/2.5/source-class-Doctrine.DBAL.Driver.Mysqli.MysqliStatement.html#83-102 –

+0

@MattS问题不在于Doctrine DBAL中,它在PDO中。我添加了我的答案。 – Neodan

问题不在于Doctrine DBAL,而是在PDO中。如果更改驱动程序mysqli(而不是pdo_mysql),那么你会得到这样的错误消息:

在执行“CREATE TABLE IF NOT [主义\ DBAL \异常\ SyntaxErrorException]发生
例外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;':
您的SQL语法错误;检查 对应于你的MySQL服务器版本正确的语法使用 附近手册 'CREATExxxxxxxxxx TABLE IF NOT EXISTS example2
id INT(11)NOT NULL AUTO_I' 在行8

如果使用PDO直接(不通过主义),那么你也不要。如果你想,它会正常工作,则必须禁用预处理语句(设置PDO::ATTR_EMULATE_PREPARES为0)的仿真收到错误信息。