2011-06-22 47 views
50

無論出於何種原因,我需要通過一次mysql結果集兩次。有沒有辦法做到這一點? 我不想重複執行查詢,也不希望重寫腳本,以便將行存儲在某處,然後重新使用它們。如何通過mysql結果兩次?

+1

試試這個函數重置指針。 http://php.net/manual/en/function.mysql-data-seek.php – afarazit

+0

使用哪個MySQL庫?通常可以倒回結果集中的內部指針。 –

回答

79

這是你如何做到這一點:

$result = mysql_query(/* Your query */); 
while($row = mysql_fetch_assoc($result)){ 
// do whatever here... 
} 

// set the pointer back to the beginning 
mysql_data_seek($result, 0); 
while($row = mysql_fetch_assoc($result)){ 
// do whatever here... 
} 

不過,我會說,這似乎不是處理這個問題的正確方法。爲什麼不在第一個循環內進行處理?

+1

爲什麼mysql_fetch_assoc()?我可以使用mysql_fetch_array() –

+0

A-OK:是的,無論你喜歡什麼。 – phant0m

+0

是的,你可以。這是同樣的事情,只是提取它的不同方式(列名/列號)。 –

7

試試mysql_data_seek()是否滿足您的需求。

mysql_data_seek()移動與指定結果 標識符相關聯的結果的MySQL的 內部 行指針爲指向指定 行號。下一次調用MySQL 提取函數,如 mysql_fetch_assoc(),將返回該行 行。

ROW_NUMBER在0開始。ROW_NUMBER 應該是從0到 mysql_num_rows()的範圍內的值 - 1。然而,如果 結果集爲空 (mysql_num_rows()== 0),一個尋求0 將與E_WARNING和 mysql_data_seek()失敗,將返回FALSE

2

您可以使用mysql_data_seek將內部指針移動到數據集的開頭。然後,您可以再次遍歷它。

2

我承認我沒有嘗試這樣做,但你有你的第一次迭代

mysql_data_seek($queryresult,0); 

後試圖去第一條記錄?

0

嗯,你總是可以指望你讀的行數,然後做這樣的事情:

if (rownumber == mysql_num_rows($result)) { mysql_data_seek($result, 0); } 

不知道你爲什麼會需要,但它是。

3

替代數據所追求的是將值存儲到一個數組:

$arrayVals = array(); 
$result = mysql_query(/* Your query */); 
while($row = mysql_fetch_assoc($result)){ 
    $arrayVals[] = $row; 
} 

// Now loop over the array twice instead 

$len = count($arrayVals); 
for($x = 0; $x < $len; $x++) { 
    $row = $arrayVals[$x]; 

    // Do something here  
} 

$len = count($arrayVals); 
for($x = 0; $x < $len; $x++) { 
    $row = $arrayVals[$x]; 

    // Do something else here 
} 
+0

我寫了一個幫助函數,我調用了multiRow(),它可以完成所有這些操作並返回數組行。 –

1

mysqli,你應該做到以下幾點;

$result= $con->query($sql); // $con is the connection object 
$result->data_seek(0);