В нашем предыдущем операторе вставки 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.

Прочитайте все истории Дино Каджика (и тысяч других авторов на Medium). Ваш членский взнос напрямую поддерживает Дино Кайича и других писателей, которых вы читаете. Вы также получите полный доступ ко всем историям на Medium.