Как проверить данные для авторизации через MySQL?

Я хочу сделать проверку по логину и паролю для авторизации через MySQL
В гугле, почти все делают через условие с функцией определяющие количество
таких же логинов и паролей, но как я понял php поменял что-то в функции.
Найти через документацию не удалось. Вопрос заключается в том что, как и через
что теперь нужно проверять данные через MySQL? В моем случае это логин и пароль.

Ошибка:
Fatal error: Uncaught TypeError: mysqli_num_rows(): Argument #1 ($result) must be of type mysqli_result, bool given in


Функция и код:
if (mysqli_num_rows($checkUser) > 0)
  • Вопрос задан
  • 581 просмотр
Решения вопроса 1
Immortal_pony
@Immortal_pony Куратор тега PHP
mysqli_query возвращает false если во время выполнения запроса произошла ошибка. Поэтому, если вы уж пишете в таком стиле, то извольте проверять, что во время выполнения запроса ошибки не произошло. Примерно так:
$checkUser = mysqli_query($connect, "SELECT * FROM `users` WHERE `email` == '$email' AND `password` == '$password'");
if ($checkUser  === false) {
    die(mysqli_error($connect));
}


После того как вы добавите в код проверку, вы увидите что система ругается на некорректный синтаксис SQL-запроса. Конкретно в вашем случае это использование "==" для сравнения. В MySQL используется одинарное "=" для сравнения.
После того как вы исправите эту ошибку, код ваш заработает, но он будет очень небезопасным.
Для того чтобы подставлять значения из php-перемнных в SQL-запрос, используйте подготовленные выражения.

Более подробно расписано почему не стоит использовать mysqli_num_rows и как пользоваться подготовленными выражениями (информация была скопирована отсюда):

Это очень хороший вопрос.
Ответ на него - никак не использовать.

Да, в mysqli действительно есть специальная функция, которая может сказать, какое количество строк вернул запрос SELECT.
Традиционно употребляется в двух случаях:

а) когда это не нужно
б) когда приводит к катастрофическим последствиям

Первый вариант - это когда мы хотим узнать, вернул ли запрос хоть какие-то данные, или нет. Но на этот случай у нас есть сами данные. Зачем отдельно запрашивать их количество, если мы все равно будем эти данные получать в переменную, которую потом и можно будет использовать чтобы узнать, вернул ли запрос что-нибудь или нет.

Второй вариант - если эта функция используется чтобы посчитать, сколько строк лежит в БД. В таком варианте это будет откровенное вредительство, поскольку данных может быть очень много, и все эти данные БД должна сначала получить у себя, а потом отправить в РНР. Заняв всю доступную память или даже вызвав фатальную ошибку нехватки памяти.

Правильным решением этой задачи будет сделать запрос вида SELECT COUNT(*) FROM .... В этом случае БД сама внутри себя посчитает количество строк (очень быстро) и вернёт только одно число, которое не занимает оперативную память вообще.

Вот и получается, что функция mysqli_num_rows() является либо вредной, либо бесполезной

В данном случае надо сначала получить записи из БД
// БЕЗОПАСНО выполняем запрос
$stmt = $link->prepare("SELECT * FROM comments WHERE art_id = ?");
$stmt->bind_param("s", $note_id);
$stmt->execute();
// получаем данные
$result = $stmt->get_result();
$comments = $result->fetch_all(MYSQLI_ASSOC);


А после этого уже их выводить
<?php if ($comments): ?>
    <?php foreach ($comments as $row): ?>
         <?=$row['comment']?><br>
    <?php endforeach ?>
<?php else: ?>
    Эту запись еще никто не комментировал
<?php endif ?>


Как видно, никакой mysqli_num_rows нам не понадобилось
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 18:38
1500 руб./в час
19 апр. 2024, в 18:36
1500 руб./за проект
19 апр. 2024, в 18:36
30000 руб./за проект