2017-11-14 2 views
-1

ログインコードが正常に動作するように苦労しています。正しいユーザー名とパスワードが入力されているにもかかわらず、「ユーザー名またはパスワードが間違っています」というセクションが表示され続けます。私はどこかで何かを逃していますか、助けてください。あなたはハッシュ化された に対して入力されたパスワードをpassword_verifyことができるように、 *ユーザー作成の時点でパスワードのハッシュ化されたコピーを保存する必要があるかもしれません*PHP PDOログインコード - エラーを繰り返し、ログインできません[正しいユーザ名とパスワードが入力されました]

<?php 
//Check login details 
    session_start(); 
    //get user input from the form 
    if (isset($_POST['Submit'])) { 
     $username = checkData($_POST['username']); 
     $password = checkData($_POST['password']); 

     require ('config.php'); //database connection 
     global $dbselect; 

     $qry = 'SELECT username, password 
       FROM users 
       WHERE username = :username AND password = :password 
       LIMIT 1'; 
     $statement = $dbselect->prepare($qry); 
     $statement->bindValue(':username', $username); 
     $statement->bindValue(':password', $password); 
     $statement->execute(); 
     $login = $statement->fetch(PDO::FETCH_ASSOC); 
     if (count($login) > 0 && password_verify($password, $login['password'])) { 
      $_SESSION['username'] = $login['username']; 
      header('location:home.html'); 
     } else { 
      echo "Username or Password incorrect. Please try again."; 
     }  
     $statement->closeCursor(); 
    } 

    //validate data 
    function checkData($data) { 
     $data = trim($data); 
     $data = stripslashes($data); 
     $data = htmlspecialchars($data); 
     return $data; 
    } 
?> 
+0

、最初だけで、彼らはあなたがそれらをここで – Swellar

+1

を返すように期待しているものを戻ってきていることを確認するために、 '数($ログイン)'と 'password_verfiy'によって返された値をチェックして、適切にそれを行う方法です。 [PDOとpassword_verify()を使用してユーザーを認証する](https://phpdelusions.net/pdo_examples/password_hash)あなたは意味をなさないSQLにパスワードを追加しています。 –

+1

その無意味なW3Sの 'checkData'ガベージ機能の使用を止めてください。 – deceze

答えて

-1

/** * DBから返さコピー。 *このようなもの: * $ hashed = password_hash($ password、PASSWORD_BCRYPT); *注:コードをある程度変更しました.plsに適合しました。 */

//Check login details 
session_start(); 
//get user input from the form 
if (isset($_POST['Submit'])) { 
    $username = checkData($username); 
    $password = checkData($password); 

    $dbname  = "testo"; 
    $servername = "localhost"; 
    $conn  = new PDO("mysql:host=$servername;dbname=$dbname", "root", ""); 
    $parr  = array($username,$password); 

    $qry = 'SELECT username, password, phashed 
    FROM users 
    WHERE username = ? AND password = ? 
    LIMIT 1'; 

    $stmt  = $conn->prepare($qry); 
    $Qres  = $stmt->execute($parr); 
    $login  = ($Qres) ? $stmt->fetchAll(PDO::FETCH_ASSOC) : array(); 

    if (count($login) > 0 && password_verify($password, $login[0]['phashed'])) { 
     $_SESSION['username'] = $login[0]['username']; 
     header('location:home.html'); 
    } else { 
     echo "Username or Password incorrect. Please try again."; 
    }  
    $conn = null; 
} 

//validate data 
function checkData($data) { 
    $data = trim($data); 
    $data = stripslashes($data); 
    $data = htmlspecialchars($data); 
    return $data; 
} 
+0

これを試しても、まだ同じ問題があります。 –

+0

ユーザ作成時にハッシュパスワードを保持するフィールドを作成する必要があるかもしれません –

0

次〜うまくいけば、それは利益の証明かもしれません(私はPHP 5.3.2およびそれ故に無password_verifyを持っているように、私は別のテストを使用password_verifyまで)のテストで働いていました。 1については

<?php 
    session_start(); 

    /* error messages used to display to user */ 
    $ex=array(
     0 => 'One or more required POST variables are not set', 
     1 => 'Both username & password are required', 
     2 => 'Failed to prepare SQL query', 
     3 => 'Query failed', 
     4 => 'No results', 
     5 => 'Invalid login details' 
    ); 

    if($_SERVER['REQUEST_METHOD']=='POST'){ 
     try{ 
      if(isset($_POST['Submit'], $_POST['username'], $_POST['password'])) { 

       $username = !empty($_POST['username']) ? filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING) : false; 
       $password = !empty($_POST['password']) ? filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING) : false; 

       if($username && $password){ 

        require('config.php'); 
        global $dbselect;/* ??? */ 

        /* use the username in the sql not password & username */ 
        $sql='select `username`, `password` 
          from `users` 
          where `username` = :username'; 
        $stmt=$dbselect->prepare($sql); 

        /* only proceed if prepared statement succeeded */ 
        if($stmt){ 
         $stmt->bindParam(':username', $username); 
         $status=$stmt->execute(); 

         if(!$status)throw new Exception('',3); 

         $rows=$stmt->rowCount(); 
         if(!$rows > 0)throw new Exception('',4); 

         $result = $stmt->fetchObject(); 
         $stmt->closeCursor(); 


         /* password_verify is available from PHP 5.5 onwards ~ I have 5.3.2 :(*/ 
         if($result && function_exists('password_verify') && password_verify($password, $result->password)){ 
          /* valid */ 
          $_SESSION['username']=$username; 
          exit(header('Location: home.html')); 
         } else { 
          /* bogus - invalid credentials */ 
          throw new Exception('',5); 
         } 
        } else { 
         /* sql prepared statement failed */ 
         throw new Exception('',2); 
        } 
       } else { 
        /* either username or password was empty */ 
        throw new Exception('',1); 
       } 
      } else { 
       /* one or more POST variables are not set */ 
       throw new Exception('',0); 
      } 
     }catch(Exception $e){ 

      /* set a session variable to ensure error message is displayed only once */ 
      $_SESSION['error']=$ex[ $e->getCode() ]; 

      /* reload the login page with error code */ 
      exit(header('Location: ?error=' . $e->getCode())); 
     } 
    } 
?> 

    <!doctype html> 
    <html> 
     <head> 
      <title>Login</title> 
     </head> 
     <body> 
     <!-- the php/html login page --> 

     <form method='post'> 
      <input type='text' name='username' /> 
      <input type='password' name='password' /> 
      <input type='submit' name='Submit' value='Login' /> 

      <?php 
       if($_SERVER['REQUEST_METHOD']=='GET' && isset($_GET['error'], $_SESSION['error'])){ 

        unset($_SESSION['error']); 

        /* display the error message */ 
        echo "<h2 style='color:red'>{$ex[ $_GET['error'] ]}</h2>"; 
       } 
      ?> 
     </form> 
     </body> 
    </html> 
+0

とにかく 'filter_input'を使用している場合は' empty'テストは必要ありません。 – deceze

+0

公正なポイント - 私が同意した戻り値のドキュメントを見ている – RamRaider

関連する問題