2017-02-23 3 views
0

Ich habe versucht, dies herauszufinden. Es ist ziemlich einfach, aber ich kann den Fehler nicht finden. Es sieht so aus, als wäre der Fehler in foreach, weil alles darüber funktioniert. Wenn ich die Eingaben fülle und auf die Schaltfläche Anmelden klicke, funktioniert das Skript nicht.Login funktioniert nicht

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> 

Auch wenn ich fetchAll() verwenden, wie diese, es immer noch nicht funktioniert

$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

vor allem: Verwenden Sie 'pa ssword_hash() 'to * sicher * hash Ihre Passwörter. nur einmal sha256 anzurufen ist ** nicht ** sicher. –

+0

vergessen, Daten nach 'execute()' zu holen. Lesen Sie http://php.net/manual/en/pdostatement.fetch.php – Saty

+0

Sie müssen Ihren Datenbankaufrufen eine Fehlerbehandlung hinzufügen, indem Sie beispielsweise PDO-Ausnahmen auslösen lassen. Beachten Sie, dass Ihre Logik falsch ist: Wenn Sie sowohl den Benutzernamen als auch das Passwort auswählen, stimmen die einzigen Zeilen, die Sie finden, immer mit diesen Bedingungen überein. Falscher Benutzername/Passwort tritt auf, wenn in diesem Fall keine Zeilen gefunden werden. – jeroen

Antwort

1

Der Fehler in der foreach geschieht, weil Sie keine Daten aus der Abfrage abgerufen werden. Vielleicht möchten Sie durch

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

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

Das ist nicht korrekt, Sie können eine PDO-Anweisung durchlaufen, da sie Traversable implementiert. – jeroen

0

Daten und Schleife holen alle Zeilen in der Ergebnismenge Fetch: -

$result = $select->fetchAll(); 
0

bitte Daten holen, bevor eine Schleife gehen

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

You dont Schleife brauchen, versuchen Sie es einfach:

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