2016-07-28 8 views
0

こんにちは、私は電子メールでログインしています。 SQLクエリで(login =:login OR)を追加すると、パスワードでログインできるバグがあります。ここではいくつかのコード PHPでログインしてmysqlでメールを送信

public function login($login,$upass) 
{ 
    try { 
     $stmt = $this->conn->prepare("SELECT * FROM Klient WHERE login=:login OR email=:login LIMIT 1"); 
     $stmt->execute(array(':login' => $login)); 
     $userRow = $stmt->fetch(PDO::FETCH_ASSOC); 

     if ($stmt->rowCount() == 1) { 
      if ($userRow['userStatus'] == "Y") { 
       if ($userRow['haslo'] = $upass) { 
        $_SESSION['userSession'] = $userRow['idKlient']; 
        return true; 
       } else { 
        header("Location: index.php?error"); 
        exit; 
       } 
      } else { 
       header("Location: index.php?inactive"); 
       exit; 
      } 
     } else { 
      header("Location: index.php?error"); 
      exit; 
     } 
    } catch (PDOException $ex) { 
     echo $ex->getMessage(); 
    } 
} 

EDIT:

私はpassword_hashを()を追加しようとしていますが、私は私のウェブサイトにログインしたときに下がっています。 私はパスワードハッシュを追加しようとしましたが、私はにログインしたときに私のウェブサイトがダウンして起こっている。

public function login($login, $upass) 
    { 
     try { 
      $stmt = $this->conn->prepare("SELECT * FROM Klient WHERE login=:user_login OR email=:user_login"); 
      $stmt->execute(array(":user_login" => $login)); 
      $userRow = $stmt->fetch(PDO::FETCH_ASSOC); 

     if ($stmt->rowCount() == 1) { 
      if ($userRow['userStatus'] == "Y") { 
       if (password_verify($upass, $userRow['haslo'])) { 
        $_SESSION['userSession'] = $userRow['idKlient']; 
        return true; 
       } else { 
        header("Location: index.php?error"); 
        exit; 
       } 
      } else { 
       header("Location: index.php?inactive"); 
       exit; 
      } 
     } else { 
      header("Location: index.php?error"); 
      exit; 
     } 
    } catch (PDOException $ex) { 
     echo $ex->getMessage(); 
    } 
} 

答えて

0

あなたがここで変更する必要があるあなたは$を与えている

$stmt->execute(array(':login' => $login,':email' => $login)); 
0
if ($userRow['haslo'] = $upass) { 

また、電子メールのためのparamを追加userRow ['haslo']パスワードは、=== で確認する必要があります。平文ではないハッシュを使用してください。password_hash

0

$stmt = $this->conn->prepare("SELECT * FROM Klient WHERE login = :login: OR email = :email: LIMIT 1") 
$stmt->execute(array('login' => $login, 'email' => $upass)); 

をそして、私の提案は、あなたが、execの前に何かの変数をチェックすることです:ようmething

if(isset($login) && isset($upass)) { 
    ... 
} 

これが役に立てば幸い、歓声を!

0

を例

<?php 
$sql = 'SELECT * FROM some_table WHERE some_value > :value OR some_value < :value'; 
$stmt = $dbh->prepare($sql); 
$stmt->execute(array(':value' => 3)); 
?> 

のために、単一のSQL文で二度同じ名前のパラメータを使用しないでください...これは何の行となしエラーを返しません - あなたは一度だけ、各パラメータを使用する必要があります。一度。どうやらこれは移植性の問題のために(このバグレポート:http://bugs.php.net/bug.php?id=33886による)予想される動作です。