2015-07-03 23 views
1

我是MySQLi的新手,並遵循一些示例。我不清楚爲什麼函數data_seek()在for循環中被使用。如果我沒有弄錯,它會根據傳遞給它的當前行中是否有數據返回true/false。我只是感到困惑,因爲沒有它的代碼運行良好,所以它顯示。下面是示例:MySQLi - 本例中data_seek的要點是什麼?

<?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(); 

>

+2

是的,看起來毫無意義:fetch_array獲取一行數據,然後將指針移到下一行。 –

回答

1

這通常似乎是不必要的編碼的情況。

當您調用fetch_array()時,它會返回行,但也會自動將行指針前進到下一行。在這種情況下,data_seek將在下一次迭代期間尋找它已經在的同一行(與您的示例相反,如果該行存在,它不會返回true/false,但會直接進行下一次調用fetch_array返回給定數字的行)

這可能有用的最有可能的情況是,如果您希望再次遍歷相同的結果集,或者在結果集周圍尋找奇怪(不太可能)在這裏發生。

一種更爲常見的版本是去:

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

這個版本是合理有效的,並會工作,但是,它不會與緩衝的結果集工作。正確使用num_rows()要求整個MySQL結果集在迭代之前緩存到客戶端中,對於小數據集可以正常使用,但是如果您在處理非常大的數據集時會使用大量內存。另一方面,在客戶端緩衝結果可以釋放服務器連接和資源,因此兩者都有起伏。

+0

謝謝你們的回覆,我現在更好地理解這個例子,並且可以繼續 – David