Warning: count(): Parameter must be an array or an object that implements Countable

Я полный чайник в php и mysql. Решил сделать сайту простую авторизацию. Если с созданием регистрации проблем не возникло: все данные отлично записываются в бд, mо вот процесс самой авторизации не выходит. Выдаёт ошибку. Ругается на 14 строчку кода и пишет "Пользователь не найден".

   $email = filter_var(trim($_POST['email']),
   FILTER_SANITIZE_STRING);
   $password = filter_var(trim($_POST['password']),
   FILTER_SANITIZE_STRING);

   $password = md5($password."kajkglkjdhflajksdh123");

   $mysql = new mysqli('localhost', 'root', '', 'bdname');

   $result = $mysql->query("SELECT * FROM `users` WHERE `email` = '$email' AND `password` = '$password'");
   $user = $result->fetch_assoc();
   if(count($user) == 0) {
      echo "Пользователь не найден";
      exit();
   }

   setcookie('user', $user['email'], time() + 3600, "/");

   $mysql->close();

   header('Location: /album');
?> 

Ответы (1 шт):

Автор решения: Kirill Vercetti

Нужно убрать из условия функцию count, она лишняя, т.к. у вас возвращается либо массив с данными о пользователе, либо пустота, третьего быть не должно.

Вообще как вы извлекаете пользователя и как передаете параметры в запрос сделано не корректно.

Во-первых, нужно (если еще не сделано) сделать email уникальным и выбирать из БД пользователя по нему.

Во-вторых, md5 не надежный хеш, лучше используйте специальные встроенные функции https://www.php.net/manual/ru/function.password-hash.php и аналогичные для проверки.

Затем когда вы получили пользователя из БД по email, если он существует, то создаете хеш по введенному паролю и сравниваете с хешем в БД.

Никогда не вставляйте данные в запрос на прямую, используйте подготовленные выражения. В принципе я могу вам скинуть свой урок, если это не запрещено сообществом =)

→ Ссылка