Ważne jest, aby najpierw opracować zapytania MySQL i udoskonalić je poza kontekstem kodu PHP, a następnie zintegrować zapytanie, gdy już działa tak, jak chcesz, w aplikacji klienckiej MySQL jak MySQL Workbench, PHPMyAdmin itp.
W zapytaniu zewnętrzny SELECT
nie jest potrzebne, a samo zapytanie wewnętrzne wygląda prawie poprawnie, ale sposób, w jaki próbujesz je wykonać za pomocą PDO, jest błędny.
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
Teraz, aby wykonać go w PDO, powinieneś użyć prepare()/bindParam()/execute()
aby utworzyć przygotowaną instrukcję, powiąż parametry i wykonaj ją z tymi parametrami (nie możesz jednak powiązać nazwy tabeli - musi ona pozostać zmienną). W twoim obecnym kodzie masz mieszankę PDO::query()
metoda używana do prostych zapytań statycznych i PDOStatement::execute()
metoda, która służy do wykonania przygotowanej instrukcji. Powinieneś używać metody przygotowanej instrukcji, a nie 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);
Zawsze polecam spędzanie czasu z tym samouczkiem PDO dla programistów MySQL
co umieszcza użycie PDO w kontekście starego mysql_*()
API, które być może już znasz.