Es importante desarrollar sus consultas MySQL y perfeccionarlas fuera del contexto del código PHP primero, luego integrar la consulta una vez que funcione de la manera que lo necesita en una aplicación cliente MySQL como MySQL Workbench, PHPMyAdmin, etc.
En su consulta, el exterior SELECT
no es necesario, y la consulta interna en sí parece casi correcta, pero es la forma en que intenta ejecutarla con PDO lo que falla.
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
Ahora, para ejecutarlo en PDO, debe usar prepare()/bindParam()/execute()
para crear una declaración preparada, vincular parámetros y ejecutarla con esos parámetros (aunque no puede vincular el nombre de la tabla, debe seguir siendo una variable). En su código actual, tiene una confusión de PDO::query()
método utilizado para consultas estáticas simples y PDOStatement::execute()
método que se utiliza para ejecutar una declaración preparada. Debería usar el método de declaración preparada, en lugar de 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);
Siempre recomiendo pasar tiempo con este tutorial de PDO para desarrolladores de MySQL
que coloca el uso de PDO en el contexto del antiguo mysql_*()
API con la que quizás ya estés familiarizado.