MySQLi - 这个例子中data_seek有什么意义?

时间:2015-07-03 00:12:04

标签: php mysql mysqli

我是MySQLi的新手并遵循一些例子。我不清楚为什么在for循环中使用函数data_seek()。如果我没有弄错,它会返回true / false,具体取决于当前行中是否有数据传递给它。我只是感到困惑,因为没有它,代码运行正常,所以它出现了。这是一个例子:

<?php

require_once 'login.php';

$connection = new mysqli($db_hostname, $db_username, $db_password,   $db_database);

if($connection->connect_error) die("Connection error: " . $connection->connect_error);

$query = "SELECT * FROM classics";
$result = $connection->query($query);

if(!$result) die($connection->error);

$rows = $result->num_rows;

for($i =0; $i < $rows; ++$i)
{
    $result->data_seek($i);    ///////////////////Why is this here?
    $row = $result->fetch_array(MYSQLI_ASSOC);

    echo 'Author: '     .$row['author']   .'<br>';
    echo 'Title: '      .$row['title']    .'<br>';
    echo 'Category: '   .$row['category'] .'<br>';
    echo 'Year: '       .$row['year']     .'<br>';
    echo 'ISBN: '       .$row['isbn']     .'<br><br>';

}

$result->close();
$connection->close();

&GT;

1 个答案:

答案 0 :(得分:1)

这通常似乎是不必要编码的情况。

当你调用fetch_array()时,它会返回该行,但也会自动将行指针前进到下一行。在这种情况下,data_seek将在下一次迭代期间寻找它已经处于同一行(与您的示例相反,如果该行存在,它不会返回true / false,但字面意思是下一次对fetch_array的调用返回给定数字的行。)

最有可能的情况是,如果您希望再次迭代相同的结果集,或者在结果集周围寻找奇怪的东西(不太可能),这不会发生在这里。

更常见的版本是:

while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
  echo 'Author: '......;
}

此版本相当有效并且可以使用,但是,它不适用于缓冲结果集。正确使用num_rows()要求整个MySQL结果集在迭代之前缓存到客户端,这对于小数据集是可以的,但如果你处理非常大的数据集则会使用大量内存。另一方面,在客户端缓冲结果可以释放服务器连接和资源,因此两者都有起伏。