Thứ Sáu, 10 tháng 7, 2009

PHP with PDO - Phần 3

Phần I: Tổng Quan về PDO
Phần II: Xây dựng một kết nối đơn giản và truy vấn tới CSDL
Phần III: Tương tác dữ liệu qua PDO

Nếu như các bạn làm theo những bước ở trên thì chưa đủ, ta phải tìm cách lấy dữ liệu trả về từ các query (VD như truy vấn Select chẳng hạn).

Để làm điều này, trước tiên chúng ta phải sử dụng một phương thức khác của PDO là PDO->query(). Phương thức này có nhiệm vụ thực thi một truy vấn SQL và trả về tập kết quả. Thường thì tập kết quả này sẽ được một lớp đối tượng khác là PDO Statement xử lý. Đây là tập các phương thức chuyên dụng để xử lý kết quả trả về, nó cũng gần giống như cái recordset vậy.

PDO {
PDOStatement query(string sql);
}

Các bạn cần chú ý phân biệt giữa hai phương thức exec() và query(). Exec() thực thi một truy vấn và trả về số các dòng bị ảnh hưởng bởi truy vấn, còn query() trả về một tập kết quả (thường là một recordset hoặc giá trị false). Người ta thường dùng exec() để truy vấn các câu lệnh như Insert, delete, update..., và dùng query() để truy vấn các câu lệnh Select.

Chúng ta có thể lấy kết quả ra theo hai cách: Lấy về từng dòng hay lấy về toàn bộ. Điểm đặc biệt là cũng như với các hàm xử lý MySQL, kết quả trả về thường được lưu trữ dưới dạng một mảng, rất thuận tiện và dễ dùng

I. Lấy kết quả về theo từng dòng

Để lấy kết quả theo từng dòng (tương tự như hàm mysql_fetch_array()), chúng ta có thể sử dụng phương thức PDOStatement->fetch().

PDOStatement {
mixed fetch(int fetch_style,
int cursor_orientation,
int cursor_offset);
}

Hàm này sử dụng 3 tham số tuỳ chọn:
- Fetch_style xác định cách thức lấy dữ liệu. Nó có thể nhận một trong các giá trị sau:
  • PDO::FETCH_ASSOC: Trả về một mảng được đánh chỉ số bởi tên cột (field) (Tương tự như MYSQL_ASSOC)
  • PDO::FETCH_BOTH (mặc định): trả về một mảng được đánh chỉ số bởi tên cột và chỉ số số nguyên bắt đầu từ 0. (tương tự như MYSQL_BOTH)
  • PDO::FETCH_NUM: trả về một mảng được đánh chỉ số bởi số thứ tự của cột (xuất hiện trên query SELECT), bắt đầu = 0 (Tương tự như MYSQL_NUM)

... và một vài giá trị khác, tham khảo thêm trong manual, nhưng vì chưa đến lúc sờ đến nên CMXQ không liệt kê ở đây.

Cũng tương tự như mysql_fetch_array, phương thức này lấy một dòng từ vị trí con trỏ hiện tại và đẩy con trỏ sang dòng kế tiếp.

Ví dụ:
Code:
$dbh = new PDO('mysql:host=localhost;dbname=thumotti', 'thumotti', 'thuhaiti');
$stmt = $dbh->query("SELECT * FROM user where user_id<10")>";
while (($row = $stmt->fetch(PDO::FETCH_ASSOC))) {
echo "${row['user_name']}${row['e-mail']}\n";
}
echo "";

II. Lấy toàn bộ dữ liệu và đưa vào mảng.

Để thực hiện điều này, chúng ta cần phải sử dụng một phương thức khác thay cho fetch, đó là fetchall(). Cách thức dùng cũng tương tư nặng thằng fetch, chỉ có điều nó đưa tất cả dữ liệu vào một mảng.

Ví dụ:

Code:
$dbh = new PDO('mysql:host=localhost;dbname=thumotti', 'thumotti', 'thuhaiti');
$stmt = $dbh->query("SELECT * FROM user where user_id<10") result="$stmt-">fetchAll();
print_r($result);
--------------------------------------------
copy from phpvietnam

Không có nhận xét nào:

Đăng nhận xét