Windows

Безвозвратный order php. Как работать с PDO? Полное руководство. При оформлении заказа возникла ошибка

Когда вы просматриваете километры кода, у вас вполне может возникнуть вопрос: "Почему все сделано так, как сделано?" Лично я особенно замечаю вещи, которые могут и должны быть улучшены, когда дело касается тяжелых запросов в БД.

Разработка без фреймворка

При работе с фреймворком запросы в БД в основном уже оптимизированы для разработчика, а сложная логика абстрагирована, что улучшает и оптимизирует получение и дальнейшее использования данных. Но бывает, что разработчикам надо накодить что-то без использования фреймворка. При этом основные возможности PHP часто используются не самым оптимальным образом.

$pdo = new \PDO($config["db"]["dsn"], $config["db"]["username"], $config["db"]["password"]); $sql = "SELECT * FROM `gen_contact` ORDER BY `contact_modified` DESC"; $stmt = $pdo->prepare($sql); $stmt->execute(); $data = $stmt->fetchAll(\PDO::FETCH_OBJ); echo "Getting the contacts that changed the last 3 months" . PHP_EOL; foreach ($data as $row) { $dt = new \DateTime("2015-04-01 00:00:00"); if ($dt->format("Y-m-d") . "00:00:00" < $row->contact_modified) { echo sprintf("%s (%s)| modified %s", $row->contact_name, $row->contact_email, $row->contact_modified) . PHP_EOL; } }

Выше приведен пример кода, который наиболее часто используется для получения данных. На первый взгляд, этот код выглядит хорошо и чистенько, но, присмотревшись получше, вы увидите пару возможностей для улучшения.

  • Код не дает возможность повторного использования. Когда будет надо задействовать похожий функционал, вам придется дублировать существующий код.
  • Даже если вы для выборки используете $stmt->fetchAll(\PDO::FETCH_OBJ); у вас остается проблема, т.к. на выходе получится массив объектов. При большой выборке это пожрет море памяти.
  • Фильтрация делается с помощью функции. Это означает, в том случае, если потребуются другие условия фильтрования, вам нужно будет модифицировать текущую логику, что далеко не прибавит удобства для сопровождения и расширения функционала.
Итераторы

Большинство современных фреймворков для получения данных применяет итераторы, потому что они быстры и пригодны для повторного использования. А еще они позволяют задействовать другие итераторы для фильтрации и изменения возвращаемых результатов. Но и без фреймворка вы можете использовать их, т.к. итераторы стали частью PHP еще с версии 5.0.0 Beta 2 .

Итак, давайте представим, что вы продолжаете использовать PDO для получения данных. У нас есть для варианта:

  • Использовать PDOStatement::fetchAll() для получения всех данных за один проход.
  • Использовать PDOSTatement::fetch() для получения одной строки за одну итерацию.

Даже если первый вариант вам кажется очень заманчивым, я предпочитаю и советую использовать вариант за номером два. Он позволяет мне создать один итератор для извлечения данных не ограничиваясь условиями запроса (что делает его пригодным к повторному использованию для любых извлечений).