При создании моего приложения я создал запрос создания без проблем. Однако, когда я скопировал свой PHP из файла создания в файл обновления, я получил эту ошибку:
UPDATE people SET firstname = 'First', lastname = 'Last', email = '[email protected]', phonenumber = 1234567890 WHERE id = 1 '
SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MariaDB, для правильного синтаксиса для использования рядом с '' 'в строке 1
Обычно, когда я получаю эту ошибку, ошибка дает мне точное место для исправления. Может ли кто-нибудь помочь мне найти эту ошибку?
update.sql:
if (isset($_POST['submit'])) {
require "../resources/config.php";
require "../resources/common.php";
try {
$connection = new PDO($dsn, $username, $password, $options);
$id = $_GET['id'];
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];
$phonenumber = $_POST['phonenumber'];
$updated_number = array($firstname, $lastname, $email, $phonenumber);
$sql = sprintf(
"UPDATE %s SET firstname = '$firstname', lastname = '$lastname', email = '$email', phonenumber = $phonenumber WHERE id = %s",
"people",
$id
);
$statement = $connection->prepare($sql);
$statement->execute($updated_number);
header("Location: index.php");
}
catch(PDOException $error) {
echo $sql . "<br>" . $error->getMessage();
}
}
У вас здесь две проблемы. Первое, а главное - использование готовых заявлений. Все значения в самом запросе должны быть связаны. Поэтому ваш запрос должен быть действительно:
$updated_number = array($firstname, $lastname, $email, $phonenumber, $id);
$sql = sprintf("UPDATE %s
SET firstname = ?, lastname = ?, email = ?, phonenumber = ?
WHERE id = ?",
"people");
Второе - ваше использование sprintf
.
WHERE id = %s
%s
- строка, %d
- целое число. С правильными подготовленными заявлениями это не требуется. Если "people"
не являются переменной и динамически создаются, мне кажется, что проще всего построить этот весь запрос как обычную строку. например
$sql = 'UPDATE people
SET firstname = ?, lastname = ?, email = ?, phonenumber = ?
WHERE id = ?';
Не используйте sprintf
для создания операторов SQL, поскольку он открывает ваш код до атак SQL Injection, лучше использовать подготовленные инструкции, которые выглядят примерно так:
$sql = "UPDATE 'people' SET 'firstname' = :firstname, 'lastname' = :lastname, 'email' = :email, 'phonenumber' = :phonenumber WHERE 'id' = :id;"
$statement = $connection->prepare($sql);
$statement->bindParam(':firstname', $firstname);
$statement->bindParam(':lastname', $lastname);
$statement->bindParam(':email', $email);
$statement->bindParam(':phonenumber', $phonenumber);
$statement->bindParam(':id', $id);