Я пытаюсь создать форму регистрации, используя php и sql, но продолжаю получать сообщение об ошибке «объект mysqli_stmt не полностью инициализирован». Файл Registration.php:
$sql = "INSERT INTO user_table ('user_name', 'user_email', 'user_password') VALUES (?, ?, ?)";
$stmt = mysqli_stmt_init($conn);
if (mysqli_stmt_prepare($stmt, $sql)){
header("location: ../signup.php?error=sqlerror");
exit();
} else {
//hashing password
$hashedPass = password_hash($password, PASSWORD_DEFAULT);
//inserting hashed password.
mysqli_stmt_bind_param($stmt, "sss", $username, $email, $hashedPass);
mysqli_stmt_execute($stmt);
header("location: ../signup.php?success=registered");
exit();
}
Думаю, проблема в этой части (в строке №8).
Вам также потребуется исправить логическую ошибку, позвонив в if (!mysqli_stmt_prepare($stmt, $sql)).






Если мы удалим вашу проверку if / else и запустим все, с mysqli_stmt_prepare после mysqli_stmt_init мы получим то, что ожидаем.
$stmt = mysqli_stmt_init($conn);
mysqli_stmt_prepare($stmt, $sql);
Таким образом, логика вашего if кажется, что ей нужен! (имеется в виду ложь). Попробуйте это изменить в своем блоке кода:
$sql = 'INSERT INTO user_table (user_name, user_email, user_password) VALUES (?, ?, ?)';
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt, $sql)) {
header("location: ../signup.php?error=sqlerror");
exit();
} else {
//hashing password
$hashedPass = password_hash($password, PASSWORD_DEFAULT);
//inserting hashed password.
mysqli_stmt_bind_param($stmt, 'sss', $username, $email, $hashedPass);
mysqli_stmt_execute($stmt);
header("location: ../signup.php?success=registered");
exit();
}
Приведенный выше код работал в моем тесте.
Вы можете заключить оператор if вокруг вызова функции без использования переменной. Таким образом, вы можете выполнить if (!mysqli_stmt_prepare()) { ... } для ожидаемых результатов с исправлением логики. Другим решением в вашем ответе было удаление одинарных кавычек ' вокруг идентификаторов имен столбцов, из-за чего mysqli_stmt_prepare() возвращал false в запросе OP, попадая в mysqli_stmt_bind_param(), и выдавал сообщение об ошибке из-за неверной логики.
@WillB. Спасибо. Обновлено, чтобы уточнить. Отметим, что кавычки не имеют значения в именах столбцов (работают с ними или без них, хотя моему csfixer они не понравились). Добавлена подготовка к if, но я изначально хотел, чтобы она была более явной, когда OP прочитает код.
Да, OP использовал одинарные кавычки ' вокруг имен столбцов вместо обратных кавычек `. Рекомендуется использовать обратные кавычки для идентификаторов, когда это необходимо для зарезервированные ключевые слова, таких как user, password, date, name и т. д., Чтобы избежать потенциальных проблем, но это не всегда необходимо. С префиксом user_ они не нужны.
Простая опечатка: вы использовали одинарные кавычки
'для обертывания идентификаторов, а не обратную кавычку`идентификационная цитата в вашем запросе, из-за чегоmysqli_stmt_prepareвозвращаетfalse. Его нужно переписать какINSERT INTO user_table (`user_name`, `user_email`, `user_password`) ...