Điều quan trọng là bạn phải phát triển các truy vấn MySQL và hoàn thiện chúng bên ngoài ngữ cảnh của mã PHP trước, sau đó tích hợp truy vấn khi bạn có nó hoạt động theo cách bạn cần để trong ứng dụng khách MySQL như MySQL Workbench, PHPMyAdmin, v.v.
Trong truy vấn của bạn, SELECT
bên ngoài là không cần thiết và bản thân truy vấn bên trong có vẻ gần như đúng, nhưng cách bạn cố gắng thực thi nó với PDO đã bị lỗi.
SELECT
due_date,
date_paid,
DATEDIFF(due_date, date_paid) as date_interval
FROM $tbl_name
WHERE
DATEDIFF(due_date, date_paid) <= $setDay
ORDER BY trans_id DESC
LIMIT $start, $limit
Bây giờ để thực thi nó trong PDO, bạn nên sử dụng prepare()/bindParam()/execute()
để tạo một câu lệnh đã chuẩn bị sẵn, liên kết trong các tham số và thực thi nó với các tham số đó (mặc dù vậy bạn không thể ràng buộc tên bảng - tên đó phải vẫn là một biến). Trong mã hiện tại của bạn, bạn có một kết hợp của PDO::query()
phương thức được sử dụng cho các truy vấn tĩnh đơn giản và PDOStatement::execute()
phương thức được sử dụng để thực hiện một câu lệnh đã chuẩn bị. Bạn nên sử dụng phương thức câu lệnh đã chuẩn bị thay vì query()
.
// Setup the statement with named parameters like :setDay
$sql = "
SELECT
due_date,
date_paid,
DATEDIFF(due_date, date_paid) as date_interval
FROM $tbl_name
WHERE
DATEDIFF(due_date, date_paid) <= :setDay
ORDER BY trans_id DESC
LIMIT :start, :limit
";
// Make PDO throw useful errors on failure
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Prepare the statement
$stmt = $pdo->prepare($sql);
// Bind your 3 parameters and execute it
$stmt->bindParam(':setDay', $setDay, PDO::PARAM_INT);
$stmt->bindParam(':start', $start, PDO::PARAM_INT);
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$stmt->execute();
// Fetch your rows returned from the query
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Do something with them
print_r($rows);
Tôi luôn khuyên bạn nên dành thời gian với hướng dẫn PDO này dành cho nhà phát triển MySQL
đặt cách sử dụng của PDO trong ngữ cảnh của mysql_*()
cũ API mà bạn có thể đã quen thuộc.