Probleme, Fragen zu $insert->execute und Datenbankabfrage
Peter
- datenbank
- php
Hallo liebe Fachleute und Profis auf dem Gebiet von PHP und Datenbank, ich habe über die Seite php-einfach.de ein Loginscript Script. Das läuft, aber ich würde es gerne verstehen.
Und leider habe ich eine Zeile die ich nicht verstehe.
1. $error_msg = "";
2. if(isset($_POST['email']) && isset($_POST['passwort'])) {
3. $email = $_POST['email'];
4. $passwort = $_POST['passwort'];
5.
6. $statement = $pdo->prepare("SELECT * FROM users WHERE email = :email");
7. $result = $statement->execute(array('email' => $email));
8. $user = $statement->fetch();
9.
10.
11. //Überprüfung des Passworts
12. if ($user !== false && password_verify($passwort, $user['passwort'])) {
13. $_SESSION['userid'] = $user['id'];
14.
15. //Möchte der Nutzer angemeldet beleiben?
16. if(isset($_POST['angemeldet_bleiben'])) {
17. $identifier = random_string();
18. $securitytoken = random_string();
19.
20. $insert = $pdo->prepare("INSERT INTO securitytokens (user_id, identifier, securitytoken) VALUES (:user_id, :identifier, :securitytoken)");
21.
22. $insert->execute(array('user_id' => $user['id'], 'identifier' => $identifier, 'securitytoken' => sha1($securitytoken)));
23. setcookie("identifier",$identifier,time()+(3600*24*365)); //Valid for 1 year
24. setcookie("securitytoken",$securitytoken,time()+(3600*24*365)); //Valid for 1 year
25. }
26.
27. header("location: internal.php");
28. exit;
29. } else {
30. $error_msg = "E-Mail oder Passwort war ungültig<br><br>";
31. }
32.
33. }
In der Zeile 6-8 wird die Mail überprüft und der Inhalt der Zeile aus der Datenbank an $user übergeben
Nach der Überprüfung des Passwortes Zeile 12 wird bei Zeile 20 die Daten
user_id, :identifier, :securitytoken
in die Datenbank geschrieben.
Jetzt kommt die Frage, was passiert in Zeile 22
$insert->execute(array('user_id' => $user['id'], 'identifier' => $identifier, 'securitytoken' => sha1($securitytoken)));
das verstehe ich nicht.
Auch verstehe ich nicht warum die setcookie erst in Zeile 23,24 geschrieben werden und nicht vor dem INSERT in Zeile 20.
Für jeden Hinweis bin ich mehr als Dankbar
Peter
Hey,
Jetzt kommt die Frage, was passiert in Zeile 22
$insert->execute(array('user_id' => $user['id'], 'identifier' => $identifier, 'securitytoken' => sha1($securitytoken)));
Da wird das Statement aus Zeile 20 Ausgeführt.
Auch verstehe ich nicht warum die setcookie erst in Zeile 23,24 geschrieben werden und nicht vor dem INSERT in Zeile 20.
In welcher Reihenfolge das passiert, dürfte keine Rolle spielen.
Gruß
Jo
Tach!
- $email = $_POST['email'];
- $passwort = $_POST['passwort'];
Das Umkopieren ist überflüssig. Nimm $_POST['something'] direkt und ohne Umwege.
Nach der Überprüfung des Passwortes Zeile 12 wird bei Zeile 20 die Daten
user_id, :identifier, :securitytoken
in die Datenbank geschrieben.
Nein. Es wird nur das Statement vorbereitet. Die Doppelpunkt-Namen sind nur Namen für Platzhalter.
Jetzt kommt die Frage, was passiert in Zeile 22
Das vorbereitete Statement wird nun ausgeführt und für die Platzhalter werden die eigentlich zu verwendenden Daten übergeben. In Zeile 7 ist dasselbe Prinzip zu sehen.
Auch verstehe ich nicht warum die setcookie erst in Zeile 23,24 geschrieben werden und nicht vor dem INSERT in Zeile 20.
Es ist egal, wo es steht. Da es eine HTTP-Header-verändernde Funktion ist, muss sie nur vor jeglicher Ausgabe an den Client ausgeführt werden.
dedlfix.
Hallo dedlfix,
Auch verstehe ich nicht warum die setcookie erst in Zeile 23,24 geschrieben werden und nicht vor dem INSERT in Zeile 20.
Es ist egal, wo es steht.
Ich denke, dass das nicht egal ist. Wenn der DB-Befehl aus irgendeinem Grund kaputt geht, sollten die Kekse in der Dose bleiben. Darum erst die DB-Befehle, und dann die Cookies in die Ausgabe. Und die Rückgabe von ...->execute sollte geprüft werden. Also so (die Insert-Parameter habe ich der Übersichtlichkeit halber mal herausgezogen):
$insertParameters = ARRAY(
'user_id' => $user['id'],
'identifier' => $identifier,
'securitytoken' => sha1($securitytoken) );
if ($insert->execute($insertParameters)) === true) {
setcookie("identifier",$identifier,time()+(3600*24*365)); //Valid for 1 year
setcookie("securitytoken",$securitytoken,time()+(3600*24*365)); //Valid for 1 year
}
Rolf