2012-05-05 37 views
9

Giả sử tôi cóZend_Db: fetchAll() hoặc truy vấn()/lấy() cho một số lượng lớn các hồ sơ

$db is an instance of Zend_Db_Adapter_Abstract and 
$sql = 'SELECT blah blah FROM table' will return a huge number of records. 

Có hai mã mảnh vỡ để xử lý các dữ liệu trả về như sau.

// Code fragment 1 (let's call it C1). 
$results = $db->fetchAll($sql); 
foreach ($results as $row) { 
    // Process $row 
} 

// Code fragment 2 (let's call it C2). 
$stmt = $db->query($sql); 
while ($row = $stmt->fetch()) { 
    // Process $row 
} 

Hiểu biết của tôi là C1 sẽ tải tất cả dữ liệu được trả về thành $ kết quả. Vì vậy, một dữ liệu khổng lồ được nạp vào bộ nhớ PHP. Dưới đây là câu hỏi của tôi.

  1. C2 có tải tất cả dữ liệu vào bộ nhớ PHP hoặc xử lý từng dữ liệu như chuẩn bị/thực thi không?
  2. Giả sử không có tùy chọn nào khác, C1 hoặc C2 có phải là lựa chọn tốt hơn không?

Cảm ơn!

Trả lời

14

Linh cảm của bạn là chính xác. Ít nhất nếu bạn đang sử dụng trình điều khiển PDO, -> fetch() đọc các kết quả không được lọc, trong khi -> fetchAll() trả về tất cả dữ liệu trong một mảng lớn.

Lưu ý rằng nếu bạn đang sử dụng -> fetch(), bạn phải cẩn thận về những gì bạn cố gắng thực hiện bên trong vòng lặp của mình. Bạn không thể chạy các truy vấn bổ sung trên cùng một kết nối trong khi vẫn có bộ kết quả không được lọc. Vì vậy, nếu kế hoạch của bạn là để cập nhật những hàng tương tự bên trong vòng lặp, bạn sẽ cần phải tìm cách trì hoãn thực hiện các cập nhật (bằng cách xếp hàng sau đó lên bằng cách nào đó) cho đến khi bạn đã thoát khỏi vòng lặp.

+0

Cảm ơn bạn đã cảnh báo bạn về việc sử dụng lấy() :) – peidiam

10

Để lấy một hàng từ tập hợp kết quả, sử dụng phương pháp lấy() của đối tượng tuyên bố. Reference

$sql = 'SELECT blah blah FROM table'; 
$stmt = $db->query($sql); 
while ($row = $stmt->fetch()) { 
    // Process $row 
} 

Trong ví dụ trên $stmt = $db->query($sql); lấy các resultset trong bộ nhớ và fetch đang được sử dụng để lấy hàng hiện tại trong vòng lặp từ resultset, trong đó di chuyển con trỏ đến dòng kế tiếp cho đến khi nó đạt đến sự hàng cuối cùng trong số resultset.

Để truy xuất tất cả các hàng của tập hợp kết quả trong một bước, hãy sử dụng phương thức fetch2() của phương thức . Điều này tương đương với việc gọi phương thức fetch() trong một vòng lặp và trả về tất cả các hàng trong một mảng.

$sql = 'SELECT blah blah FROM table'; 
$stmt = $db->query($sql); 
$rows = $stmt->fetchAll(); 
echo $rows[0]['col1']; // The first field/column from the first row 

Hoặc bạn có thể sử dụng

.... 
$table = new Mytable(); 
// Find a single row Returns a Rowset 
$rows = $table->find(1234); 

// Find multiple rows Also returns a Rowset 
$rows = $table->find(array(1234, 5678)); 

tham khảo:Zend_Db_Table..

Để biết thêm:Fetching a Row.. Tôi nghĩ rằng fetchAll() nhanh hơn vì nó truy xuất tất cả dữ liệu trong một bước và trả về một mảng nhưng tiêu thụ nhiều bộ nhớ hơn nhưng fetch() tiêu thụ ít bộ nhớ hơn nhưng truy xuất dữ liệu từng cái một.

API cho hoạt động tìm nạp đã được thay thế để cho phép đối tượng Zend_Db_Table_Select sửa đổi truy vấn. Tuy nhiên, việc sử dụng không sử dụng các phương thức fetchRow() và fetchAll() sẽ tiếp tục hoạt động mà không sửa đổi.

More tham khảo:Here.

+1

thông tin của bạn là toàn diện và hữu ích. Cảm ơn! – peidiam

Các vấn đề liên quan