Peter: Probleme, Fragen zu $insert->execute und Datenbankabfrage

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

  1. 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

  2. Tach!

    1. $email = $_POST['email'];
    2. $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.

    1. 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

      --
      sumpsi - posui - clusi