想在报告中看到SQL错误

时间:2013-05-13 21:17:04

标签: php mysql mysqli

我有一个查询

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'

1 个答案:

答案 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);
    }
}