
В нашем предыдущем операторе вставки MySQL есть один большой недостаток: он открыт для атак SQL-инъекций. Подготовленные отчеты практически устраняют эту озабоченность. Вы сообщаете SQL-серверу, что собираетесь делать, а затем передаете ему данные. Например, вы можете сообщить серверу, что планируете вставлять данные. Если вы отправляете оператор delete, замаскированный под оператор insert, это не имеет смысла и не будет иметь такого же эффекта, как без подготовленных операторов.
Резюме
В нашем классе Author был оператор вставки, который принимал данные и вставлял их в таблицу authors.
Подготовленное заявление
Давайте посмотрим на анатомию подготовленного оператора вставки.
INSERT INTO authors (first_name, last_name, email) VALUES (?, ?, ?)
Эти вопросительные знаки не случайны. Это синтаксис подготовленного оператора. Это говорит о том, что у нас есть три поля, first_name, last_name и email, и каждое из этих полей получит некоторые данные. Важно иметь три знака вопроса, чтобы указать, что данные будут привязаны к этим трем полям.
Шаги просты:
- Подключиться к базе данных
- Подготовьте запрос
- Привязать переменные (данные) к запросу
- Выполнить запрос
- Закрыть соединение
Давайте переварим это по одной строке кода за раз.
- В качестве аргумента передается массив
$data. Массив$dataимеет следующие три ключа:first_name,$last_nameи$email. - Создается оператор
$sql, который будет подготовлен. На данный момент это просто строка. Это просто для некоторой ясности и отделения от кода ниже, чтобы он не был слишком занят. - Создайте экземпляр объекта
DB. ОбъектDBсоздает экземпляр объектаmysqliи сохраняет его в свойстве$_connection. Мы возьмем это и сохраним локально в нашей переменной$mysqli. - Метод
prepareявляется частью объектаmysqli. Мы собираемся передать ему строкуSQL, чтобы он мог ее подготовить. После подготовки он возвращает новый объект, и мы собираемся сохранить этот объект какstatement. - Именно внутри этого объекта
statementмы можем использовать методbind_param. Методbind_paramне принадлежит объектуmysqli. Будьте осторожны с этой ловушкой. - Первый аргумент, ожидаемый методом
bind_param, — это тип переменной, которая будет связана. Поскольку мы привязываем 3 переменные, необходимо знать их типы.sssуказывает, что будут связаны три строки. - Следующие аргументы — это переменные, которые будут связаны. Это данные, которые отправляются через массив
$data. - Наконец, мы вызываем метод
execute, который является частью объектаstatement. - Теперь у нас есть два объекта, которые «открыты». Нам нужно закрыть объект
statementи объект$db. Мы можем сделать это с помощью объекта $db, так как у нас есть методclose(), который указывает$db->_connection->close();.
Полный код
Ниже вы можете найти три файла, которые взаимодействуют друг с другом. Метод insert в нашем классе DB можно удалить, поскольку теперь мы используем подготовленные операторы. Пока оставлю, но возможно со временем удалю.

Дино Кайич в настоящее время является руководителем отдела информационных технологий в Absolute Biotech, материнской компании LSBio (LifeSpan BioSciences, Inc.), Absolute Antibody, Kerafast, Everest BioTech, Nordic MUbio и Exalpha. ». Он также является генеральным директором MyAutoSystem. У него есть B.S. в области компьютерных наук, по специальности биология и более десяти лет опыта разработки программного обеспечения. Его опыт включает в себя создание приложений для электронной коммерции на уровне предприятия, разработку программного обеспечения на основе исследований и содействие распространению знаний посредством письма.
Вы можете связаться с ним в LinkedIn, подписаться на него в Instagram или подписаться на его публикацию в Medium.