我是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;
答案 0 :(得分:1)
这通常似乎是不必要编码的情况。
当你调用fetch_array()时,它会返回该行,但也会自动将行指针前进到下一行。在这种情况下,data_seek将在下一次迭代期间寻找它已经处于同一行(与您的示例相反,如果该行存在,它不会返回true / false,但字面意思是下一次对fetch_array的调用返回给定数字的行。)
最有可能的情况是,如果您希望再次迭代相同的结果集,或者在结果集周围寻找奇怪的东西(不太可能),这不会发生在这里。
更常见的版本是:
while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
echo 'Author: '......;
}
此版本相当有效并且可以使用,但是,它不适用于缓冲结果集。正确使用num_rows()要求整个MySQL结果集在迭代之前缓存到客户端,这对于小数据集是可以的,但如果你处理非常大的数据集则会使用大量内存。另一方面,在客户端缓冲结果可以释放服务器连接和资源,因此两者都有起伏。