Важно развивать вас MySQL сначала запрашивает и совершенствует их вне контекста PHP-кода, а затем интегрирует запрос, когда он работает так, как вам нужно, до в M ySQL клиентское приложение как 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);
Я всегда рекомендую проводить время с this PDO tutorial for MySQL developers который ставит использование PDO в контексте старой mysql_*()
API может быть уже знакомы.
Эта строка: ГДЕ DATEDIFF (due_date, date_paid) <= $ setDay вызывает ошибку. – Matheno