условие else ничего не делает

#php #mysql #mysqli

#php #mysql #mysqli

Вопрос:

Пытаюсь проверить хэшированный пароль, который работает нормально, если введенный пароль верен, но если это не так, то ничего не происходит.
это означает, что все, написанное после ‘else’, не работает.
код выглядит примерно так:

 if (password_verify($password, $hash)) {
        while ($row = $x->fetch_assoc()) {
            $_SESSION['logged_in'] = true;
            $_SESSION['username'] = $username;
            ?>
            <div class="right">You are logged in!</div>
            <script>
                setTimeout(function () {
                    window.location.href = "admin/adminpanel.php";
                }, 2000);
            </script>
            <?php
        }
    } else {
        echo "Wrong"; //Here I tried both echoing something or using html but none of them worked
        ?>
        <div class="wrong">Username or password is invalid</div>
        <?php
    }
  

Обновить

Это полный код, если это необходимо:
PHP:

  if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = mysqli_real_escape_string($conn, $_POST['username']);
    $password = mysqli_real_escape_string($conn, $_POST['password']);
    $q = "SELECT * FROM users WHERE username='$username'";
    $x = $conn->query($q);
    $hash = password_hash($_POST['password'], PASSWORD_BCRYPT);
    if (password_verify($password, $hash)) {
        while ($row = $x->fetch_assoc()) {
            $_SESSION['logged_in'] = true;
            $_SESSION['username'] = $username;
            ?>
            <div class="right">You are logged in!</div>
            <script>
                setTimeout(function () {
                    window.location.href = "admin/adminpanel.php";
                }, 2000);
            </script>
            <?php
        }
    }  {
        ?>
        <div class="wrong">Username or Password is invalid</div>
        <?php
    }

}
  

HTML:

 <form method="post" autocomplete="off">
            <input name="username" id="username" placeholder="Username" maxlength="20">
            <input name="password" id="password" type="password" placeholder="Password" maxlength="20">
            <input class="loginbutton" type="submit" value="Login">
        </form>
  

Комментарии:

1. Попробуйте выполнить оператор var_dump(password_verify($password, $hash)) выше вашего if , чтобы убедиться, что оператор if действительно не выполняется. В if-else PHP нет ничего плохого. Я могу вам это гарантировать.

2. if/else работает на 100%. Условие else ничего не делает, вы определенно никогда не достигнете части password_verify в первую очередь. Кроме того, почему код capabule?

3. code is something like this Пожалуйста, опубликуйте фактический код, а не что-то «подобное» ему. В вашем реальном коде могут быть ошибки, которых нет в коде, который вы публикуете. Или, что еще лучше, воспроизведите проблему в минимальной программе, которую мы можем запустить.

4. Скорее всего, в вашем случае password_verify($password, $hash) имеет значение true, но $x->fetch_assoc() имеет значение false.

5. @Mjh cab вы объясните мне, что такое код capabule, поскольку я понятия не имею, что это такое…

Ответ №1:

Прямо сейчас ваш код отлично отслеживается для успешного сценария. Что означает, что у вас есть password_verify($password, $hash) === true и while ($row = $x->fetch_assoc()) { , равное true один раз.

Но для сценария, когда второе условие не выполнено $x->fetch_assoc() === false , вы ничего не делаете. И php следует за вашим if ... else ... утверждением.

Чтобы избежать этого, я предлагаю удалить вашу else строку. Это изменит поток кода, чтобы перейти сразу после того, как if { ... } когда while этого никогда не происходило.

 }
// else {
    echo "Wrong"; //Here I tried both echoing something or using html but none of them worked
    ?>
    <div class="wrong">Username or password is invalid</div>
    <?php
//}
  

Или, возможно, вы можете удалить свой while цикл. Я не вижу, чтобы вы $row где-либо использовали.

  //while ($row = $x->fetch_assoc()) {
        $_SESSION['logged_in'] = true;
        $_SESSION['username'] = $username;
        ?>
        <div class="right">You are logged in!</div>
        <script>
            setTimeout(function () {
                window.location.href = "admin/adminpanel.php";
            }, 2000);
        </script>
        <?php
    //}
  

ОБНОВИТЬ Ваш код должен выглядеть больше как
(Я предполагаю, что:
— вы используете mysqli
— имя пользователя уникально в этой таблице
— столбец password хранит хэши пользовательских паролей
)

 if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $stmt = $conn->prepare("SELECT `username`, `password` FROM users WHERE username= ?";
    $stmt->bind_param('s', $username);
    $stmt->bind_result($name, $hash);
    if ($stmt->fetch()) {
       if (password_verify($password, $hash)) {
            $_SESSION['logged_in'] = true;
            $_SESSION['username'] = $username;
            ?>
            <div class="right">You are logged in!</div>
            <script>
                setTimeout(function () {
                    window.location.href = "admin/adminpanel.php";
                }, 2000);
            </script>
            <?php
        }
    }  

    ?>
    <div class="wrong">Username or Password is invalid</div>
    <?php    
}
  

Комментарии:

1. Спасибо, это сработало, но можете ли вы на самом деле объяснить, почему я не должен использовать else здесь, (я новичок)

2. Я в замешательстве. Зачем удалять else? Это должно работать просто отлично.

3. @Alex Когда я удаляю цикл while, он не проверяет пароль, я имею в виду, что все, что вы вводите при вводе пароля, будет принято как правильный пароль, но первое решение работает.

4. @Jackpotato но что $hash тогда? по логике вещей, это ваш хэш, сохраненный в базе данных и извлеченный где-то ранее. Не так ли?

5. @Alex $hash — это хэшированный пароль, который пользователь вводит при вводе, что теперь я считаю совершенно неправильным.

Ответ №2:

Если я упрощу то, что у вас есть, и удалю вызов mysqli_escape — по сути, это то, что у вас осталось:

 <?php
if (
    password_verify(
        $_POST['password'],
        password_hash($_POST['password'], PASSWORD_BCRYPT)
    )
) {
    echo 'Verified';
} else {
    echo 'Not verified.';
}
  

Теперь вышеупомянутое условие всегда должно выполняться (посмотрите внимательно) и отображать ‘Verified’.

Логика в приведенном выше коде ошибочна.

Чтобы исправить: вы хотите получить хэш вашего ранее сохраненного пароля из базы данных, а затем проверить это (не хэш пароля, который вы только что отправили / опубликовали).

Приведенная выше демонстрация логически некорректного подхода: https://3v4l.org/C88H2