Как автоматически избежать строк в запросе PHP SQL?

Вот как я это делаю сейчас:

  $ 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.

Но есть некоторые важные вещи, которые вы пропустили

  • то, что «ускользает», ничего не может принести. Вместо этого следует применять правильное форматирование
  • правильное форматирование строки требует либо кавычки, либо экранирования, и, таким образом, ваш обработчик обработчиков должен применять оба.
  • существует несколько разных SQL-литералов, каждый из которых требует различного форматирования. Таким образом, чтобы соответствовать требованиям реальной жизни, вы не можете полагаться на одну функцию esc()

Итак, здесь вы идете – код для такой обертки, о которой вы просите , что делает правильное форматирование, и, следовательно, ваши запросы будут не менее безопасными, чем с PDO. Хотя со всеми ограничениями, которые имеет PDO.

Итак, если вы хотите правильно форматировать все , что может быть добавлено в запрос, вам понадобится другая оболочка, более сложная: safeMysql