Хороший тон в общении с MySQL на PHP

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

про PHP

Для начала расскажу о двух директивах в конфигурационном файле php: magic_quotes_gpc и magic_quotes_runtime.

magic_quotes_gpc отвечает за автоматическое добавление слешей к данным пришедшим в скрипт извне (post, get, cookie, http authorisation). Таким образом экранируются специальные символы, которые могут оказать нежелательное действие. Например, кавычки.

magic_quotes_runtime говорит движку php экранировать спец.символы в данных полученных во время выполнения скрипта. К примеру данные из БД, файла..

Если вы работаете с базой данных корректно, то от лишних слешей лучше избавиться. Для этого в php.ini можно изменить соответствующие правила. Другой способ — указать директивы в .htaccess:

php_flag magic_quotes_gpc 0
php_flag magic_quotes_runtime 0

Есть и третий способ, более сложный: нужно убрать результат действия magic_quotes_gpc. Для этого проверяете добавлено ли экранирование с помощью get_magic_quotes_gpc. Потом применяете ко всем массивам пришедших данных функцию stripslashes. Этот способ абсолютно правильно будет работать только при и register_globals = off, так что будьте внимательны. С magic_quotes_runtime разобраться достаточно просто — функцией set_magic_quotes_runtime(0);.

про MySQL

Как вы уже знаете, слеши нужны для экранирования кавычек и тп при добавлении данных в БД. Рассмотрим такой mysql-запрос:

SELECT * FROM tbl WHERE login = anonymous

MySQL выдаст ошибку, так как не сможет определить где имя поля, а где данные (подумает что anomymous — это имя другого поля). Чтобы ошибки в запросе не возникало, строковые данные должны обрамляться кавычками:

SELECT * FROM tbl WHERE login = 'anonymous'

Но может случится другая ситуация — что если в самих данных встречается кавычка:

SELECT * FROM tbl WHERE login = 'mc'cloud'

Здесь база данных опять будет ругаться — она подумает что mc — это данные, а cloud — команда. Чтобы этого избежать и нужно экранировать все кавычки в данных, которые посылаются в БД:

SELECT * FROM tbl WHERE login = 'mc\'cloud'

Заметьте, что добавленные слеши всегда отбрасываются базой данных. Таким образом распространенная ошибка — использование stripslashes при получении данных из БД.

Все вышесказанное относится к строковым данным. Числа можно указывать в запросе, не закрывая кавычками. Однако в таком случае следует обязательно убеждаться что число не строка: например, приводя к типу int:

$num = (int)$num

Среди специалистов mysql есть правило хорошего тона - имена полей, таблиц и баз данных заключать в обратные кавычки "`". Это делается для того, чтобы избежать ошибки, например, при совпадении имени таблицы и ключевого слова MySQL. Выглядит это так:

SELECT * FROM `tbl` WHERE `timestamp` = '1212576667'

Такие кавычки слешами не экранируются.

Используя правила описанные в этой заметке, вы избежите многих проблем при работе с базой данных в php. Будьте внимательны!

Теги: 

Добавить комментарий

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешённые HTML-теги: <a> <em> <i> <strong> <b> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd> <p> <br>
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
CAPTCHA на основе изображений
Введите код с картинки