1

我正在使用 mysqli 类和准备好的语句在 PHP 中编写数据库处理程序类。我试图打印出结果。它没有立即工作,所以我决定进行一些调试。我尝试使用类中的num_rows()方法mysqli_statement,但它一直返回 0。我决定编写一小部分测试代码以使其更简单,这样我就可以看到出了什么问题。然后我能够返回我想要的数据,但该num_rows()方法仍然返回 0,即使它实际上是在选择和检索一些数据。这是代码:

$mysqli = new mysqli('localhost', 'username', 'password', 'database');
if(mysqli_connect_errno())
{
  die('connection failed');
}

$statement = $mysqli->stmt_init();

$query = "SELECT name FROM table WHERE id = '2000'";
if($statement->prepare($query))
{
    $statement->execute();
    $statement->bind_result($name);
    $statement->fetch();
    $statement->store_result();
    echo $statement->num_rows();
    echo $name; 
}
else
{
    echo 'prepare statement failed';
    exit();
}

预期结果是:

1name

实际结果是:

0name

谁能告诉我这是为什么?

4

4 回答 4

6

我想知道 num_rows() 是否相对于当前结果集进行报告。在获取数据之前尝试捕获 num_rows() 。例如

if($statement->prepare($query))
{
    $statement->execute();
    $statement->store_result();
    echo $statement->num_rows();
    $statement->bind_result($name);
    $statement->fetch();
    echo $name; 
}

这有什么影响吗?

于 2008-09-17T05:56:09.127 回答
0

num_rows不是方法,而是属性。

于 2009-03-09T00:33:49.523 回答
0

为了能够使用mysqli_stmt::num_rows(),,您需要将所有行提取到 PHP 中。有两种获取所有内容的方法:使用缓冲store_result()或使用手动获取所有行fetch()

fetch()在您的情况下,您已经通过调用一次开始手动获取。store_result()当另一个提取过程正在进行时,您无法调用。调用store_result()失败并出现错误*。

$statement->fetch();
$statement->store_result(); // produces error. See $mysqli->error;
echo $statement->num_rows();

最简单的解决方案是交换调用这两种方法的顺序。

$statement->store_result();
$statement->fetch(); // This will initiate fetching from PHP buffer instead of MySQL buffer
echo $statement->num_rows(); // This will tell you the total number of rows fetched to PHP

* 由于PHP中的一个bug,在异常报错模式下这个错误不会触发异常。错误消息只能通过mysqli_error()函数或其相应的属性看到。

于 2021-03-05T23:48:44.863 回答
-1

看起来你没有声明 $name。

另外,请尝试删除 bind_result() 和 fetch() 使其显示如下内容:

$statement->execute();

$statement->store_result();

printf("Number of rows: %d.\n", $statement->num_rows);
于 2008-09-17T05:51:42.460 回答