Як використовувати цикл for з PDO SELECT у PHP

PDO не дозволяє напряму перебирати результат запиту циклом for. Але цикл for можна використовувати, якщо попередньо отримати дані у вигляді масиву.


1. Основна ідея

Алгоритм такий:

  1. Виконати SELECT через PDO
  2. Отримати всі рядки методом fetchAll()
  3. Перебрати масив циклом for

2. Простий приклад SELECT + for

$stmt = $pdo->query(
    "SELECT id, name, email FROM users"
);

$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

for ($i = 0; $i < count($rows); $i++) {
    echo $rows[$i]['id'] . ' - ';
    echo $rows[$i]['name'] . ' - ';
    echo $rows[$i]['email'] . '<br>';
}

3. Оптимізований варіант (рекомендовано)

Щоб не викликати count() на кожній ітерації, краще зберегти кількість елементів у змінну:

$total = count($rows);

for ($i = 0; $i < $total; $i++) {
    echo $rows[$i]['name'] . '<br>';
}

4. SELECT з параметрами + for

$stmt = $pdo->prepare(
    "SELECT id, name FROM users WHERE active = :active"
);

$stmt->execute([
    'active' => 1
]);

$users = $stmt->fetchAll(PDO::FETCH_ASSOC);

for ($i = 0, $c = count($users); $i < $c; $i++) {
    echo $users[$i]['id'] . ' - ';
    echo $users[$i]['name'] . '<br>';
}

5. Поширена помилка (НЕПРАВИЛЬНО)

for ($i = 0; $row = $stmt->fetch(); $i++) {
    // ❌ так робити не можна
}

Метод fetch() повертає false, а цикл for не призначений для такої логіки.


6. Кращі альтернативи циклу for

while (рекомендовано для великих вибірок)

while ($row = $stmt->fetch()) {
    echo $row['name'] . '<br>';
}

foreach (найчистіший код)

foreach ($users as $row) {
    echo $row['name'] . '<br>';
}

7. Коли варто використовувати for

  • ✔ Потрібен індекс елемента
  • ✔ Дані вже у масиві
  • ✔ Є логіка, залежна від позиції

Коли НЕ варто

  • ❌ Для великих SELECT-запитів
  • ❌ Коли не потрібен індекс

8. Висновок

Цикл for можна використовувати з PDO лише після fetchAll(). У більшості випадків foreach або while будуть простішими та ефективнішими.

Рекомендація: використовуйте for тільки тоді, коли це дійсно виправдано.