Det er vigtigt at udvikle dine MySQL-forespørgsler og perfektionere dem uden for PHP-kodens kontekst først, og derefter integrere forespørgslen, når du har fået den til at fungere, som du har brug for den i en MySQL-klientapplikation som MySQL Workbench, PHPMyAdmin osv.
I din forespørgsel, den ydre SELECT
er ikke nødvendig, og selve den indre forespørgsel ser næsten korrekt ud, men det er den måde, du forsøger at udføre den på med PDO, der er defekt.
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
For nu at udføre det i PDO, bør du bruge prepare()/bindParam()/execute()
at oprette en forberedt sætning, binde parametre ind og udføre den med disse parametre (du kan dog ikke binde tabelnavnet - det skal forblive en variabel). I din nuværende kode har du en blanding af PDO::query()
metode, der bruges til simple statiske forespørgsler og PDOStatement::execute()
metode, som bruges til at udføre en udarbejdet erklæring. Du bør bruge den forberedte sætningsmetode i stedet for 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);
Jeg anbefaler altid at bruge tid med denne PDO-vejledning til MySQL-udviklere
som placerer PDO's brug i sammenhæng med den gamle mysql_*()
API, du måske allerede er bekendt med.