Неправильно работает $result->fetch_assoc(); при использовании через переменную

Рейтинг: 0Ответов: 2Опубликовано: 05.02.2023

У меня есть код:

$login = $_POST['login'];
$password = $_POST['psw'];
$sql = "SELECT * FROM `Users` WHERE Name='$login' AND Password='$password'";
$result = mysqli_query($conn, $sql);

$res = $result->fetch_assoc();

if (empty($res) == 1) {
    echo "Неверный логин или пароль!";
}
else {
    while($row = $res){
        echo  $row['Name'];
        echo  ' - ';
        echo  $row['Surname'];
        echo  '<br>';
    }
}

Если я использую $result->fetch_assoc() через переменную $res, то при вводе верного пароля бесконечно выводится один и тот же результат из базы данных. При прямом использовании всё было нормально, пока не добавил скрипт проверки "Неверный логин или пароль".

Ответы

▲ 0Принят

Потому что вы один раз получили $res и больше он у вас никогда не меняется. Его нужно каждый раз вызывать в цикле. Вопрос следующий. Я так понимаю, вы собираетесь выводить только одного юзера. Зачем вам вообще здесь какой-то цикл?

$login = mysqli_real_escape_string($conn, $_POST['login']);
$password = mysqli_real_escape_string($conn, $_POST['psw']);
$sql = "SELECT * FROM `Users` WHERE Name='$login' AND Password='$password'";
$result = mysqli_query($conn, $sql);
$res = $result->fetch_assoc();
if (!$res) {
    echo "Неверный логин или пароль!";
}
else {
    echo  $res['Name'];
        echo  ' - ';
        echo  $res['Surname'];
        echo  '<br>';
}

И всегда экранируйте принимаемые значения в SQL-запросах, если не хотите например базу потом из бэкапа восстанавливать

▲ 0

Мне помогла функция mysqli_num_rows(), таким образом у меня есть код:

$login = $_POST['login'];
$password = $_POST['psw'];
$sql = "SELECT * FROM `Users` WHERE Name='$login' AND Password='$password'";
$result = mysqli_query($conn, $sql);

$count = mysqli_num_rows($result);

if($count == 0) {
    echo "Неверный логин или пароль!";
}
else {
    while($row = $result->fetch_assoc()){
        echo  $row['Name'];
        echo  ' - ';
        echo  $row['Surname'];
        echo  '<br>';
    }
}

который исправно работает. Обратите внимание, что скрипт уязвим.