É importante desenvolver suas consultas MySQL e aperfeiçoá-las primeiro fora do contexto do código PHP e, em seguida, integrar a consulta quando estiver funcionando da maneira que você precisa para em um aplicativo cliente MySQL como MySQL Workbench, PHPMyAdmin, etc.
Em sua consulta, o
SELECT
externo não é necessário, e a própria consulta interna parece quase correta, mas é a maneira como você tenta executá-la com o PDO que está com defeito. 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
Agora para executá-lo no PDO, você deve usar
prepare()/bindParam()/execute()
para criar uma instrução preparada, vincular parâmetros e executá-la com esses parâmetros (você não pode vincular o nome da tabela - isso deve permanecer uma variável). Em seu código atual, você tem uma mistura do PDO::query()
método usado para consultas estáticas simples e o PDOStatement::execute()
método que é usado para executar uma instrução preparada. Você deve usar o método de instrução preparado, em vez 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);
Eu sempre recomendo passar um tempo com este tutorial PDO para desenvolvedores MySQL que coloca o uso do PDO no contexto do antigo
mysql_*()
API com a qual você já deve estar familiarizado.