如何验证MySQL的返回值> prepare()

时间:2014-11-18 05:32:34

标签: php mysqli

我搜索了这个问题的答案,但是无济于事。我联系你的同事们。 : - )

我有以下看似简单的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准备SELECT市场,类型,数量,价格,日期时间,套利,状态,止损价格从订单WHERE类型=? AND state =?   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执行SELECT市场营销,类型,数量,价格,日期时间,   bundleid,state,stoplossprice FROM orders WHERE type ='Buy'AND state ='Pending'   223退出   222关闭stmt
  222退出

帮助我Obi-wan Kenobi,你是我唯一的希望(是的,已经很晚了,我感觉有点蹩脚)!

1 个答案:

答案 0 :(得分:0)

我终于能够找到答案了。

在执行我发布的代码之前,我正在执行其他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的努力!