2012-06-06 33 views
7

Tôi đã học PHP trong 2 tháng nay là ngôn ngữ kịch bản đầu tiên của tôi. Đối với hầu hết các vấn đề của tôi tôi có thể dễ dàng tìm thấy một câu trả lời trực tuyến, nhưng có một cái gì đó về PDO mà tôi dường như không thể hiểu được.Bộ kết quả PDO được lưu trữ như thế nào

Để truy xuất dữ liệu từ cơ sở dữ liệu, tôi khởi tạo đối tượng mới của lớp PDO và gọi phương thức PDO :: query() trên đó. Điều này trả về một đối tượng PDOStatement mang bộ kết quả từ truy vấn SQL. Đây là nơi bắt đầu vấn đề. Tôi không thể hiểu được cách thức và nơi dữ liệu từ tập kết quả được lưu trữ.

Trong Hướng dẫn sử dụng PHP, tôi đã học cách hiển thị các hàng được trả về bằng cách lặp qua đối tượng PDOStatement với vòng lặp foreach. Tuy nhiên, hướng dẫn sử dụng PHP nêu rõ rằng nếu một đối tượng được chuyển đổi thành một mảng, kết quả là một mảng có các thành phần là thuộc tính của đối tượng . PDOStatement chỉ có một thuộc tính - $ queryString - chứa chuỗi truy vấn được phát hành. Vậy ... kết quả truy vấn được lưu ở đâu? Và tại sao tôi có thể tiếp cận họ thông qua một mảng với vòng lặp foreach, nhưng không phải bên ngoài nó?

// Instantiate new PDO object to establish a new connection with MySQL database 
$db = new PDO('mysql:dbhost=localhost;dbname=world', 'root', 'secret'); 

// Execute SQL query - Returns a PDOStatement object 
$result = $db->query("SELECT Name, Continent, Population FROM Country"); 


// Result set can be accessed with a foreach loop iterating over the PDOStatement object 
foreach ($result as $row) { 
    echo "$row[Name] - $row[Continent] - $row[Population] <br />"; 
} 

// Outside the foreach loop, $result cannot be accessed this way. 
// This produces 'Cannot use object of type PDOStatement as array' 
echo $result[0]['Name']; 
+0

Nó thực hiện [ 'Iterator'] (http: // php. net/Iterator) giao diện, để một cuộc gọi phương thức ngầm định trả về kết quả riêng lẻ; do đó, họ không phải có mặt như tài sản hoặc dữ liệu nội bộ. – mario

Trả lời

6

Lớp PDOStatement triển khai Iterator interface, cho phép đối tượng của nó được lặp qua.

Iterator extends Traversable { 
    /* Methods */ 
    abstract public mixed current (void) 
    abstract public scalar key (void) 
    abstract public void next (void) 
    abstract public void rewind (void) 
    abstract public boolean valid (void) 
} 

Đối với một đối tượng mà thực hiện giao diện Iterator,

foreach($result as $row) { 
    // Code 
} 

tương đương với

for ($result->rewind(); $result->valid(); $result->next()) { 
    $row = $result->current(); 
    // Code 
} 
+1

Cảm ơn rất nhiều! Tôi đã dành thời gian để tìm hiểu về SPL và giao diện Iterator nói riêng. Bây giờ tôi thấy làm thế nào nó có thể lặp qua đối tượng, nhưng tôi vẫn không hiểu nơi tập kết quả từ truy vấn được lưu trữ. Tôi đã học được rằng các đối tượng chỉ có thể có các loại cây của các thành viên: thuộc tính, phương thức và hằng số. Nếu tập kết quả không được lưu trữ trong một thuộc tính, thì nó được lưu ở đâu? Có loại đệm nào không? – user1440560

+0

Câu hỏi thú vị. Tôi mong đợi đối tượng PDOStatement giữ một tài nguyên, cùng một loại tài nguyên mà mysql_query trả về. Tuy nhiên, theo http://php.net/manual/en/class.pdostatement.php thì không. – ddlshack

+0

Ngoài ra, câu trả lời của tôi hơi sai. PDOStatement trực tiếp triển khai thực hiện 'Traversable', là một lớp bên trong được mở rộng bởi' Iterator'. – ddlshack

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