Il est important de développer vos requêtes MySQL et de les perfectionner en dehors du contexte du code PHP d'abord, puis d'intégrer la requête une fois qu'elle fonctionne comme vous en avez besoin dans une application cliente MySQL comme MySQL Workbench, PHPMyAdmin, etc.
Dans votre requête, le SELECT
extérieur n'est pas nécessaire, et la requête interne elle-même semble presque correcte, mais c'est la façon dont vous essayez de l'exécuter avec PDO qui est défectueuse.
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
Maintenant, pour l'exécuter dans PDO, vous devez utiliser prepare()/bindParam()/execute()
pour créer une instruction préparée, lier les paramètres et l'exécuter avec ces paramètres (vous ne pouvez cependant pas lier le nom de la table - cela doit rester une variable). Dans votre code actuel, vous avez un mélange du PDO::query()
méthode utilisée pour les requêtes statiques simples et le PDOStatement::execute()
méthode utilisée pour exécuter une instruction préparée. Vous devriez utiliser la méthode d'instruction préparée, plutôt que 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);
Je recommande toujours de passer du temps avec ce tutoriel PDO pour les développeurs MySQL
qui place l'utilisation de PDO dans le contexte de l'ancien mysql_*()
API que vous connaissez peut-être déjà.