Где ошибка в скрипте авторизации?

Написал легкую сис-му авторизации на ОПП, которая в свою очередь работает на сессиях.

Собственно сама функция.

function login() {
		if (!empty($_POST)) {
		  
          $login = mysql_real_escape_string(htmlspecialchars($_POST['login'])); //немного профильтруем логин
          $password = md5($_POST['password']); //хешируем пароль т.к. в базе именно хеш
		  $user = $this->db->query("SELECT * FROM rust_users WHERE login = ? AND password = ?",$login,$password)->assoc();
          
			if (mysql_num_rows($user) == 1) {
			 $row = mysql_fetch_assoc($user);
				    $_SESSION['id'] == $row['id'];
                    $_SESSION['login'] == $row['login'];
                    setcookie("CookieMy", $row['id'], time()+60*60*24*10);
				
				//header("Location: /");
			} else
				$this->error = 'Неправильный емейл или пароль';
		}		
		$this->out('login.php');
	}


Ошибка: Warning: mysql_num_rows() expects parameter 1 to be resource, null given in Y:\home\oop.ru\www\app\ctrlIndex.php on line 21. Я понимаю, что в mysql_num_rows() ничего не приходит, но не могу разобраться из-за чего.
  • Вопрос задан
  • 2964 просмотра
Пригласить эксперта
Ответы на вопрос 4
@AlexP11223
А зачем вы пытаете смешивать PDO и mysql_ функции?

И по какому принципу вы выставляете отступ у строк? Зачем они так странно и непредсказуемо прыгают?
Ответ написан
cha-cha
@cha-cha
Какое ООП, вы о чем? Повсюду mysql_* функции.
md5 выкиньте. password_hash
htmlspecialchars к чему? mysql_real_escape_string тоже в мусорку. PDO сам эскейпит когда подставляет переменную на место ?

Edit:
mysql/mysqli ничего общего с PDO не имеют.
Ответ написан
@eandr_67
web-программист (*AMP, Go, JavaScript, вёрстка).
1. При использовании подготовленных выражений (т.е. '?' на месте значения параметра в запросе) никаких mysql_real_escape_string и прочих функций экранирования НЕ НУЖНО!
Должно остаться только: $login = htmlspecialchars(trim($_POST['login']));
2. Для хэширования пароля есть специальная функция crypt. А в новых версиях PHP целый набор функций ru2.php.net/manual/ru/ref.password.php. При хэшировании к паролю необходимо добавлять соль.

3. Если используется utf-8 (или другой вариант юникода), то логин нужно дополнительно нормализовать - чтобы не было разных логинов, которые внешне выглядят совершенно одинаково:
$login = htmlspecialchars(trim(Normalizer::normalize($_POST['login'], Normalizer::FORM_KC)));
Ответ написан
Комментировать
cjbars
@cjbars
cкорее всего в $user уже готовый массив. А для mysql_num_rows нужно открытое соединение с базой и запрос. В движке скорее всего соединение уже закрывается.
Попробуйте заменить
if (mysql_num_rows($user) == 1) {

на
if (count($user) == 1) {

И далее соответственно работать уже с массивом $user
Вместо:
$row = mysql_fetch_assoc($user);
$_SESSION['id'] == $row['id'];

делать как то так
$_SESSION['id'] = $user['id']; (один знак равенства для присвоения)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы