PDO не дозволяє напряму перебирати результат запиту циклом for. Але цикл for можна використовувати, якщо попередньо отримати дані у вигляді масиву.
1. Основна ідея
Алгоритм такий:
- Виконати SELECT через PDO
- Отримати всі рядки методом
fetchAll() - Перебрати масив циклом
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 тільки тоді, коли це дійсно виправдано.
