Вот как я это делаю сейчас:
$ db-> query (sprintf ('INSERT INTO pages (title, content) VALUES ("% s", "% s")', $ Db-> ESC ($ название), $ Db-> ESC ($ содержание)));
Как вы можете видеть, я вручную избегаю каждой строки в указанном выше запросе, передавая каждую строку методу $ db-> esc ().
Сначала позвольте мне указать, что я не хочу использовать подготовленные заявления.
Лучшая идея, которую я могу придумать, состоит в том, чтобы мой метод $ db-> query () обменивал sprintf () и автоматически вызывал $ db-> esc () для каждой спецификации преобразования строк – вот так:
$ db-> query ('INSERT INTO pages (title, content) VALUES ("% s", "% s")', $ Название, $ Содержание);
Это выглядит здорово для меня, но теперь мой вопрос заключается в том, как я правильно разобрать все спецификации преобразования строк из строки формата и вызвать $ db-> esc () для каждого соответствующего аргумента (прежде чем передать это все в sprintf ())?
Вы бы сделали это по-другому?
Вы должны прочитать о подготовленном заявлении .
Подготовьте: шаблон заявления создается приложением и отправляется в систему управления базами данных (СУБД). Определенные значения остаются неуказанными, называемыми параметрами, заполнителями или связующими переменными (помечены как «?» Ниже):
`INSERT INTO PRODUCT (name, price) VALUES (?, ?)`
СУБД анализирует, компилирует и выполняет оптимизацию запросов в шаблоне оператора и сохраняет результат без его выполнения. Выполнение: позднее приложение прикладывает (или связывает) значения для параметров, а СУБД выполняет оператор (возможно, возвращает результат).
И это внедрение в PHP: PDO , MySQLi , PostgreSQL и другие. Таким образом, нет никаких оснований для его реализации. Просто используйте его.
Сначала позвольте мне указать, что вы хотите использовать подготовленные заявления.
Очень автоматическое «ускользание» (хотя его нужно назвать форматированием ), о котором вы говорите, это то, за что именно подготовлены утверждения.
Подготовленный оператор необязательно должен основываться на подготовленном для базы данных заявлении. Общая идея подготовленного оператора состоит в том, чтобы представить часть запроса с помощью заполнителя и применить некоторое форматирование при замене заполнителя активными данными. Итак, ваш подход уже использует подготовительные заявления заполнителей AKA.
Но есть некоторые важные вещи, которые вы пропустили
esc()
Итак, здесь вы идете – код для такой обертки, о которой вы просите , что делает правильное форматирование, и, следовательно, ваши запросы будут не менее безопасными, чем с PDO. Хотя со всеми ограничениями, которые имеет PDO.
Итак, если вы хотите правильно форматировать все , что может быть добавлено в запрос, вам понадобится другая оболочка, более сложная: safeMysql