Преимущества использования подготовленных операторов над нормальными заявлениями mysqli?

Я сделал свое исследование и решил использовать подготовленные заявления в своих запросах, все, о чем я прошу, есть ли что-нибудь, что я должен знать, хороший или плохой переход на обычные запросы mysqli к подготовленным операциям.

Кроме того, я не понимаю логики, как не нужно избегать неприятных символов?

Сохранение плохих символов по-прежнему необходимо, но библиотека делает это автоматически для всех параметров, которые вы связываете. Это немного более удобно и не позволяет программисту забыть о необходимости дезинфекции.

Однако учтите, что этот автоматизм ограничен параметрами!

Следующий запрос является безопасным, поскольку bind_param() заботится об экранировании:

 $code = $_GET["code"]; $name= $_GET["name"]; $percentage= $_GET["percentage"]; $stmt = $mysqli->prepare("INSERT INTO items VALUES (?, ?, ?)"); $stmt->bind_param('iss', code, $name, $percentage); $stmt->execute(); 

следующий запрос небезопасен , потому что все , что вы помещаете непосредственно в запрос, не будет автоматически экранировано :

 $tablename = $_GET["prefix"]."_items"; $code = $_GET["code"]; $name= $_GET["name"]; $percentage= $_GET["percentage"]; ---- UNSAFE! ---- $stmt = $mysqli->prepare("INSERT INTO `$tablename` VALUES (?, ?, ?)"); $stmt->bind_param('iss', $code, $name, $percentage); $stmt->execute(); 

при этом не следует использовать динамические имена таблиц, как показано в этом примере. Но точка стоит: будьте осторожны, даже с параметризованными запросами!

Единственным недостатком, о котором я могу думать, является то, что вы больше не можете видеть окончательный запрос для отладки (потому что он собирается только на стороне сервера).

  1. Если вы используете подготовленные инструкции с заполнителями ( ? Unnamed, или :name named), значения, которые вы вставляете, автоматически цитируются.
  2. Подготовленные заявления предварительно компилируются с помощью dbms-engine. Таким образом, запрос обрабатывается только один раз, а в последующих вызовах он просто заменяет заполнители значениями.

Есть как минимум два преимущества:

  • Вам не нужно иметь дело с экранирующими значениями : это делается автоматически (при использовании связанных параметров, конечно)
  • Оператор отправляется на SQL-сервер, подготовленный только один раз ; и, следовательно, может выполняться несколько раз – что отлично подходит для выступлений (оператор анализируется только один раз, даже если он выполняется много раз)

Большинство людей путают подготовленные заявления с заполнителями.

Общая идея использования заполнителей действительно велика, а готовые заявления – всего лишь подмножество заполнителей с ограниченной функциональностью.

Заполнители великолепны, потому что:

  • они безопаснее, потому что они делают все правильное форматирование (не глупые «побеги»!)
  • они проще в использовании, потому что они делают все правильное форматирование автоматически.
  • они удобны, поскольку они делают все правильное форматирование только по значению, которое идет прямо в запрос, но не по исходной переменной.

Что касается проблем с производительностью, о которых все говорят, большинство подготовленных инструкций медленнее обычного запроса. Однако в обоих случаях разница будет незаметной.