PHP Fehler?
Moinsen Leude,
Ich bin gerade etwas am verzweifeln. Ich arbeite noch nicht so lange mit php und stoße die ganze zeit immer wieder auf den gleichen fehler:
Warning: Undefined array key "password" in C:\xampp\htdocs\website\metropolisx\index.php on line 21
Hier die PHP-Datei um die es geht:
<?php
session_start();
require_once "includes/config.php"; // Datenbankverbindung
$error = "";
// Nur fortfahren, wenn das Formular per POST abgesendet wurde
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Überprüfen, ob die Felder 'username' und 'password' in $_POST gesetzt sind
$username = isset($_POST['username']) ? $_POST['username'] : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';
// Überprüfen, ob beide Felder nicht leer sind
if (!empty($username) && !empty($password)) {
// Datenbankabfrage, um den Benutzer zu finden
$stmt = $pdo->prepare("SELECT * FROM accounts WHERE USERNAME = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
// Wenn der Benutzer existiert und das Passwort korrekt ist
if ($user && password_verify($password, $user['password'])) {
$_SESSION['user'] = $user['username'];
// Weiterleitung zum Dashboard
header("Location: pages/dashboard.php");
exit();
} else {
$error = "Falsche Anmeldedaten!";
}
} else {
// Fehlermeldung, wenn eines der Felder leer ist
$error = "Bitte Benutzername und Passwort eingeben!";
}
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login | MetropolisX</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="login-container">
<h2>MetropolisX - Login</h2>
<?php if ($error): ?>
<p class="error"><?php echo htmlspecialchars($error); ?></p>
<?php endif; ?>
<form method="post">
<input type="text" name="username" placeholder="Benutzername" required>
<input type="password" name="password" placeholder="Passwort" required>
<button type="submit">Anmelden</button>
</form>
</div>
</body>
</html>
Wenn einer von euch weiß warum ich diesen fehler die ganze zeit kriege, gebt gerne bescheid. Danke schonmal im vorraus :D
3 Antworten
Hi Increase721,
auch wenn schon eine Lösung schon gefunden wurde. Möchte gerne auch eine Antwort geben. Wie die Fehlermeldung wieder gibt, gibt es den Eintrag password nicht in der Datenbankabfrage. Hier solltest du nachprüfen wie das Feld in deiner Datenbanktabelle tatsächlich heißt oder vorhanden ist.
Was kann man verbessern:
Zwar gehört das nicht zu deiner Frage, aber ich möchte gerne ein paar Tipps geben um ein besseres Login-Formular zu erstellen. Meine Empfehlung ist es die Aufgaben zu teilen und diese in deinem Beispiel zwei PHP-Dateien zu verwenden. Die Eine Datei kann dann das Loginformular enthalten und vorab überprüfen ob man schon angemeldet ist. Und die zweite PHP-Datei die dazu dient die Daten zu prüfen, gegenfalls Anmeldeprozess durchführen und einen Request an den User zu senden.
Damit die Seite nicht neu geladen werden muss, solltest du z.B. Ajax verwenden. Damit kannst du mithilfe von JavaScript die Zugangsdaten an deine zweite PHP senden, ohne das die Seite neu geladen werden muss. Dort werden die Daten geprüft und senden dann wiederum ein Ergebnis an dein JavaScript. Diese kann dann unterschiedlich reagieren und Fehler ausgeben oder die Seite weiterleiten.
Natürlich kann man das im fortgeschritten Modus dann alles mit Router und Controller und Modulen machen. Abe das was da oben steht, wäre ein sehr guter Anfang.
Ich bin nicht sicher (weil ich einen anderen Programmierstil verfolge).
Zuerst hätte ich die Variable Passwort definiert und einen Wert zugewiesen.
ZB. so:
var $password = "";
In einem zweiten Schritt hätte ich die Übergabe geprüft und den Inhalt der Variablen zugewiesen, mit der ich arbeite.
if (isset($_POST['password']))
{
$password = $_POST['password'];
}
Ist ja auch logisch, $_POST() ist ja auch ein Array und 'password' ist ein Schlüssel auf das er versucht zuzugreifen ob wohl er noch garnicht generiert wurde.
Der Schlüssel 'password' existiert erst nach dem die Formulardaten per POST an das PHP-Script gesendet wurden.
Deshalb sollte man immer erst prüfen ob ein Schlüssel existiert bevor man ihn verwendet.
Das Script weist auch noch eine Sicherheitslücke auf : Die Kennwörter werden im Klartext verarbeitet und nicht als HASH - sowas gehört sich nicht.
1. Es wird überprüft ob der Schlüssel vorhanden ist.
2. Das Sicherheitsproblem kannst du gerne den Ersteller mitteilen
Vermutlich gibt es die Spalte "password" nicht in deiner "accounts" Table.
War alles klein geschrieben aber in der datenbank all Groß... Danke für deine Hilfe. Nächste mal achte ich besser drauf :O
Der fehler spricht von einem array key und nicht einer Variable. Im Komentar der Antwort von @Sifadias hat der Ersteller, außerdem schon geschrieben, dass das Problem gelösst ist.