微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 使用MySQLi预处理语句时无法获取行数和获取数

我想从数据库获取行数,但是当我尝试这样做时,$g_check变量将等于0,我的代码将回显else语句中的$sugg_title消息.但是在数据库中有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()函数,但后来我得到了这个错误信息:“致命错误:未捕获错误:在布尔值上调用成员函数fetch_assoc()”

解决方法:

如果要使用MysqLi_stmt :: $num_rows(即,检查预准备语句中的行数),则需要在执行预准备语句之后使用$stmt-> 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 = $stmt-> get_result();之后这样做,并使用$result – > 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结果对象上的行数(如第二个示例所示).

你应该为此构建你的代码,这样你只需要使用其中一个.

话虽如此,使用评论中建议的affected_rows不是正确的工具 – 根据MysqLi_stmt :: $affected_rows上的手册(同样适用于常规查询,MysqLi :: $affected_rows):

Returns the number of rows affected by INSERT, UPDATE, or DELETE query.
This function only works with queries which update a table. In order to get the number of rows from a SELECT query, use MysqLi_stmt_num_rows() instead.

> PHP.net on mysqli_stmt::store_result()
> PHP.net on mysqli_stmt::get_result()
> PHP.net on mysqli_stmt::$num_rows

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐