mysqli_statement :: num_rows()返回错误的值

时间:2008-09-17 05:27:09

标签: php mysql mysqli

我正在使用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 个答案:

答案 0 :(得分:5)

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

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

这有效果吗?

答案 1 :(得分:1)

num_rows不是方法,而是属性。

答案 2 :(得分:0)

看起来你没有声明$ name。

另外,尝试删除bind_result()和fetch(),使其读取如下内容:

$statement->execute();

$statement->store_result();

printf("Number of rows: %d.\n", $statement->num_rows);

答案 3 :(得分: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() 函数或其相应属性才能看到错误消息。