Rolf B: Da ist der Wurm drin: if ($row !== false && password_verify

Beitrag lesen

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