Hallo Thomas,
So weit theoretisch. Denn das Passwort wird auch dann überprüft, wenn bei activ eine 0 ist.
Die Selfpredigt vorweg:
Du müsstest auf jeden Fall noch Fehlerprüfungen nach prepare
und execute
ergänzen. Beide können FALSE liefern und dann ist die Weiterverarbeitung nicht möglich.
Du solltest nicht SELECT *
verwendest. Tut man in Programmen nicht, man listet explizit die Spalten auf, die man abfragen will. Das ist für die Lesbarkeit des Programms besser.
Zu deinem Problem: Auf der Seite zu PDOStatement::fetch steht dieser Userkommentar:
WARNING:
fetch() does NOT adhere to SQL-92 SQLSTATE standard when dealing with empty datasets.Instead of setting the errorcode class to 20 to indicate "no data found", it returns a class of 00 indicating success, and returns NULL to the caller.
Ein anderer Kommentator widerspricht:
A prior poster indicated that this function returns a NULL when there are no results. This is not true. This function returns an empty array.
Beides würde in deinem Fall heißen, dass deine Abfrage auf $rows !== FALSE
fehlschlägt, weil in $rows
der Wert NULL
oder ein leeres Array steht. Da ich immer while ($rows)
programmiert habe, kann ich tatsächlich nicht sagen, was $rows
enthält wenn man 4 Zeilen gelesen hat und keine fünfte mehr existiert.
Ersetze die Prüfung $rows !== FALSE
durch $rows
. Die Werte FALSE, NULL und ARRAY() sind allesamt falsy, d.h. du würdest nur bei einer gefüllten Row in die Passwort-Verfizierung laufen.
if ($row && password_verify($passwort, $user['passwort'])) {
// authorize user
}
Rolf
sumpsi - posui - obstruxi