Неправильно работает $result->fetch_assoc(); при использовании через переменную
У меня есть код:
$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, то при вводе верного пароля бесконечно выводится один и тот же результат из базы данных. При прямом использовании всё было нормально, пока не добавил скрипт проверки "Неверный логин или пароль".
Ответы (2 шт):
Потому что вы один раз получили $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-запросах, если не хотите например базу потом из бэкапа восстанавливать
Мне помогла функция 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>';
}
}
который исправно работает. Обратите внимание, что скрипт уязвим.