2013-04-22 3 views
0

Я меняю свой регистрационный учет и логин на другое шифрование (Phpass), потому что все говорят, что md5 уже не безопасен. Я сумел заставить функцию регистра работать, но не могу понять, почему login aint работает. Этот код работает без ошибок, но не проходит из этой строки. if($stm->rowCount()>0){}Вход в Phpass не работает

Пожалуйста, игнорируйте прокомментированный код, его старую версию входа. Любые предложения приветствуются!

include("include/connection.php"); 
     require_once('include/PasswordHash.php'); 

     function login($db){ 
      if (isset($_GET["type"])){ 
       if($_GET["type"]=="log" && isset($_POST['email']) && isset($_POST['password'])){ 

        session_start(); 

        $email = $_POST['email']; 
        $password = $_POST['password']; 
        $hasher = new PasswordHash(8, false); 

        if($email=='' || $password==''){ 
         echo "<font style='background-color: #F9C5CA'>Error: Please fill the required fields.</font>"; 
        }else{ 

         //$password = md5($password); 
         $pass = $hasher->HashPassword($_POST['password']); 

         $sql = "SELECT email,password,id FROM user WHERE email=? AND password=?"; 
         $stm = $db->prepare($sql); 
         $stm->execute(array($email,$pass)); 
         $row = $stm->fetch(PDO::FETCH_ASSOC); 

         /*if($stm->rowCount()>0){ 

          $_SESSION['id']=$row['id']; 
          header('Location: cpanel/#welcome'); 
         }else{ 
          echo "<font style='background-color: #F9C5CA'>Error: Your email and/or password are incorrect. Please try again.</font>"; 
         }*/ 

         if($stm->rowCount()>0){ 
          if ($hasher->CheckPassword($pass,$row['password'])) { 
           $_SESSION['id']=$row['id']; 
           header('Location: cpanel/#welcome'); 
           exit(); 

          }else{ 
           echo "<font style='background-color: #F9C5CA'>Error: Your email and/or password are incorrect. Please try again.</font>"; 
          } 
         } 
        } 
       } 
      } 
     } 
+0

Вам необходимо получить сохраненный пароль из базы данных, чтобы проверить его с помощью прилагаемого. – Gumbo

+1

Ваша проблема может быть функцией rowCount(). Если вы читаете [документ PDO в rowCount] (http://php.net/manual/en/pdostatement.rowcount.php), он говорит, что вы не можете получить желаемые результаты при использовании инструкции SELECT. –

+0

@Gumbo Сохраненный хэшированный пароль на db поступает из Select, поэтому я не думаю, что проблема там. – miguelfsf

ответ

0

Вы можете изменить условный, потому что есть несколько способов, чтобы заменить rowCount():

Если пользователь существует, то $row = $stm->fetch(PDO::FETCH_ASSOC); возвращает массив с данными, если нет пользователя, то будет возвращать пустой массив:

// Count array and check if is greater than 0 
if (count($row) > 0) 
// Check if array is not empty 
if (!empty($row)) 
// Simple check. An empty array would return false 
if ($row) 
+0

Проблема его не там сейчас. Теперь он попадает внутрь первого, если, но не запускает второй, если и перескакивает на другое. Любой отзыв? – miguelfsf

+1

После этой строки: '$ row = $ stm-> fetch (PDO :: FETCH_ASSOC);' run this: 'die (print_r ($ row));' Это будет печатать содержимое массива, поэтому вы можете проверить, что функция '$ hasher-> CheckPassword()' получает правильные параметры. –

+0

Извините за ожидание, мне пришлось пойти обедать. Поэтому я попытался умереть(), как вы сказали, и получить правильные параметры. Проблема должна быть в этой строке 'if ($ hasher-> CheckPassword ($ pass, $ row ['password'])) {}' и я не могу понять почему. < – miguelfsf

0

удостоверьтесь, что хешированный пароль имеет 60 символов, что-то еще вернет false. У меня такая же проблема, и мой первый хешированный пароль был 61 персонаж.

Смежные вопросы