Предупреждение: mysqli_stmt_bind_param (): количество элементов в строке определения типа не соответствует количеству переменных связывания в - PullRequest
0 голосов
/ 17 января 2019

Я делаю систему входа в систему с Php и MySqli, и я только заканчиваю функцию регистрации.

После установки error_reporting (E_ALL) я получаю вышеупомянутую ошибку, одна из двух ошибок, которые я получаю, - это даже если мои операторы if не проходят через ввод, пока не будут отправлены в базу данных. Это мой код:

<?php

require_once "partials/header.php";
error_reporting(E_ALL);

if (isset($_POST["signup-button"])) {
require "includes/dbconn.php";

$username = filter_var($_POST["username"], FILTER_SANITIZE_STRING);
$username = trim($username);

$email = filter_var($_POST["email"], FILTER_VALIDATE_EMAIL);
$email = trim($email);

$password = filter_var($_POST["password"], FILTER_SANITIZE_STRING);
$passwordRe = filter_var($_POST["passwordRe"], FILTER_SANITIZE_STRING);

$termsOfService = filter_var($_POST["terms"], FILTER_SANITIZE_STRING);
$errors = [];

if (strlen($username) < 5) {
    $errors[] = "Your Username should contain at least 5 characters";
}

if (!$email) {
    $errors[] = "Your E-Mail is invalid.";
}

if (strlen($password) < 6) {
    $errors[] = "Your password should contain at least 6 characters.";
}

if ($password !== $passwordRe) {
    $errors[] = "Both passwords should be identical";
}

if (!$termsOfService) {
    $errors[] = "Please accept our Terms of Service";
} else {
    /*$sql = "INSERT INTO usersvet (userName, email, password) VALUES
                    ('" . $username . "', '" . $email . "', '" . $hashedPwd . "')";

        if (!mysqli_query($dbConnection, $sql)) {
            die(mysqli_error($dbConnection));*/
    $sql = "SELECT userName FROM usersvet WHERE userName=? AND pwd=?";
    $statement = mysqli_stmt_init($dbConnection);

        if (!mysqli_stmt_prepare($statement, $sql)) {
            $errors[] = "Sql Error.";
        } else {
            mysqli_stmt_bind_param($statement, "s", $username);
            mysqli_stmt_execute($statement);
            mysqli_stmt_store_result($statement);
            $resultCheck = mysqli_stmt_num_rows($statement);

            if ($resultCheck > 0) {
                $errors[] = "User already taken.";                 
            } else {
                $sql = "INSERT INTO usersvet (userName, email, pwd)
                                            VALUES (?, ?, ?);";
                $statement = mysqli_stmt_init($dbConnection);

                if (!mysqli_stmt_prepare($statement, $sql)) {
                    $errors[] = "SQL Error.";
                } else {
                    $hashedPwd = password_hash($password, PASSWORD_DEFAULT);
                    mysqli_stmt_bind_param($statement, "sss", $username, $email, $hashedPwd);
                    mysqli_stmt_execute($statement);
                    mysqli_stmt_store_result($statement);
                }
            }
        }
    }
    mysqli_stmt_close($statement);
    mysqli_close($dbConnection);
}

Вышеупомянутый массив ошибок используется для отправки визуальной обратной связи в виде div на страницу со следующим кодом:

<?php if (!empty($errors)): ?>
    <?php foreach ($errors as $error): ?>
        <div class="well">
            <p class="alert alert-warning"><?= $error ?></p>
        </div>
    <?php endforeach ?>
<?php endif ?>

<?php if (!empty($_POST) && empty($errors)): ?>
        <div class="well">
            <p class="alert alert-success">Sign Up successful. You can now login <a href="login.php">here</a>.</p>
        </div>
<?php endif ?>

1 Ответ

0 голосов
/ 17 января 2019

Если ваша цель - определить, существует ли уже имя пользователя, вам не стоит беспокоиться о пароле.

У вас есть это:

$sql = "SELECT userName FROM usersvet WHERE userName=? AND pwd=?";
mysqli_stmt_bind_param($statement, "s", $username);

Вы хотите это:

$sql = "SELECT userName FROM usersvet WHERE userName=?";
mysqli_stmt_bind_param($statement, "s", $username);

Также обратите внимание, вам необходимо проверить состояние возврата запроса на вставку. В многопользовательской системе другой пользователь может ВСТАВИТЬ запись в промежуток времени между запуском SELECT и запуском INSERT. Поэтому вам нужно убедиться, что ваша база данных имеет уникальное ограничение для поля имени пользователя, а затем проверить, что ваш INSERT выполнен успешно.

Когда вы позже проверите, верен ли предоставленный пользователем пароль, вам нужно будет выбрать пароль:

$sql = "SELECT pwd FROM usersvet WHERE userName=?";
mysqli_stmt_bind_param($statement, "s", $username);

Это вернет хешированный пароль, который вы можете сравнить с тем, что набрал пользователь:

if (password_verify($typedPassword, $hashedPasswordFromDatabase)) {
    // correct password provided
} else {
    // wrong password provided
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...