Я пытаюсь создать запрос 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 — это добавить ее через подготовленное заявление.
Это очень важно понимать, что простого добавления кавычек вокруг переменной недостаточно и в конечном итоге приведет к неисчислимым проблемам, от синтаксических ошибок до 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);
Как видите, это всего лишь три простые команды:
Таким образом, вы всегда можете быть уверены, что ни одна ошибка синтаксиса SQL не может быть вызвана данными, которые вы добавили в запрос! В качестве бонуса, этот код также защищен от внедрения SQL!
Однако есть некоторая соль, поскольку выполнение запроса SELECT с подготовленными инструкциями mysqli может быть более сложным. Поэтому я настоятельно рекомендую выбрать PDO в качестве драйвера базы данных. по многим причинам.
Других решений пока нет …