Это сделано для создания ресурса обучения сообщества . Цель состоит в том, чтобы иметь примеры хорошего кода, который не повторяет ужасных ошибок, которые так часто можно найти при копировании / вставке кода PHP. Я попросил сделать это вики Сообщества.
Это не означает соревнование по кодированию. Речь идет не о том, чтобы найти самый быстрый или самый компактный способ выполнения запроса, а о том, чтобы предоставить хороший, читаемый справочник, особенно для новичков.
Каждый день возникает огромное количество вопросов с действительно плохими фрагментами кода, использующими семейство функций
mysql _ *
в Stack Overflow. Хотя обычно лучше направить этих людей к PDO, иногда это невозможно (например, унаследованное устаревшее программное обеспечение) или реалистичное ожидание (пользователи уже используют его в своем проекте).Общие проблемы с кодом, использующим
Библиотека mysql _ *
включает:
- SQL-инъекцию в значениях
- SQL-инъекцию в предложениях LIMIT и имена динамических таблиц
- Нет отчетов об ошибках («Почему этот запрос не работает?»)
- Неработающие отчеты об ошибках (то есть ошибки всегда возникают, даже когда код вводится в производство)
- Внедрение межсайтового скриптинга (XSS) в вывод значения
Давайте напишем образец кода PHP, который выполняет следующие действия, используя mySQL_ * семейство функций :
- Принять два значения POST,
id
(числовой) иимя
(строка)- Выполните запрос UPDATE для таблицы
имя_таблицы
, изменив столбецимя
в строке с идентификаторомid
- В случае сбоя завершите работу, но покажите подробная ошибка только в производственном режиме.
trigger_error ()
будет достаточно; в качестве альтернативы используйте метод по вашему выбору- . Выведите сообщение «
$ name
обновлено.»И не обнаруживает ли какие-либо из перечисленных выше недостатков.
Это должно быть быть максимально простым . В идеале он не содержит никаких функций или классов. Цель не в том, чтобы создать библиотеку для копирования / вставки, а в том, чтобы показать минимум того, что нужно сделать, чтобы сделать запросы к базе данных безопасными.
Бонусные баллы за хорошие комментарии.
Цель состоит в том, чтобы сделать это ставить под сомнение ресурс, на который пользователь может ссылаться, когда встречает человека, задающего вопрос, у которого плохой код (даже если он вообще не является предметом вопроса) или сталкивается с ошибочным запросом и не знает, как его исправить.
Чтобы упредить обсуждение PDO:
Да, часто будет предпочтительнее направить людей, пишущих эти вопросы, в PDO. Когда это возможно, мы должны это сделать. Однако это не всегда возможно - иногда задающий вопрос работает с устаревшим кодом или уже прошел долгий путь с этой библиотекой и вряд ли изменит ее сейчас. Кроме того, семейство функций
mysql _ *
совершенно безопасно при правильном использовании. Поэтому, пожалуйста, не используйте здесь PDO.