ОБНОВЛЕНИЕ Запрос в PHP / MySQL Сбой с кодом ошибки 1064, SQLState 42000

0

При создании моего приложения я создал запрос создания без проблем. Однако, когда я скопировал свой 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();
    }
}
  • 0
    try: поместите $ phonenumber в одинарные кавычки в запросе. без этого числа
Теги:

2 ответа

1
Лучший ответ

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

$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 = ?';
1

Не используйте 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);
  • 0
    Если вы собираетесь изучать готовые утверждения, вот полезный инструмент для этого. wbr.bz/QueryPro

Ещё вопросы

Сообщество Overcoder
Наверх
Меню