$result->num_rows 总是返回 0 [重复]

Posted

技术标签:

【中文标题】$result->num_rows 总是返回 0 [重复]【英文标题】:$result->num_rows always returns 0 [duplicate] 【发布时间】:2014-03-14 19:27:59 【问题描述】:

在阅读了大量线程、教程和其他内容后 - 我想在这里发帖并希望有人可以帮助我。 我尝试了所有可以得到的建议,但仍然没有用。

这是我的代码:

$prep_stmt = "SELECT id, DATE_FORMAT(added,'%d.%M'), title FROM offers ORDER BY added DESC LIMIT ?, ?;";
$stmt = $mysqli->prepare($prep_stmt);
$stmt->bind_param ('ii',$lowlimit, $page);
$stmt->execute();
$stmt->bind_result($id, $added, $title);
while ($stmt->fetch()) 
... # some random output here

$count = $stmt->num_rows;
echo "c -> ". $count;exit;

我总是得到“c -> 0”......但是已经有输出......那我做错了什么? :/

【问题讨论】:

【参考方案1】:

您需要在访问num_rows 属性之前调用store_result() 方法。

来自php manual documentation的评论:

如果你不使用mysqli_stmt_store_result(),并且在执行完准备好的语句后立即调用这个函数,这个函数通常会返回0,因为它无法知道结果集中有多少行,因为结果集中没有尚未保存在内存中。

mysqli_stmt_store_result() 将结果集保存在内存中,因此您可以在执行语句并保存结果集后立即使用此功能。

您的代码应如下所示:

$stmt->execute();
$stmt->store_result();

$stmt->bind_result($id, $added, $title);

while ($stmt->fetch()) 
    # some random output here...


$count = $stmt->num_rows;

【讨论】:

【参考方案2】:

取自php.net你要先存起来。

$stmt->store_result();
$count = $stmt->num_rows

【讨论】:

做到了——但它没有那样工作——Amal 的方式帮助了我 我只是在展示功能,而不是提供复制/粘贴示例供您使用。【参考方案3】:

来自PHP手册,先评论http://fr2.php.net/manual/fr/mysqli-stmt.num-rows.php:

请注意,有时会错过阅读此功能的重要手册条目的人:

如果你不使用mysqli_stmt_store_result(),并且立即调用 这个函数在执行一个准备好的语句后,这个函数将 通常返回 0,因为它无法知道有多少行 结果集,因为结果集还没有保存在内存中。

mysqli_stmt_store_result( ) 将结果集保存在内存中,因此您 双方都执行语句后可以立即使用此功能 并保存结果集。

如果您不保存结果集但仍想使用此功能 您实际上必须一次循环遍历结果集 在使用此函数之前使用 mysqli_stmt_fetch( ) 来确定 行数。

一个想法,如果你想确定行数没有 存储结果集并在循环之后,为什么不只是 每次有一行时,只需在循环中保留一个内部计数器 获取并保存函数调用。

简而言之,这个函数只有在你保存结果时才真正有用 设置并希望在循环之前确定行数 它,否则你几乎可以像我建议的那样重新创建它的用途。

【讨论】:

以上是关于$result->num_rows 总是返回 0 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter 中 $query>num_rows() 和 $this->db->count_all_results() 之间的区别 & 推荐哪一个

php数据访问

当结果不为空时,num_rows() 未返回正确的行数

PHP读取数据库表显示到前台

PHP $stmt->num_rows 不适用于准备好的语句[重复]

相机结果总是返回 RESULT_CANCELED