2011-06-22 26 views
50

Vì lý do nào đó, tôi cần phải đi qua một tập kết quả mysql hai lần. Có cách nào để làm điều đó? Tôi không muốn chạy truy vấn hai lần và tôi không muốn phải viết lại tập lệnh để nó lưu trữ các hàng ở đâu đó và sau đó sử dụng lại chúng sau này.Làm thế nào để đi qua kết quả mysql hai lần?

+1

Hãy thử chức năng này đặt lại con trỏ. http://php.net/manual/en/function.mysql-data-seek.php – afarazit

+0

Sử dụng thư viện MySQL nào? Bạn thường có thể tua lại con trỏ bên trong trong resultset. –

Trả lời

79

Đây là cách bạn có thể làm điều đó:

$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... 
} 

Tuy nhiên, tôi sẽ phải nói, điều này dường như không đúng cách để xử lý điều này. Tại sao không xử lý trong vòng đầu tiên?

+1

tại sao mysql_fetch_assoc()? Tôi có thể sử dụng mysql_fetch_array() –

+0

A-OK: Có, bất cứ điều gì bạn thích. – phant0m

+0

Có, bạn có thể. Đó là điều tương tự, chỉ là những cách khác nhau để lấy nó (tên cột/số cột). –

7

Hãy thử xem mysql_data_seek() có thực hiện những gì bạn cần không.

mysql_data_seek() di chuyển con trỏ hàng nội bộ của kết quả MySQL liên quan đến việc xác định kết quả định danh để trỏ đến các quy định số liên tiếp. Cuộc gọi tiếp theo tới hàm tìm nạp MySQL , chẳng hạn như mysql_fetch_assoc(), sẽ trả về hàng đó.

row_number bắt đầu từ 0. Các row_number phải là một giá trị trong khoảng từ 0 để mysql_num_rows() - 1. Tuy nhiên nếu tập kết quả là rỗng (mysql_num_rows() == 0), một tìm cách 0 sẽ thất bại với một E_WARNING và mysql_data_seek() sẽ trả về FALSE

2

Bạn có thể sử dụng mysql_data_seek để di chuyển con trỏ vào đầu bộ dữ liệu. Sau đó, bạn chỉ có thể lặp lại thông qua nó một lần nữa.

2

tôi thú nhận tôi đã không cố gắng này, nhưng bạn đã thử sau khi lặp đầu tiên của bạn

mysql_data_seek($queryresult,0); 

đi đến kỷ lục đầu tiên?

0

Vâng, bạn luôn có thể đếm số hàng bạn đọc, và sau đó làm một cái gì đó như thế này:

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

Không biết lý do tại sao bạn sẽ cần phải, nhưng có nó được.

3

Thay thế cho dữ liệu tìm kiếm là để lưu trữ các giá trị vào một mảng:

$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

Tôi đã viết một chức năng trợ giúp tôi gọi multiRow() mà làm tất cả những gì và chỉ trả về và mảng của hàng mảng. –

1

Đối mysqli bạn nên làm như sau;

$result= $con->query($sql); // $con is the connection object 
$result->data_seek(0); 
Các vấn đề liên quan