PHP-Login Fehler?
Guten Tag,
Ich habe einen Fehler beim einloggen in mein Loginsystem mit PHP. Ich kann user registrieren, also der username und der password_hash werden richtig in der DB gespeichert. Wenn ich mich aber mit einem bestehenden user der in der Datenbank existiert anmelden möchte, klappt das nicht und es kommt diese Fehlermeldung:
Fehlermeldung Beginn:
Warning: Trying to access array offset on value of type bool in C:\xampp\htdocs\login.php on line 16
Anmeldung fehlgeschlagen, versuche es erneut.
Fehlermeldung Ende.
Mein PHP register Script:
<?php
// Datenbankverbindung
include ('connection.php');
// Benutzereingabe aus Formular
$username = $_POST['username'];
$password = $_POST['password'];
// Das Passwort hashen
$hashedPassword = password_hash($password, PASSWORD_BCRYPT);
// SQL-Abfrage, um den Benutzer in der Datenbank zu speichern
$sql = "INSERT INTO users (username, password_hash) VALUES (?, ?)";
$stmt = $conn->prepare($sql);
$stmt->execute([$username, $hashedPassword]);
// Erfolgsmeldung oder Weiterleitung zur Anmeldeseite
header('Location: login.html');
?>
Mein PHP login Script:
<?php
// Datenbankverbindung
include ('connection.php');
// Benutzereingabe aus Formular
$username = $_POST['username'];
$password = $_POST['password'];
// SQL-Abfrage, um das gespeicherte Passwort abzurufen
$sql = "SELECT password_hash FROM users WHERE username = ?";
$stmt = $conn->prepare($sql);
$stmt->execute([$username]);
$row = $stmt->fetch();
// Überprüfen, ob das eingegebene Passwort korrekt ist
if ($row && password_verify($password, $row['password_hash'])) {
// Anmeldung erfolgreich, führe die notwendigen Aktionen aus
// z.B., setze eine Sitzung und leite den Benutzer weiter
session_start();
header('Location: index.html');
} else {
echo "Anmeldung fehlgeschlagen, versuche es erneut.";
}
?>
Wäre cool wenn mir jemand bei diesem Problem weiterhelfen könnte, bin noch nicht so fit in dieser Thematik.
1 Antwort
Schau dir mal die Doku und Beispiele zu fetch an:
https://www.php.net/manual/de/mysqli-stmt.fetch.php
fetch() liefert nur ein Bool zurück und du musst deine Werte mit bind_result an Variablen binden.
Lies dir die Doku und die Beispiele doch mal in Ruhe durch! Du hast zwei Fehler:
Erstens muss nach den bind_result auch noch ein fetch kommen und zweitens bekommst du kein Array zurück, sondern einen String.
$stmt->bind_result($passwordHash);
if ($stmt->fetch() && password_verify($password, $passwordHash)) {
header('Location: index.html');
} else {
echo "Anmeldung fehlgeschlagen, versuche es erneut.";
}
PS: Bitte nutze für Code auch die Quelltext-Formatierung von GF.
Habe es jetzt so gemacht:
<?php
// Datenbankverbindung
include ('connection.php');
// Benutzereingabe aus Formular
$username = $_POST['username'];
$password = $_POST['password'];
// SQL-Abfrage, um das gespeicherte Passwort abzurufen
$sql = "SELECT password_hash FROM users WHERE username = ?";
$stmt = $conn->prepare($sql);
$stmt->execute([$username]);
//$row = $stmt->bind_result();
//$row = $stmt->fetch();
$stmt->bind_result($row);
// Überprüfen, ob das eingegebene Passwort korrekt ist
if ($row && password_verify($password, $row['password_hash'])) {
// Anmeldung erfolgreich, führe die notwendigen Aktionen aus
// z.B., setze eine Sitzung und leite den Benutzer weiter
header('Location: index.html');
} else {
echo "Anmeldung fehlgeschlagen, versuche es erneut.";
}
?>
Das Problem ist nur wenn ich das richtige Passwort eingebe um mich anzumelden, werde ich nicht weitergeleitet (if) sondern es kommt der else-Fall:
Die Anmeldung ist fehlgeschlagen, versuche es erneut!
Woran liegt das?