Неустранимая ошибка: необработанное исключение «PDOException», созданное в C:\xampp\htdocs\register.php в строке 19.

Я получил:

Неустранимая ошибка: необработанное исключение «PDOException» с сообщением «SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064. У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с '5538ac14bb2ca7514f9f4d8826f3c45e'')' в строке 1' в C:\xampp\htdocs\register.php:19 Трассировка стека: #0 C:\xampp\ htdocs\register.php(19): PDO->exec('insert in use...') #1 {main} добавлено в C:\xampp\htdocs\register.php в строке 19.

Как это решить, что делать?

<?php
    session_start();

    // If the form has been submitted

    if (isset($_POST['submitted'])){

        // Create a database connection

        $db = new PDO("mysql:dbname=johnsoa7_db;host=localhost", "root", "");
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // Get and sanitise the inputs, we don't need to do
        // this with the password as we hash it anyway

        $safe_forename = $db->quote($_POST['forename']);
        $safe_lastname = $db->quote($_POST['lastname']);
        $safe_email = $db->quote($_POST['email']);
        $hashed_password = $db->quote(md5($_POST['password']));

        // Insert the entry into the database

        $query = "insert into users values (default, $safe_forename, $safe_lastname, $safe_email, '$hashed_password')";

        $db->exec($query);

        // Get the ID

        $id = $db->lastInsertId();

        // Output success or the errors

        echo "Congratulations! You are now registered. Your ID is: $id";
    }
?>

person Abraham Johnson    schedule 30.03.2017    source источник
comment
php.net/manual/en/pdo.quote.php Если вы используя [PDO::quote()] для построения операторов SQL, настоятельно рекомендуется использовать PDO::prepare() для подготовки операторов SQL с привязанными параметрами вместо использования PDO::quote() для интерполяции пользовательского ввода в оператор SQL. Подготовленные операторы со связанными параметрами не только более переносимы, удобнее, невосприимчивы к SQL-инъекциям, но и часто намного быстрее выполняются, чем интерполированные запросы, поскольку и сервер, и клиент могут кэшировать скомпилированную форму запроса.   -  person ceejayoz    schedule 30.03.2017


Ответы (1)


У вас ошибка в этой строке:

$query = "insert into users values (default, $safe_forename, $safe_lastname, $safe_email,'$hashed_password')";

default следует заключать в кавычки, если это строка.

Если это переменная, вы пропустили $.

См. комментарий @ceejayoz:

Как он сказал, вам не нужно цитировать $hashed_password...

person Sugumar Venkatesan    schedule 30.03.2017
comment
Спасибо, но я пробовал оба метода, и он все равно перестает работать. У меня есть ошибка: $db-›exec($query); Вы знаете, как помочь с этим, пожалуйста? - person Abraham Johnson; 30.03.2017
comment
@AbrahamJohnson Это не ошибка, это строка кода. v Сугумар, вероятно, прав, вам нужны кавычки вокруг бита default. Вероятно, вам не нужны кавычки вокруг $hashed_password, потому что PDO::quote добавляет их за вас, поэтому вы, вероятно, удвоили их. Между прочим, вы на самом деле не хотите использовать MD5 для хеширования паролей. - person ceejayoz; 31.03.2017
comment
как сказал @ceejayoz, вам не нужно заключать в кавычки $hashed_password, это точная проблема .. не мое решение .. поскольку значение по умолчанию будет автоматически преобразовано в строку .. если в этом имени нет константы - person Sugumar Venkatesan; 31.03.2017