Важно е първо да разработите вашите MySQL заявки и да ги усъвършенствате извън контекста на PHP кода, след което да интегрирате заявката, след като я накарате да работи по начина, по който ви е необходим в MySQL клиентско приложение като MySQL Workbench, PHPMyAdmin и др.
Във вашата заявка външният SELECT
не е необходимо и самата вътрешна заявка изглежда почти правилна, но начинът, по който се опитвате да я изпълните с PDO, е грешен.
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
Сега, за да го изпълните в PDO, трябва да използвате prepare()/bindParam()/execute()
за да създадете подготвен израз, обвържете параметри и го изпълнете с тези параметри (не можете обаче да обвържете името на таблицата - това трябва да остане променлива). В текущия ви код имате смесване на PDO::query()
метод, използван за прости статични заявки и PDOStatement::execute()
метод, който се използва за изпълнение на подготвен оператор. Трябва да използвате метода на подготвения израз, а не 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);
Винаги препоръчвам да прекарвате време с този PDO урок за MySQL разработчици
което поставя използването на PDO в контекста на стария mysql_*()
API, с който може би вече сте запознати.