1

Доброго времени суток !
Есть sql запрос:

$gPlaceholderName = $mysqli->query("SELECT `gPlaceholderName` FROM `gData` WHERE `gID` = '$gID'");

Помогите составить подготавливаемый запрос и объясните как ими пользоваться и в будущем их составлять самому.

tonymore
  • 329
  • 1
    http://php.net/manual/ru/mysqli.quickstart.prepared-statements.php http://php.net/manual/ru/mysqli.prepare.php – Kirill Dec 07 '17 at 22:05
  • Уважаемый @KirillKorushkin, я ознакамливался с этой документацией, но с практикой проблемы, мне бы один пример для моего случая, а дальше пойму. Я еще не все тонкости построений sql запросов знаю. Много ужасов про sql инъекции узнал. – tonymore Dec 07 '17 at 22:11
  • @tonymore в мануале SELECT и у вас SELECT, в мануале подставляется один параметр в WHERE и у вас (разве что тип bind_param другой). В мануале подробные комментарии написаны... Если их вам не хватает, то как поможет точно такой же пример с точно таким же запросом но другим наименованием таблицы? – Алексей Шиманский Dec 07 '17 at 22:23
  • @АлексейШиманский, блин, допер теперь, просто я не замечал объяснения функции bind_param и не понимал что означала и откуда там бралась буква для задающего типа ! – tonymore Dec 07 '17 at 22:46
  • @tonymore Вы копнули немного не туда. Если вы прежде всего обеспокоены безопасностью запроса, тогда вам необходимо экранировать(обрабатывать тело и проверять тип) передаваемые значения. Функций для этого в пхп достаточно и знать их в любом случае придётся. Подготовленный вопрос в данном случае конечно решает вопрос безопасности почти полностью, но задачи у него другие. – Kirill Dec 07 '17 at 22:49
  • @KirillKorushkin, а подготавливаемые запросы экранируют символы ? – tonymore Dec 07 '17 at 22:53
  • @tonymore нет, их экранирует сервер (см. док-цию). http://php.net/manual/ru/mysqli.quickstart.prepared-statements.php – Kirill Dec 07 '17 at 23:00
  • @tonymore просто обрабатывайте данные перед вставкой в запрос и будет вам щастье. Т.е. вы чётко должны знать, что у вас ложится в запрос до того, как оно там окажется. А prepare используйте, если количество одинаковых запросов в бд больше двух. – Kirill Dec 07 '17 at 23:08
  • 1
    @tonymore ознакомьтесь: https://habrahabr.ru/post/143035/ (комменты тоже читайте), это необходимо знать в любом случае. Успехов! – Kirill Dec 07 '17 at 23:09
  • @KirillKorushkin, спасибо большое, понял ! – tonymore Dec 07 '17 at 23:10
  • @KirillKorushkin не надо ерунду писать.... подготовленные выражения вполне себе позволяют нормально всё сделать и 100500 методов обработок и фильтрации не нужны... не надо сбивать с толку людей, особенно статьёй 2012-го года (можно было еще на php 4.6 сразу))).....проверять нужно например на корректность, например, чтобы не ввели отрицательный год рождения к примеру – Алексей Шиманский Dec 08 '17 at 06:25
  • @tonymore По поводу защиты - Не смотрите советы KirillKorushkin - это бред.....достаточно устанавливать правильное соединение, отключить эмуляцию запросов и спокойно использовать подготовленные выражения. В принципе об этом можно попробовать посмотреть тут: Каким образом избежать SQL-инъекций в PHP? и в ответах тут Защищают ли подготовленные выражения/переменные полностью от SQL инъекций? (там есть выводы о том что нужно) – Алексей Шиманский Dec 08 '17 at 06:26
  • 2
    @tonymore хотя совсем четкий вывод есть в конце вот этого ответа: https://stackoverflow.com/a/12202218/6104996 ... Почитайте................................просто я не замечал объяснения функции bind_param и не понимал что означала и откуда там бралась буква - да, в мануале в принципе написано "Метки параметров должны быть связаны с переменными приложения функциями mysqli_stmt_bind_param() и/или mysqli_stmt_bind_result() до запуска запроса или выборки строк" и если перейдете в http://php.net/manual/ru/mysqli-stmt.bind-param.php посмОтрите какие бывают типы. Этого будет ясно – Алексей Шиманский Dec 08 '17 at 06:26
  • @Алексей Шиманский эмуляция, вроде, это про PDO, нет? – Kirill Dec 08 '17 at 08:47

1 Answers1

1

Как подготовить и выполнить SQL запрос ?


Для того чтобы подготовить и выполнить SQL запрос нужно:

  • Подготовить запрос

  • Выполнить привязку переменной к параметрам

  • Выполнить запрос

Подготавливаем запрос

Функция prepare подготавливает SQL выражение к выполнению.
Примечание: Ниже представленный пример выполнен в Объектно-ориентированном стиле

$gPlaceholderName = $mysqli->prepare("SELECT `gPlaceholderName` FROM `gData` WHERE `gID` = ?");

Привязываем переменную к параметру

За привязку переменных к параметрам отвечает функция bind_param.

$gPlaceholderName->bind_param("i", $groupID);

Буква i означает тип integer.
Ниже описаны часто используемые параметры:

  • i - соответствующая переменная имеет тип integer

  • d - соответствующая переменная имеет тип double

  • s - соответствующая переменная имеет тип string

Выполняем запрос

execute отвечает за выполнение SQL запроса.

$gPlaceholderName->execute();

Послесловие

Вся представленная информация взята с официальной русской документации PHP
Также хотел поблагодарить Алексея Шиманского и Кирилла Корушкина за наставление на путь истинный.

tonymore
  • 329