È importante sviluppare le query MySQL e perfezionarle prima al di fuori del contesto del codice PHP, quindi integrare la query una volta che funziona nel modo desiderato per in un'applicazione client MySQL come MySQL Workbench, PHPMyAdmin, ecc.
Nella tua query, l'esterno SELECT
non è necessario e la query interna stessa sembra quasi corretta, ma è il modo in cui tenti di eseguirla con PDO che è difettosa.
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
Ora per eseguirlo in PDO, dovresti usare prepare()/bindParam()/execute()
per creare un'istruzione preparata, associare i parametri ed eseguirla con quei parametri (non è possibile tuttavia associare il nome della tabella, che deve rimanere una variabile). Nel tuo codice attuale, hai un miscuglio di PDO::query()
metodo utilizzato per semplici query statiche e PDOStatement::execute()
metodo che viene utilizzato per eseguire un'istruzione preparata. Dovresti usare il metodo dell'istruzione preparata, piuttosto che 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);
Consiglio sempre di dedicare del tempo a questo tutorial PDO per sviluppatori MySQL
che colloca l'utilizzo di PDO nel contesto del vecchio mysql_*()
API che potresti già conoscere.