gpt4 book ai didi

php - 使用 MySQLi 准备语句时无法获取行数和提取

转载 作者:行者123 更新时间:2023-11-29 02:13:11 27 4
gpt4 key购买 nike

我想从数据库中获取行数,但是当我尝试这样做时,$g_check 变量将等于 0,我的代码将回显$sugg_title 消息,位于 else 语句中。但是在数据库中有 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() 之后,但随后我收到此错误消息:“< em> fatal error :未捕获错误:调用 bool 值上的成员函数 fetch_assoc()"

最佳答案

如果要使用mysqli_stmt::$num_rows(即检查prepared statement上的行数),需要使用$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 上),你需要在 $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()获取,并通过绑定(bind)结果>mysqli_stmt::bind_result()。如果您使用 get_result(),您应该检查生成的 MySQLi-result 对象的行数(如第二个示例所示)。

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


也就是说,像评论中建议的那样使用 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 - 使用 MySQLi 准备语句时无法获取行数和提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46262828/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com