2017-01-03 2 views
1

Я новичок в PDO, и я пытаюсь извлечь данные, но каждый раз, когда я ввожу свои данные, я получаю неправильную информацию об ошибке. Моя регистрация работает отлично, но когда я вхожу в регистрационные данные, это показывает мне неправильные данные. Здесь я прикрепляю код. подключение файлаЯ пытаюсь создать логин через pdo sqlsrv

class Database { 
    private $host = "*****"; 
    private $dbname = "*****"; 
    private $username = "*****"; 
    private $password = "*****"; 
    public $conn; 

    public function dbConnection() { 
     $this->conn = null;  
     try { 
      $this->conn = new PDO("sqlsrv:Server=" . $this->host . ";Database=" . $this->dbname, $this->username, $this->password); 
      $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } catch(PDOException $exception) { 
      echo "Connection error: " . $exception->getMessage(); 
     } 

     return $this->conn; 
    } 
} 

мой класс

require_once('dbconfig.php'); 

class USER {  
    private $conn; 

    public function __construct() { 
     $database = new Database(); 
     $db = $database->dbConnection(); 
     $this->conn = $db; 
    } 


    public function doLogin($uname,$umail,$upass) { 
     try { 
      $stmt = $this->conn->prepare("SELECT user_id, user_name, user_email, user_pass FROM cust WHERE user_name=:uname OR user_email=:umail "); 
      $stmt->execute(array(':uname'=>$uname, ':umail'=>$umail)); 
      $userRow=$stmt->fetch(PDO::FETCH_ASSOC); 
      if($stmt->rowCount() == 1) { 
       if(password_verify($upass, $userRow['user_pass'])) { 
        $_SESSION['user_session'] = $userRow['user_id']; 
        return true; 
       } else { 
        return false; 
       } 
      } 
     } catch(PDOException $e) { 
      echo $e->getMessage(); 
     } 
    } 
} 

вызов doLogin()

<?php 
    session_start(); 
    require_once("class.user.php"); 
    $login = new USER(); 

    if($login->is_loggedin()!="") 
    { 
    $login->redirect('services.php'); 
    } 

    if(isset($_POST['btn-login'])) 
    { 
    $uname = strip_tags($_POST['txt_uname_email']); 
    $umail = strip_tags($_POST['txt_uname_email']); 
    $upass = strip_tags($_POST['txt_password']); 

    if($login->doLogin($uname,$umail,$upass)) 
    { 
     $login->redirect('services.php'); 
    } 
    else 
    { 
     $error = "Wrong Details !"; 
    } 
    } 
?> 
+0

Как вы сохранить пароль? Вы используете 'password_hash()'? –

+0

Почему вы создаете новый объект соединения db в классе пользователя? Проще расширить класс db в пользовательском классе. – SuperDJ

+1

Я не вижу вызова 'doLogin()' где угодно. Это также может быть полезно увидеть – RiggsFolly

ответ

1

$stmt->rowCount() не возвращает правильный результат в некоторых случаях, если не запускать store_result() перед тестированием количество строк, возвращаемых из SELECT.

require_once('dbconfig.php'); 

class USER {  
    private $conn; 

    public function __construct() { 
     $database = new Database(); 
     $db = $database->dbConnection(); 
     $this->conn = $db; 
    } 


    public function doLogin($uname,$umail,$upass) { 
     try { 
      $stmt = $this->conn->prepare("SELECT user_id, user_name, user_email,user_pass 
             FROM cust 
             WHERE user_name=:uname 
              OR user_email=:umail "); 
      $stmt->execute(array(':uname'=>$uname, ':umail'=>$umail)); 

      // new line 
      $stmt->store_result(); 

      if($stmt->rowCount() == 1) { 
       // moved inside if as no point reading result unless one exists 
       $userRow=$stmt->fetch(PDO::FETCH_ASSOC); 

       if(password_verify($upass, $userRow['user_pass'])) { 
        $_SESSION['user_session'] = $userRow['user_id']; 
        return true; 
       } else { 
        return false; 
       } 
      } else { 
       return false; 
      } 
     } catch(PDOException $e) { 
      echo $e->getMessage(); 
     } 
    } 
} 

В качестве альтернативы вы можете просто сделать

public function doLogin($uname,$umail,$upass) { 
     try { 
      $stmt = $this->conn->prepare("SELECT user_id, user_name, user_email,user_pass 
             FROM cust 
             WHERE user_name=:uname 
              OR user_email=:umail "); 
      $stmt->execute(array(':uname'=>$uname, ':umail'=>$umail)); 

      $userRow=$stmt->fetch(PDO::FETCH_ASSOC); 

      if(!empty($userRow)) { 

       if(password_verify($upass, $userRow['user_pass'])) { 
        $_SESSION['user_session'] = $userRow['user_id']; 
        return true; 
       } else { 
        return false; 
       } 
      } else { 
       return false; 
      } 
     } catch(PDOException $e) { 
      echo $e->getMessage(); 
     } 
    } 
} 
+0

Большое вам спасибо, это сработало. :) –