【问题标题】:Cannot get the number of rows and fetch when using MySQLi prepared statement使用 MySQLi 准备好的语句时无法获取行数并获取
【发布时间】:2017-09-17 10:04:35
【问题描述】:

我想从数据库中获取行数,但是当我尝试这样做时,$g_check 变量将等于0,我的代码将回显$sugg_title 消息,该消息位于@987654325 @ 陈述。但是在数据库中有 4 个插入的组,所以 num_rows 属性应该返回 4。

$sql = "SELECT DISTINCT gp.logo, gp.name
        FROM gmembers AS gm
        LEFT JOIN groups AS gp ON gp.name = gm.gname
        WHERE gp.creator != ? AND gm.mname != ? LIMIT 10";
$stmt = $conn->prepare($sql);
$stmt->bind_param('ss',$log_username,$log_username);
$stmt->execute();
$g_check = $stmt->num_rows;
if ($g_check > 0){
  $result = $stmt->get_result();
  while ($row = $result->fetch_assoc()) {
    $agList .= '<a href="group.php?g='.$row["name"].'"><img class="group_margin" src="groups/'.$row["name"].'/'.$row["logo"].'" alt="'.$row["name"].'" title="'.$row["name"].'" width="70" height="70" /></a>';
  }
}else{
  $sugg_title = "You have no group suggestions at the moment. Click ";
  $sugg_title .= '<a href="all_groups.php">here</a> to view all groups.';
}

我将strore_result()fetch() 函数放在execute() 之后,但随后我收到以下错误消息:“致命错误:未捕获的错误:在布尔值上调用成员函数 fetch_assoc()"

【问题讨论】:

  • 你是否在 mysql 工作台中使用给定的参数执行了相同的 sql 代码?它返回 4 吗?
  • 我想你想使用affected_rows,而不是num_rows。看看affected_rows
  • 是的,affected_rows 解决了问题!

标签: php mysql mysqli row prepared-statement


【解决方案1】:

如果要使用mysqli_stmt::$num_rows(即检查prepared statement上的行数),需要在执行prepared statement后使用$stmt-&gt;store_result()才能检查行数。这意味着在我们检查返回多少行之前将结果存储到内存中。

$stmt = $conn->prepare($sql);
$stmt->bind_param('ss',$log_username,$log_username);
$stmt->execute();
$stmt->store_result(); // Need to store the result into memory first
if ($stmt->num_rows) {
    // ...

但是,如果你想使用mysqli_result::$num_rows(在你从语句结果转换的MySQLi-result上),你需要在$result = $stmt-&gt;get_result();之后这样做,并使用$result-&gt;num_rows;,如下所示。

$stmt = $conn->prepare($sql);
$stmt->bind_param('ss',$log_username,$log_username);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows) {
    while ($row = $result->fetch_assoc()) {
    // ....

最后,他们都应该做同样的事情——提供原始准备查询返回的行数。

注意
请务必注意,您不能在同一语句中使用 store_result()get_result()。这意味着在第一个示例中,您不能转换为 mysqli-result 对象(通过使用get_result(),它允许您使用标准的fetch_assoc() 方法)。由于store_result() 将结果存储到内存中,get_result() 没有任何东西可以转换,反之亦然。

这意味着如果你使用store_result(),你需要通过statement-fetch,mysqli_stmt::fetch()获取并通过mysqli_stmt::bind_result()绑定结果。如果您使用get_result(),您应该检查生成的 MySQLi-result 对象上的行数(如第二个示例所示)。

因此,您应该构建您的代码,以便您只需要使用其中一个。


话虽如此,像 cmets 中建议的那样使用 affected_rows 并不是适合这项工作的工具 - 根据 mysqli_stmt::$affected_rows 上的手册(同样适用于常规查询,mysqli::$affected_rows):

返回受 INSERT、UPDATE 或 DELETE 查询影响的行数。
此函数仅适用于更新表的查询。要从 SELECT 查询中获取行数,请改用 mysqli_stmt_num_rows()

【讨论】:

  • 这也行,你解释得很好,所以以后我会用这个方法代替affected_rows
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 2010-12-24
  • 1970-01-01
相关资源
最近更新 更多