Hallo zusammen,
ich möchte prüfen, ob ein Username bereits in meiner Datenbank vorhanden ist. Dazu habe ich Code im Internet gefunden, doch ich verstehe ich leider nicht :sad:. Ich habe schon auf php.net nach Erklärungen der jeweiligen Befehle gesucht, doch die helfen mir leider auch nicht weiter. Daher bitte ich euch, mir zu helfen.
[PHP]
<?php
$sql = "SELECT ID FROM User WHERE Benutzername = '$user_tmp' LIMIT 1";
$stmt = $db->prepare($sql);
if (!$stmt)
return $db->error;
$stmt->bind_param('s', $Username);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows)
return 'Der Username wird bereits verwendet.';
?>
[/PHP]
Folgende Fragen habe ich:
1.) Was genau wird „stmt“ zugewiesen? Eine ganze Tabelle, denn nur so macht der Befehl „num_rows“ Sinn. Warum wird prepare und nicht query verwendet?
2.) Was genau macht der Befehlt bind_param? Ich verstehe einfach keine Erklärung. Was soll dieses „s“
3.) Wie arbeiten execute und store_result zusammen? Was machen die Befehle?
Bitte helft mir, denn auf keiner Seite finde ich eine hilfreiche Lösung
Das musst du alles in der Klasse nachlesen, die du aufrufst.
bind_param() ist keine PHP-Funktion. Ebenso verhällt es sich mit den anderen funktionen.
Annahme:
Deine Klasse wurde gemacht, um die eigentlichen PHP-Aufrufe zu vereinfachen oder zu erweitern. PHP: db2_bind_param - Manual z.B könnte der PHP-Aufruf zu deinem bind_param sein.
Ich wuerde eher tippen, dass ich es sich Mysqli handelt.
In jedemfall wird hier mittels prepare() ein Prepared Statement erzeugt. Allerdings gibt es in der Query keinen Platzhalter (ein Fragezeichen). $user_tmp wird gleich in die Query geschrieben. Dies sollte eigentlich nicht so sein.
In der Query sollte ein Platzhalter stehen, dieser wird dann mittels bind_param() durch den Benutzernamen ersetzt. Das s bestimmt, dass der Platzhalter fuer einen String gedacht ist.
Es sollte also eher so aussehen:[PHP]$sql = „SELECT ID FROM User WHERE Benutzername = ? LIMIT 1“;
$stmt->bind_param(‚s‘, $user_tmp);[/PHP]
Hallo,
es handelt sich um eine mysqli Klasse. Sorry, dass ich das nicht erwähnt habe. Prepare schickt also nicht wie query eine SQL Abfrage ab, sondern bereitet sie (wie der Name ja auch sagt) vor. Mit bind_param werden dann Platzhalter ersetzt. Was bringt das denn? Ich kann doch gleich die Variable in die Query schreiben!?
Trotz Google verstehe ich nicht die Funktionsweise von store_result. Könnt ihr mir da noch helfen?
Du musst dich bei prepare() und bind_param() nicht um das Escaping kümmern.
store_result() holt die komplette Rückgabe des Query-Caches von MySQL und speichert sie im Statement-Objekt. Mit anderen Worten, dass komplette Ergebnis ist für die Weiterverarbeitung gespeichert.
Es wird also eine ganze Tabelle zurückgegeben und in einer Variable gespeichert? Wie kann ich mir das denn vorstellen?
Wenn aber bereits mit perpare() die Query durchgeführt werden, wie kann dann die SQL Abfrage durch bind_param noch verändert werden, da doch nun schon das Ergebnis da ist. Ich dachte, dass mittels bind_param die SQL Abfrage so abgeändert wird, dass der Platzhalter „s“ durch den Usernamen erstezt wird. Da stimmt doch was nicht…
edit: Ich habe gerade nochmal einiges durchgelesn. So wie das verstanden schaut prepare() einfach, ob die SQL Anfrage möglich ist und gibt „einen vorbereiteten Status“ an meine Variable zurück: mysqli_prepare() returns a statement object or FALSE if an error occurred.
Dieses statement object wird dann durch bind_param bearbeitet (Ersetzen der Platzhalter). Durch execute wird dann erst die eigentliche Query durchgeführt. Liege ich da richtig?
Ich dachte, dass „s“ der Platzhalter sei, doch „s“ gibt wie Du gesagt hast an, dass es sich um einen String handelt. Doch was ist dann der Platzhalter. Im Tutorial steht da einfach ein Fragezeichen. Sind Fragezeichen in MySQL immer Platzhalter oder ersetzt bind_param einfach alles, was nicht in die SQL Abfrage passt?