Leo Löwe: Wie initiiert PHP mysqli_stmt_prepare ?

Hallo... versuche nach längerer Pause meine PHP Kentnisse aufzufrischen. Folge gerade einem Youtube Tutorial von Dani Krossing, zu welchem ich eine kleine Verständnisfrage hätte (Video ist denke ich zum Verständnis nicht wirklich notwendig 😉 ):

Folgender [eigentlich trivialer] Code macht eine Datenbankabfrage bezüglich eines/r Benutzers/Benutzerin. Mein Verständnisproblem habe ich im Beispiel mit mysqli_stmt_prepare:

Wird mysqli_stmt_prepare in der if Schleife auch gleich initiiert, während diese überprüft, ob eben eine $username und $email Übereinstimmung in der Datenbank gefunden wurde?

ORIGINALCODE:

// (...)
function uidExists($conn, $username, $email) {
	$sql = "SELECT * FROM users WHERE usersUid = ? OR usersEmail = ?;";
	$stmt = mysqli_stmt_init($conn);

	if (!mysqli_stmt_prepare($stmt, $sql)) {
		header("location: ../signup.php?error=stmtfailed");
		exit();
	}
	
	mysqli_stmt_bind_param($stmt, "ss", $username, $email);
	mysqli_stmt_execute($stmt);
	
	$resultData = mysqli_stmt_get_result($stmt);
	
	if (mysqli_fetch_assoc($resultData)) {
		// CODE
	} else {
		// CODE
	}
	// CODE
}
// (...)

Müsste das nicht lauten:

// fehlt folgende Zeile zur Initiierung nicht?
	mysqli_stmt_prepare($stmt, $sql);

	if (!mysqli_stmt_prepare($stmt, $sql)) {
		header("location: ../signup.php?error=stmtfailed");
		exit();
	}

Es dankt Leo Löwe

  1. // Nachtrag

    ...verzeihung, die if Schleife überprüft natürlich noch nicht, ob eine Übereinstimmung gefunden wurde, sondern bereitet die Abfrage nur vor, mein Fehler. (Ist aber eigentlich unerheblich)

  2. Hallo Leo Löwe,

    Es handelt sich um eine Funktion. Diese hat einen Rückgabewert. Im konkreten Fall einen boolschen Wert, je nach dem, ob das Vorbereiten geklappt hat oder nicht.

    Funktionen werden sofort ausgeführt.

    mysqli_stmt_prepare(...) wird also sofort zu true oder false, deshalb kannst du es auch sofort auswerten.

    if-Schleifen gibt es übrigens nicht.

    Bis demnächst
    Matthias

    --
    Du kannst das Projekt SELFHTML unterstützen,
    indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
    1. Dank dir für die Auskunft.

      ...läuft also tatsächlich wie in JavaScript, dachte in PHP wäre das anders.

      if-Schleifen gibt es übrigens nicht.

      Hoppla 😅

      1. Hallo,

        ...läuft also tatsächlich wie in JavaScript, dachte in PHP wäre das anders.

        in allen mir bekannten Programmiersprachen läuft das so: In dem Moment, da eine Funktion aufgerufen wird, wirkt sie auch. Einschließlich eventuell unerwünschter Nebenwirkungen.

        Live long and pros healthy,
         Martin

        --
        Keyboard error or no keyboard present. Press F1 to continue.
  3. Hallo Leo,

    Wird mysqli_stmt_prepare in der if Schleife Anweisung auch gleich initiiert, während diese überprüft, ob eben eine $username und $email Übereinstimmung in der Datenbank gefunden wurde?

    Eine Initialisierung erfolgt vorher, in mysqli_stmt_init(). Diese Funktion setzt mögliche Fehlerzustände zurück und erzeugt ein neues, leeres Statement-Objekt.

    Die prepare-Funktion bekommt das Objekt und ein SQL Statement. Sie ruft den SQL Server auf und sagt ihm: „Ey guck mal, ich hab da ein Schtäitment, fängst Du damit was an?“ Der Server schaut drauf, prüft, ob das Statement auch SQL ist oder irgendein Phantasiedurcheinander, und meldet dem Aufrufer ein wohlwollendes TRUE oder ein strafendes FALSE zurück. Derweil der Aufrufer damit weitermacht, überlegt er sich auch, wie er wohl dieses SQL am besten in Leseoperationen auf seinen Tabellen umsetzt. Mehr aber auch nicht.

    Wenn Du das Ergebnis einer Funktion prüfen willst, dann ist es wenig sinnvoll, sie in der Prüfung nochmal hinzuschreiben. Damit rufst Du sie zweimal auf. Das ist übrigens in jeder Programmiersprache, die ich kenne so. Wenn Du den Aufruf der Funktion nicht in der if-Anweisung drin stehen haben willst, musst Du ihren Rückgabewert in einer Variablen speichern.

    Nachdem prepare zurück ist und TRUE gemeldet hat, macht der Aufrufer den bind(), um bekannt zu geben, die Inhalte welcher Variablen für die Fragezeichen einzusetzen sind. Damit das auch nicht zu einfach wird, muss man Fragezeichen abzählen und dem richtigen ? das richtige $ zuordnen. Und auch noch erklären, ob man das als Integer, Double, String oder Blob tun will. Oder man nimmt PDO, da kann man statt ??? ordentliche Namen verwenden. Der Bind erfolgt aber rein in PHP, dafür geht's nicht zum Server.

    Erst dann erfolgt der execute, in dem das gebundene Datenpaket an den Server geschickt wird. „Hey Server, ich hab Dir doch eben ein Schtäitment geschickt. Hier sind Daten, stopf sie rein und führ's aus!“. Damit rennt der Server nun los, liest Datentabellen und erzeugt Ergebnisse.

    Rolf

    --
    sumpsi - posui - obstruxi