如何验证来自 MySQLi->prepare() 的返回值



我已经上下搜索了这个问题的答案,但无济于事。 我向你们伸出援手,我的程序员同事。 :-)

我有以下看似简单的PHP代码:

$query = "SELECT marketid, type, quantity, price, datetime, bundleid, state, stoplossprice FROM orders WHERE type = ? AND state = ?";
$stmt = $login->mySQLi->prepare($query);
if(!$stmt) {
    throw new Exception(mysqli_error($login->mySQLi));
}
$stmt->bind_param("ss", $strOrderType, $strOrderState);
if($stmt)
{
    if(!$stmt->execute())
    {
        // Return an error
    }
}
$stmt->store_result();
$stmt->bind_result($marketid, $ordertype, $quantity, $buyprice, $buydatetime, $bundleid, $orderstate, $stoplossprice);
while ($stmt->fetch()) {
    // Do something with the returned data
}
$stmt->close();

我在其他地方也有几乎完全相同的代码,在其他地方它可以工作。 但是,由于某种原因,它在执行 execute() 语句时终止。

此外,在执行 prepare() 语句后,$stmt->affected_rows等于 -1。

我在 MySQLi 文档中读到,值 -1 表示"-1 表示查询返回错误"。 但是,因为我无法弄清楚如何从$stmt输出错误消息. $stmt->errno$stmt->error没有值。

我还检查了MySQL的日志文件,它显示了以下内容:

141117 21:21:39 222 准备选择市场ID,类型,数量,价格,日期时间,捆绑ID,状态,止损价格从订单中类型= ?和状态 = ? 222 统计 223 统计
141117 21:21:54 222 统计
223 统计
141117 21:21:55 222 统计
223 统计
141117 21:21:56 222 统计
223 统计
141117 21:21:57 222 执行选择市场ID,类型,数量,价格,日期时间, 捆绑ID,状态,止损价格从订单,其中类型="买入"和状态="待处理" 223 退出
222 关闭标准
222 退出

帮我欧比旺克诺比,你是我唯一的希望(是的,晚了,我感觉有点啪啪啪)!

我终于能够找到答案了。

在执行我

发布的代码之前,我正在执行其他MySQL语句。 在这些语句中,我执行了mysqli_report(MYSQLI_REPORT_ALL);.

正如我在 PHP 文档中学到的,调用 mysqli_report(MYSQLI_REPORT_ALL); 时应该小心。 以下是 mysqli_report() 文档的摘录,解释了这个问题:

"使用此功能时要非常小心 - 这是每个进程的设置。如果您的服务器设置为对多个请求重用单个 PHP 进程,这意味着在任何脚本中此函数的最后设置将影响使用 mysqli 的所有其他脚本。为了安全起见,请始终在脚本末尾调用。PHP的CGI版本可能是安全的。

我在第一个 MySQL 语句的末尾添加了mysqli_report(MYSQLI_REPORT_OFF);,现在它就像一个魅力。 谢谢PHP文档!!也感谢Sectus和Antoan Milkov的努力!!

最新更新