Типичные косяки с базой в PHP + MySQL, которые долго ищутся
Всем привет! Поделюсь наблюдениями по работе с MySQL из PHP — много раз натыкался на грабли, которые реально доставляют.
1) Забыл про подготовленные запросы и впилил переменные прямиком в SQL. Итог — то баги, то дыра для инъекций, а иногда кавычки так спотыкаются, что хрен поймёшь — в коде или в базе проблема.
2) Не проверял результат выполнения запросов. Тренд: if (!$res) { echo mysqli_error($conn); } и всю голову не ломать.
3) Кодировка — главный враг. В базе utf8mb4, в PHP старый utf8 — буквы режутся, апострофы ломают вывод, а ошибка не всегда понятна.
4) Использование mysqli или PDO, но не в режиме исключений — ловить ошибки сложнее и дебаг превращается в тортуры.
5) Шаманство с fetch_assoc()/fetch_array(). Иногда берёшь не тот fetch, и данные идут не тем форматом — непонятно, почему foreach не рулит.
6) Закрытие соединения забывается — долго висит. Хотя PHP сам это делает по завершении скрипта, но если запросов много, лучше закрыть руками.
7) Параллельные запросы не держал, а хотелось — всё виснет, пока первый не отработает.
Если не проверяете каждый шаг и не вылавливаете ошибки — быстро потеряетесь. Кто чем пользуется для отладки MySQL запросов в PHP? Делаете ли строгую обработку ошибок или тупо ориентируетесь на echo mysqli_error()?
Часто залипаю на том, что забыл везде поставить проверку ошибок и по итогу сидишь гадал, почему запрос не работает. Пока не начал заиспользовать подготовленные выражения и унифицировать кодировку, постоянно были вылеты с апострофами. Ну и нормальный режим исключений в PDO спасает много нервов, правда.
У меня тоже из-за отсутствия проверки ошибок долго крутилась голова — потом начал вообще ловить исключения с PDO, сразу стало проще. С кодировкой мучился, пока не прокидывал везде utf8mb4, апострофы меньше сыпались. А ещё одинаковый fetch надо выбирать, а то данные в массиве куда-то теряются, и дебаг — дикое дело было.