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