【问题标题】:How to verify return value from MySQLi->prepare()如何验证 MySQLi->prepare() 的返回值
【发布时间】:2014-11-18 05:32:34
【问题描述】:

我已经搜索了这个问题的答案,但无济于事。我与您联系,我的程序员同事。 :-)

我有以下看似简单的 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 Prepare SELECT marketid, type, quantity, price, datetime, bundleid, state, stoplossprice FROM orders WHERE type = ?和状态 = ? 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 marketid、类型、数量、价格、日期时间、 bundleid, state, stoplossprice 来自订单 WHERE type = 'Buy' AND state = 'Pending' 第223话
222 关闭 stmt
第222章 放弃

帮助我欧比旺克诺比,你是我唯一的希望(是的,已经很晚了,我感觉有点邋遢)!

【问题讨论】:

  • 你应该在执行后检查错误。
  • prepare 不会影响数据库中的任何行,因此预期结果为 -1。您应该在execute 之后检查错误。如果有错误,请粘贴到此处以便我们提供帮助。
  • 对“$stmt->execute()”的调用会导致程序意外终止。所以,我看不到来自$stmt->execute() 的返回值。我可能应该在我原来的问题中包含这个。
  • 这里有更多信息,希望对您有所帮助。我尝试使用 select 语句中的静态字符串,结果相同。也尝试使用MySQLi->query(),但程序在MySQLi->query() 执行时终止。我使用几乎相同的代码编写了许多其他选择、插入和更新语句。我真的被这个难住了。

标签: php mysqli


【解决方案1】:

我终于找到了答案。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多