我有一个查询
INSERT INTO table (id) VALUES (5);
该表已有一张具有此ID的记录。所以查询失败了。
我的mysqli类扩展看起来像这样:
<?php
class my_mysqli extends mysqli {
function __construct($config) {
$this->DB = parent::__construct($config['HOST'], $config['USER'], $config['PASS'], $config['DB']);
}
function exe($sql) {
if ( ! $st = $this->DB->prepare($sql)) {
trigger_error($st->error); // this one isn't triggered
}
if ( ! $st->execute()) {
trigger_error($st->error); // this one is triggered
}
// ..then parse results and close
}
}
$mysqli->execute()
之后我记录$mysqli->error
并获取:
*给mysqld_stmt_execute *
的未知预处理语句处理程序(0)但我希望看到SQL错误:
键'PRIMARY'重复输入'5'
答案 0 :(得分:1)
实际上第一个街区没什么意义。看看你在做什么:
if ( ! $st = $this->DB->prepare($sql)) {
trigger_error($st->error); // this one isn't triggered
}
“如果没有 $ st对象 - 请调用此对象的方法”。
下一个更好但是无论如何 - mysqli_stmt类中没有错误方法或属性。
function exe($sql) {
if ( ! $st = $this->DB->prepare($sql)) {
throw new Exception($this->DB->error);
}
if ( ! $st->execute()) {
throw new Exception($this->DB->error);
}
}
异常更好,因为它们可以被捕获并包含开箱即用的堆栈跟踪。
顺便说一句,使用不带参数的prepare()是没有意义的。所以,代码实际上必须是
function exe($sql) {
if ( ! $this->DB->query($sql) ) {
throw new Exception($this->DB->error);
}
}