@Andranikk

Зачем нужны отдельные классы для работы с БД?

Всем привет!
Недавно решил 'вскрыть' несколько бесплатных php скриптов из паблика, просмотреть на примеры чужих работ, и заметил, что в большинстве случаев для подключения и работы с бд пишется отдельный класс и функции. Сам я смысла не понял, зачем заменять стандартные функции на свои? Какая разница между:
$mysqli = new mysqli(...) и $db = new db(...)
или
$a = $mysqli->query(...); $b = $a -> fetch_array(); и $db->query(...); $b = $db->FetchArray;
Сначала подумал, что скрипты не те попались, но после заметил то же самое в обучающих уроках, решил, что все же у меня недостаток опыта/знаний. Гугл ответов не дал, да и вообще нигде обьяснений не нашел, надеюсь добрые люди из хабра что-то прояснят))
  • Вопрос задан
  • 2683 просмотра
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
На самом деле это интересный вопрос. А, точнее, два: зачем нужен такой класс, и зачем их пишут.
Ответ на первый становится очевиден, когда начинаешь не смотреть на код, а писать его ;)
Практически все библиотеки, представленные в РНР, представляют в пользование программиста довольно низкоуровневые функции, которые позволяют, с одной стороны, довольно гибко управлять процессом, но с другой - делают этот процесс ну очень многословным. Самый яркий пример - CURL. Никто, находясь в здравом уме, не будет писать все время эти бесконечные curlopt. Надо пилить библиотеку, которая реализует стандартные методы пост, гет за один вызов, и только для исключительных случаев позволяет задать кастомные параметры.

То же самое касается и работы с БД. К примеру, очень часто нам бывает нужно получить из БД массив. Сколько строк нужно написать для этого? Классическим говнокодом - 5:
$ret = array();
$res = mysql_query();
while ($row = mysql_fetch_assoc($res)) {
    $ret[] = $row;
}

И такой код надо написать раз 15-20 за приложение. У программиста сразу руки зачешутся уничтожить этот повторяющийся код и написать функцию, которой передаешь запрос, а получаешь массив. За 1 вызов. Вот для этого библиотеки и пишут.

Но в здесь мы подходим ко второй причине. Дело в том, что "классический говнокод" из видеоуроков всегда очень упрощен. Авторы видеоуроков не знают, что для работы с БД надо делать миллион дополнительных действий - от обработки ошибок до защиты от инъекций. И если все эти действия выполнять вручную, то времени больше ни на что не останется - придется снова и снова переписывать одни и те же тонны кода для каждого запроса.

Возьмем для примера код примера из мануала. Даже выкинув из него очевидные глупости, мы получаем пол-дюжины строк кода. Это на ОДИН запрос.
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
    $stmt->bind_param("s", $city);
    $stmt->execute();
    $stmt->bind_result($district);
    $stmt->fetch();
}

И это все - чтобы получить единственную строчку!

В то время как с помощью (нормальной) библиотеки вся работа с БД сведется к 1 (одной) строчке, а все необходимые телодвижения будут выполнены библиотекой автоматически:
$distr = $db->getOne("SELECT District FROM City WHERE Name=?", $city);

Теперь перейдем ко второму вопрос - зачем их пишут.
Самый основной мотив - "шоб було!" "У всех есть - значит, и у меня будет!". При этом, подходя к написанию библиотеки, новички наступают на одни и те же грабли.
Чаще всего, из-за недостатка опыта авторов, код сокращается только для самых примитивных запросов. Но при этом работа с нестандартными запросами превращается в ад. Но самое ужасное - практически никогда такие самописные библиотеки не поддерживают работу с подготовленными выражениями. А это должно быть их главной фичей, без которых ценность сразу стремится к нулю. А точнее, даже к минусу, потому что инъекции. Ну и по мелочи: к примеру, если в коде действительно написано $db->FetchArray(); - то это ужас, летящий на крыльях ночи, потраченной на отлов неочевидных ошибок .
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
На случай если завтра понадобиться заменить БД на другую. В этом случае достаточно будет изменить классы для работы с БД (драйвер базы, если хочешь) и не трогать весь остальной проект.
Т.е. это надо чтобы абстрогироваться от конкретного типа БД и сделать что-то типа своего внутреннего API данных.
Ответ написан
Я использую сторонний класс только ради безопасности (защита от SQL-инъекций) и сокращения кода. Вот статья по теме - habrahabr.ru/post/165069

Отдельное спасибо за этот класс говорим FanatPHP
Ответ написан
Комментировать
@hector
php программист
Это делается для автоматизации рутиных задач и возможности быстрой смены логики методов.

+ при использовании синглитона, можно хранить версию актуального подключения к бд
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы