PHP / MYSQL Datensätze lassen sich nicht auswählen?
Hallo liebe Community,
ich arbeite derzeit an einer Datenbank. Das Problem ist folgendes: Im Quellcode unten will ich zur SESSION den Wert der Spalte "repititions" hinzufügen. Ich möchte, dass die SESSION mit dem Wert des bereits selektierten users befüllt wird. Kann mir bitte jemand helfen? Das mit dem Username funktioniert bereits nur eben nicht, dass die Repititions des Users abgefragt/angezeigt werden.
if (count($errors) == 0) {
$password = md5($password);
$query = "SELECT * FROM users WHERE email='$username' AND password='$password'";
$results = mysqli_query($db, $query);
if (mysqli_num_rows($results) == 1) {
$_SESSION['username'] = $username;
$_SESSION['repititions'] = $_GET[$results['repititions']]; //PROBLEM
$_SESSION['success'] = "You are now logged in";
header('location: index.php');
}
else {
array_push($errors, "Wrong username/password combination");
}
}
}
2 Antworten
In deinem Code sehe ich verschiedene Punkte, die besser verändert werden sollten.
1) Wurde schon von LisamagPferde04 angesprochen. Passwörter mit md5 zu hashen ist keine sichere Lösung, denn er ist sehr schnell berechenbar. Nimm password_hash. Das Ergebnis kommt in deine Datenbank.
$hash = password_hash($password, PASSWORD_BCRYPT);
2) Es ist bei deinem Snippet nicht ersichtlich, woher $username und $password kommen. Es ist zu hoffen, dass du sie validierst.
Ein Mittel, um SQL Injections zu verhindern, wäre die Nutzung eines Prepared Statement. Da du Informationen aus nur einer Spalte (repititions) der Tabelle verwenden möchtest, würde ich im Query angeben, dass auch nur diese Spalte selektiert werden soll. Das Wort ist so übrigens falsch geschrieben, es sollte repetitions heißen. In meinen Folgesnippets werde ich stets die korrekte Schreibweise nutzen.
Eine E-Mail-Adresse ist des Weiteren eigentlich eindeutig. Sollte es tatsächlich mehrere Einträge mit gleicher E-Mail-Adresse geben, würde ich all diese herauslesen und dann in einer Schleife und password_verify prüfen, welcher Datensatz der richtige für deine Auswahl ist.
$statement = mysqli_prepare($db, 'SELECT repetitions FROM users WHERE email=?');
mysqli_stmt_bind_param($statement, "s", $username);
if (!mysqli_stmt_execute($statement)) {
die;
}
$result = mysqli_stmt_get_result($statement);
if (mysqli_num_rows($result) === 1) {
// ...
}
3) Nur um sicherzugehen: Schau, ob du bereits eine Session in diesem Skript gestartet hast. Dies muss geschehen, bevor du irgendetwas in den Response Body schreibst (also vor jeglicher Ausgabe von HTML / Ausgaben via echo, print, u.ä.).
session_start();
4) Die Variable $results (Beachte: In meinen Snippets benenne ich die Variable im Singular, immerhin stellt sie nur ein Ergebnis auf eine DB-Anfrage dar) verweist auf ein mysqli_result-Objekt. Um aus diesen Einträge herauszuholen, brauchst du eine der fetch-Funktionen.
Mit dieser kannst du dir den ersten Datensatz aus dem Objekt herausholen:
$row = mysqli_fetch_assoc($result);
Wenn du mehrere Datensätze erwartest, kannst du eine Schleife einsetzen:
while ($row = mysqli_fetch_assoc($result)) {
// ...
}
Die läuft so lange, bis kein weiterer Datensatz mehr aus dem Result Set herausgezogen werden kann.
Ein Datensatz entspricht immer einem Array, welches alle selektierten Spalten beinhaltet.
$repetitions = $row['repetitions'];
Und das kannst du nun in $_GET einsetzen.
$input_repetitions = $_GET[$repetitions];
// validate!
$_SESSION['repetitions'] = $input_repetitions;
Einmal wieder der Hinweis: Vergiss nicht, den Wert zu validieren, bevor du ihn weiterverwendest. Es ist immerhin eine Eingabe von außen, der du niemals trauen solltest.
5) Wieder, um nur sicherzugehen: Prüfe, ob nach dem else-Zweig noch irgendein Code kommt. Wenn ja (oder mach es prinzipiell), schließe die Skriptausführung nach dem header-Aufruf explizit ab.
header('Location: index.php');
exit;
So kannst du darauf vertrauen, dass trotz Weiterleitung nicht noch weitere Aktionen im Hintergrund durchgeführt werden, ohne dass es von dir beabsichtigt wäre.
Heißt dein Feld wirklich so? Oder nicht vielleicht doch repetitions?
MD5 wird übrigens nicht mehr als sicher angesehen und sollte für Passwörter nicht mehr verwendet werden. In PHP gibt es leicht zu benutzende Alternativen wie die password_hash und verify Methoden.
Dann lass dir am besten mal das ganze result und GET Objekt anzeigen und guck was enthalten sind. Hast du errors aktiviert?
Hallo, ja der Eintrag in der Datenbank heißt so. Egal was ich probiere, es funktioniert leider nicht.