2017-02-23 18 views
0

私はこれを理解しようとしています。それはかなり簡単ですが、私はミスを見つけることができません。間違いがforeachにあるように見えます。それを上回るすべてが機能するからです。私は入力を埋めるとログインボタンをクリックすると、スクリプトは動作しません。ログインは機能しません

if (isset($_POST['submit']) AND (!empty($_POST['username']) AND (!empty($_POST['password'])))) { 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $pass = hash('sha256',$password); 

    $select = $db->prepare("SELECT * FROM users WHERE username= :username AND password= :password"); 
    $select->bindParam(':username', $username); 
    $select->bindParam(':password', $pass); 
    $select->execute(); 

    foreach ($select as $data) { 
     if ($data['username'] == $username AND $data['password'] == $pass) { 
      $_SESSION['username'] = $username; 
      $_SESSION['id'] = $data['id']; 
      ?> 
      <div class="echos"> 
        <?php 
        echo "Login completed" . "<br>"; 
        echo "<a href='http://jezecek.nostools.cz/'>Homepage</a>"; 
     } 
     else { 
      echo "Wrong username or password!" . "<br>"; 
      echo "<a href='http://jezecek.nostools.cz/include/registration.php'>Try again</a>"; 
     }  
    } 
} 
else { 
    echo "Fill all fields!" . "<br>"; 
    echo "<a href='http://jezecek.nostools.cz/include/login.php'>Try again</a>"; 
} 
?> 
</div> 

私はこのようにはfetchAll()を使用する場合でも、あなたのクエリからデータを取得していないので、それはまだdoesntの仕事

$select = $db->prepare("SELECT * FROM users WHERE username= :username AND password= :password"); 
    $select->bindParam(':username', $username); 
    $select->bindParam(':password', $pass); 
    $select->execute(); 
    $result = $select->fetchAll(); 

    foreach ($result as $data) { 
     if ($data['username'] == $username AND $data['password'] == $pass) { 
      $_SESSION['username'] = $username; 
      $_SESSION['id'] = $data['id']; 
      ?> 
      <div class="echos"> 
        <?php 
        echo "Login completed" . "<br>"; 
        echo "<a href='http://jezecek.nostools.cz/'>Homepage</a>"; 
     } 
+2

まずは、 'paパスワードを安全に*ハッシュするためにssword_hash() 'を実行します。 sha256を一度呼び出すだけで安全です**。 –

+0

'execute()'の後にデータをフェッチするのを忘れてしまいます。 http://php.net/manual/en/pdostatement.fetch.phpを参照してください – Saty

+0

PDOで例外をスローするなど、データベース呼び出しにエラー処理を追加する必要があります。論理が間違っていることに注意してください。ユーザー名とパスワードの両方を選択すると、見つかる行は常にこれらの条件と一致します。この場合、行が見つからない場合は間違ったユーザー名/パスワードが発生します。 – jeroen

答えて

1

エラーがforeachの中で起こります。ループ

$select->execute(); 
$data=$select->fetchAll(); 
+0

これは正しくありません。Traversableを実装しているので、PDO文をループすることができます。 – jeroen

0

を介してデータやループをフェッチする場合がありますループも必要ですが、これを試してみてください:

$data = $select -> fetch(); 
if($data) 
{ 
    // do login 
} 
0

- :あなたは、結果セットのすべての行をフェッチし

$select->execute(); 
$data = $select->fetchAll(); 

foreach($data as $val) { 
    //..... 
0

に行く前に、あなたはいけないデータをフェッチしてください

$result = $select->fetchAll(); 
関連する問題