Vậy là bạn đã có câu trả lời cho câu hỏi "Tại sao tôi gặp lỗi này", nhưng lại không nhận được câu trả lời cho "truy vấn PDO viết tắt".
Đối với điều này, chúng tôi sẽ cần một chút thứ gọi là "lập trình".
Một điều thú vị về lập trình là chúng tôi không bị giới hạn trong các công cụ hiện có, giống như các ngành nghề khác. Với việc lập trình, chúng ta luôn có thể tạo một công cụ của riêng mình và sau đó bắt đầu sử dụng nó thay vì một bộ công cụ cũ.
Và Lập trình hướng đối tượng đặc biệt giỏi trong lĩnh vực này, vì chúng ta có thể lấy một đối tượng hiện có và chỉ thêm một số chức năng, giữ nguyên phần còn lại.
Ví dụ:hãy tưởng tượng chúng ta muốn một cách viết tắt để chạy một truy vấn đã chuẩn bị sẵn trong PDO. Tất cả những gì chúng tôi cần là mở rộng đối tượng PDO với một phương thức viết tắt mới. Phần khó nhất là đặt tên cho phương thức mới.
Phần còn lại rất đơn giản:bạn chỉ cần vài dòng mã
class MyPDO extends PDO
{
public function run($sql, $bind = NULL)
{
$stmt = $this->prepare($sql);
$stmt->execute($bind);
return $stmt;
}
}
Đây là tất cả mã bạn cần. Bạn có thể lưu trữ nó trong cùng một tệp nơi bạn lưu trữ thông tin đăng nhập cơ sở dữ liệu của mình. Lưu ý rằng việc bổ sung này sẽ không ảnh hưởng đến mã hiện có của bạn theo bất kỳ cách nào - nó vẫn hoàn toàn giống nhau và bạn có thể tiếp tục sử dụng tất cả các chức năng PDO hiện có như bình thường.
Bây giờ bạn chỉ phải thay đổi 2 chữ cái trong hàm tạo PDO, gọi nó là
$conn = new MyPDO(...the rest is exactly the same...);
Và ngay lập tức, bạn có thể bắt đầu sử dụng công cụ mới sáng bóng của mình:
$sql = "SELECT * FROM myTable WHERE id = :id";
$result = $conn->run($sql, ['id' => $id])->fetchAll(PDO::FETCH_ASSOC);
Hoặc, tối ưu hóa một chút,
$result = $conn->run("SELECT * FROM myTable WHERE id = ?", [$id])->fetchAll();
vì bạn luôn có thể đặt chế độ tìm nạp mặc định một lần cho tất cả và chỉ đối với một biến duy nhất, không được sử dụng cho trình giữ chỗ đã đặt tên. Điều này làm cho mã này trở thành một tốc ký thực sự so với câu trả lời được chấp nhận,
$stmt_test = $conn->prepare("SELECT * FROM status WHERE status_id = ?");
$stmt_test->execute([$id]);
$result = $stmt_test->fetchAll(PDO::FETCH_ASSOC);
và thậm chí cho câu trả lời tốt nhất mà bạn có cho đến nay,
$result = $conn->prepare("SELECT * FROM status WHERE status_id = ?");
$result->execute([$id]);
không phải đề cập đến rằng cái sau không phải lúc nào cũng có thể sử dụng được, vì nó chỉ phù hợp để lấy một mảng. Trong khi với một thực viết tắt bất kỳ định dạng kết quả nào đều có thể:
$result = $conn->run($sql, [$id])->fetchAll(); // array
$result = $conn->run($sql, [$id])->fetch(); // single row
$result = $conn->run($sql, [$id])->fetchColumn(); // single value
$result = $conn->run($sql, [$id])->fetchAll(PDO::FETCH_*); // dozens of different formats