Je důležité nejprve vyvinout dotazy MySQL a zdokonalit je mimo kontext kódu PHP, a poté dotaz integrovat, jakmile bude fungovat tak, jak potřebujete, v klientské aplikaci MySQL jako MySQL Workbench, PHPMyAdmin atd.
Ve vašem dotazu vnější SELECT
není potřeba a vnitřní dotaz sám o sobě vypadá téměř správně, ale způsob, jakým se jej pokoušíte provést pomocí PDO, je chybný.
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
Nyní, abyste jej provedli v PDO, měli byste používat prepare()/bindParam()/execute()
vytvořit připravený příkaz, svázat parametry a provést jej s těmito parametry (nemůžete však svázat název tabulky - to musí zůstat proměnná). Ve vašem aktuálním kódu máte kombinaci PDO::query()
metoda používaná pro jednoduché statické dotazy a PDOStatement::execute()
metoda, která se používá k provedení připraveného příkazu. Měli byste používat metodu připraveného příkazu, spíše než 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);
Vždy doporučuji trávit čas s tímto výukovým programem PDO pro vývojáře MySQL
což umisťuje použití PDO do kontextu starého mysql_*()
API, které již možná znáte.