2012-02-07 23 views
5

Được rồi cú pháp của tôi có thể được mô tả không có mã. Về cơ bản nó phải dễ dàng ... nhưng không bao giờ.

Tôi có 2 vòng liên tiếp ... về cơ bản giống nhau. Tôi SELECT * mỗi biến từ cơ sở dữ liệu của tôi, và sau đó tôi cần phải xây dựng một lớp javascript 2 dựa trên hai sep. biến.

Vì vậy

tôi có:

while ($row = mysql_fetch_array($myVariable)) { 

// do events 

} 

rồi sau đó

while ($row2 = mysql_fetch_array($myVariable)) { 

// do events 

} 

Đối với một số lý do nó hoàn toàn trở về NOTHING trên một giây ... là có một số mà tôi cần phải đặt lại mảng của tôi, nó có thể kết thúc và sau đó tôi không thể khởi động lại. Một câu hỏi cơ bản như vậy, nhưng tôi không thể tìm ra điều gì khác có thể sai cho cuộc sống của tôi. Vì vậy, thats câu hỏi, là một vấn đề chung để chỉ làm điều đó hai lần liên tiếp và mong đợi PHP để bắt đầu lại mỗi lần vào đầu $ myVariable giữ tuyên bố SELECT của tôi?

Cảm ơn ... sẽ kiểm tra cả ngày và cập nhật nếu cần. Bộ đếm thời gian đầu tiên đến Stack Overflow tôi rất muốn thấy sự trợ giúp.

+2

chèn đầu tiên tất cả các bản ghi trong một mảng một sau đó làm một foreach – ZiTAL

+0

http://uk.php.net/mysql-fetch-array mysql_fetch_array di chuyển con trỏ dữ liệu nội bộ, có người thông minh hơn tôi sẽ giải thích thêm này , nhưng về cơ bản trong vòng lặp thứ hai bạn đã đi đến cùng! – TommyBs

+0

Câu hỏi có thể trùng lặp: [Vòng lặp thứ hai trong khi không chạy. Tại sao?] (Http://stackoverflow.com/questions/8333145/second-while-loop-not-running-why) – Wiseguy

Trả lời

4

Trước khi vòng lặp thứ hai, hãy thử sử dụng mysql_data_seek():

mysql_data_seek($myVariable, 0); 

Con trỏ trong recordset cần phải được thiết lập lại, nếu không nó vẫn sẽ chỉ ra rằng đó là lúc kết thúc.

Nó có thể là một lựa chọn tốt hơn, như ZiTAL chỉ ra, để lưu trữ các bản ghi của bạn trong một mảng và chỉ lặp qua mảng đó.

+1

Tôi thích tùy chọn này. Không cần phải đưa dữ liệu vào một mảng khi bạn chỉ có thể đặt lại con trỏ trở lại bắt đầu.Về cơ bản bạn chỉ cần tạo ra hai mảng khi bạn chỉ cần một và do đó sử dụng nhiều bộ nhớ hơn! –

+0

@AngusWalker Tôi đoán tôi nên có đủ điều kiện "tốt hơn" về khả năng đọc/bảo trì tiềm năng. Như được viết, nó mơ hồ. – Wiseguy

0

Nếu vòng lặp của bạn được lồng nhau và giả sử $ myVariable giống nhau cho cả hai vòng, chỉ cần sao chép và sau đó lặp lại bản sao khác mỗi lần.

$myVariable = mysql_result($query); 
$myVariable2 = $myVariable; 

while ($row = mysql_fetch_array($myVariable)) { 
    while ($row = mysql_fetch_array($myVariable2)) { 
... 

Một +1 khác cho "làm cho nó trở thành mảng", đẹp hơn rất nhiều để làm việc.

+0

Tôi nhận được ấn tượng rằng các vòng của người hỏi không được lồng nhau. Nhưng nếu họ có, bạn có một điểm tốt. – Wiseguy

+0

Tôi chủ yếu đăng bài này trong trường hợp họ được lồng nhau, và sau đó hoàn toàn quên đề cập đến đó haha. Nắm bắt tốt :) – Joe

7

Vấn đề là truy vấn trả về resource. Tài nguyên này có con trỏ bên trong riêng của nó (truy cập để nhớ hàng nào cần trả lại). mysql_fetch_array sẽ tạm dừng con trỏ bên trong đó và trả về mỗi hàng từ tài nguyên một tại một thời điểm. một khi nó ở cuối (không còn hàng nào nữa), nó trả về false. vì vậy trên vòng lặp cuối cùng, $ row bằng false thoát khỏi vòng lặp while. Con trỏ không được đặt lại mặc dù. Vì vậy, trong vòng lặp trong khi tiếp theo, bạn gọi mysql_fetch_array, con trỏ ở cuối và vì vậy nó trả về false hoàn toàn bỏ qua vòng lặp thứ hai trong khi đó. Những gì bạn nên làm, là lặp qua các dữ liệu một lần và lưu trữ mỗi hàng vào một mảng. Sau đó, bạn có thể sao chép/lặp qua mảng nhiều như bạn muốn và mọi thứ hoạt động như mong đợi.

$data = array(); 
while ($row = mysql_fetch_array($myVariable)) { 
    $data[] = $row; 
} 
//now $data has all the rows. a simple foreach will loop over the data. 
foreach($data as $row){ 
    //do events 
    print_r($row); 
} 

//and you can loop over data again and again. 
foreach($data as $row){ 
    //do events 
    print_r($row); 
} 
Các vấn đề liên quan