Как правильно построить SQL-запрос в PHP-скрипте?

Я пытаюсь создать запрос SQL для вставки информации о пользователе в базу данных. $fname а также $lname переменные содержат правильные значения («Джон» и «Доу»), но запрос не выполняется. Вот мой код:

$fname = $_POST['first_name'];
$lname = $_POST['last_name'];
$sql = "INSERT INTO users (fname, lname) VALUES ($fname, $lname)";
mysqli_query($conn, $sql);

после проверки сообщения об ошибке я обнаружил, что этот запрос не выполняется с сообщением об ошибке

Неизвестный столбец «Джон» в «списке полей»

Как правильно включить переменные в запрос SQL, чтобы он работал без ошибок?

  • Этот вопрос не о синтаксисе SQL, с которым я хорошо знаком, а о правилах динамического создания запроса с использованием переменных в сценарии PHP.
  • Я не хочу быстрое исправление, которое только устраняет немедленную ошибку, но современное решение, которое также безошибочно и безопасно.

10

Решение

Самый надежный способ добавить переменную в запрос SQL — это добавить ее через подготовленное заявление.

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

Таким образом, для каждого запускаемого запроса, если будет использоваться хотя бы одна переменная, вы должны заменить ее заполнителем, затем подготовить запрос, а затем выполнить его, передав переменные отдельно.

Прежде всего, вы должны изменить свой запрос, добавив заполнители вместо переменных. Ваш запрос станет:

$sql = "INSERT INTO users (fname, lname) VALUES (?, ?)";

Затем вам нужно будет подготовить его, связать переменные и выполнить:

$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, "ss", $fname, $lname);
mysqli_stmt_execute($stmt);

Как видите, это всего лишь три простые команды:

  • prepare (), куда вы отправляете запрос с заполнителями
  • bind_param, где вы отправляете строку с типами («s» для строки, и вы можете использовать ее для любого типа на самом деле), а не фактические переменные.
  • и выполнить ()

Таким образом, вы всегда можете быть уверены, что ни одна ошибка синтаксиса SQL не может быть вызвана данными, которые вы добавили в запрос! В качестве бонуса, этот код также защищен от внедрения SQL!

Однако есть некоторая соль, поскольку выполнение запроса SELECT с подготовленными инструкциями mysqli может быть более сложным. Поэтому я настоятельно рекомендую выбрать PDO в качестве драйвера базы данных. по многим причинам.

8

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector