【问题标题】:prepared statement failing for "SELECT" command, using mysqli in PHP“SELECT”命令的准备语句失败,在 PHP 中使用 mysqli
【发布时间】:2014-10-03 14:19:10
【问题描述】:

我已经能够使用 mysqli(在 PHP 中)执行多个准备好的语句。 但是,由于某种原因,当我尝试运行“SELECT”命令时,准备好的语句总是会遇到错误。 比如下面这行就成功了:

$stmt=$mysqli->prepare("UPDATE events SET category='m' WHERE id=(?)");

但是,以下行将失败:

$stmt=$mysqli->prepare("SELECT * FROM events WHERE id=(?)");

当我说失败时,我的意思是接下来的三行将为 UPDATE 命令返回 1(表示更改了一行)...

$stmt->bind_param('i',$id);
$stmt->execute();
echo $stmt->affected_rows;

接下来的三行将为 SELECT 返回 0:

$stmt->bind_param('i',$id);
$stmt->execute();
echo $stmt->num_rows;

作为记录,我知道准备好的语句对于单个 SELECT 来说效率不高 - 这个问题主要是学术性的。

【问题讨论】:

  • 用 $stmt->num_rows 代替 SELECT 命令的 $stmt->affected_rows 得到 0。所以这仍然不能解决问题 - 我期待 1。
  • I'm aware that prepared statements aren't that efficient for a single SELECT - 谁在暗示?它们的效率不亚于任何 SQL 查询
  • 这似乎是许多博客中反复出现的观点。声称是由于您必须与 MySQL 服务器通信两次(一次使用准备好的语句,然后第二次使用实际参数),因此双程会产生性能成本。你认为这是不正确的吗?
  • 执行函数将 Statement 和 Bind Vars 都发送到 MySQL,而不是两个单独的步骤。 MySQL 将识别它是一个准备好的语句并检查它的编译语句缓存。如果语句已经在缓存中,它将加载并使用它;如果没有,那么它将编译该语句并将其存储在已编译的语句缓存中。然后它将绑定变量添加到它的执行中......对于语句和绑定变量,仍然只有一个与数据库服务器的通信,而不是每个单独的通信
  • 感谢您的精彩回答

标签: php mysql mysqli


【解决方案1】:

此函数 (affected_rows) 仅适用于更新表的查询。为了从 SELECT 查询中获取行数,请改用 mysqli_stmt_num_rows()。

http://php.net/manual/en/mysqli-stmt.affected-rows.php

确保先存储结果!!

$stmt->execute();

/* store result */
$stmt->store_result();

printf("Number of rows: %d.\n", $stmt->num_rows);

【讨论】:

【解决方案2】:

mysqli_affected_rows

返回受最后一个 INSERT、UPDATE、REPLACE 或 DELETE 查询影响的行数。

【讨论】:

    【解决方案3】:

    如果你这样做,你会得到什么?

    echo $stmt->num_rows;
    

    您不能对 SELECT 语句使用受影响的行方法!

    【讨论】:

    • 谢谢 - 我得到一个 0。这不应该发生 - 我期待一个 1。
    • 看我上面的回答,你需要存储结果才能得到一个非零值。
    猜你喜欢
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 2014-03-16
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多