hawkmaster: Prepared Statement innerhalb Funktion ?

Hallo zusammen,

mein erster Versuch mit Prepared Statements macht mir gleich Schwierigkeiten.:-)

$dboSelectUser = $DBO->prepare("SELECT count(*) as usercount, usr, UserID FROM testuser WHERE usr= :usr AND pwd=AES_ENCRYPT(:pwd,'passwort')  GROUP BY usr, UserID" );
$dboSelectUser->bindParam('usr', $USER);
$dboSelectUser->execute();
$dboSelectUser->bindParam('pwd', $PWD);
$dboSelectUser->execute();

So würde es gehen:
$dboSelectUser = $DBO->prepare("SELECT count(*) as usercount, usr, UserID FROM testuser WHERE usr= :usr AND pwd=AES_ENCRYPT('".$PWD."','passwort')  GROUP BY usr, UserID" ) ;

Vermutlich habe ich die zweite Variable :pwd falsch gesetzt?
Oder geht das garnicht innerhalb einer Funktion wie "AES_ENCRYPT(:pwd,@pswd_key)" ?

Bin für jeden Tipp dankbar.

vielen Dank und viele Grüße
hawk

  1. echo $begrüßung;

    mein erster Versuch mit Prepared Statements macht mir gleich Schwierigkeiten.:-)

    Bitte keine Fehlermeldungen unterschlagen!

    $dboSelectUser = $DBO->prepare("SELECT count(*) as usercount, usr, UserID FROM testuser WHERE usr= :usr AND pwd=AES_ENCRYPT(:pwd,'passwort')  GROUP BY usr, UserID" );
    $dboSelectUser->bindParam('usr', $USER);
    $dboSelectUser->execute();

    Zuerst alle Parameter binden, dann das Statement exekutieren. Das execute() an der Stelle ist zu früh.

    $dboSelectUser->bindParam('pwd', $PWD);
    $dboSelectUser->execute();

    Jetzt kann es kommen.

    echo "$verabschiedung $name";

    1. Hallo dedlfix,
      vielen Dank für deine Hilfe.
      Jetzt funktioniert es.

      Bitte keine Fehlermeldungen unterschlagen!

      Das wollte ich, habe ich aber vergessen, sorry.

      Eine kleine Frage habe ich noch:

      Angenommen diese Select Abfrage kommt öfters im Code auf verschiedene Seiten vor. Könnte ich dann diese so als Prepared Statement z.b. in einer separaten Include Datei einfügen?
      $dboSelectUser = $DBO->prepare("SELECT count(*) as usercount, usr, UserID FROM testuser WHERE usr= :usr AND pwd=AES_ENCRYPT(:pwd,'passwort')  GROUP BY usr, UserID" );

      Und dann später auf den entsprechenden Seiten nur noch den Bind und das Execute aufrufen?

      Eine zusätzliche Maskierung oder Absicherung der übergebenen Variablen ist nicht mehr notwendig?

      vielen Dank und viele Grüße
      hawk

      1. echo $begrüßung;

        Angenommen diese Select Abfrage kommt öfters im Code auf verschiedene Seiten vor. Könnte ich dann diese so als Prepared Statement z.b. in einer separaten Include Datei einfügen?
        $dboSelectUser = $DBO->prepare("SELECT count(*) as usercount, usr, UserID FROM testuser WHERE usr= :usr AND pwd=AES_ENCRYPT(:pwd,'passwort')  GROUP BY usr, UserID" );
        Und dann später auf den entsprechenden Seiten nur noch den Bind und das Execute aufrufen?

        Jeder Request ist eigenständig zu betrachten. Include-Dateien machen ja nichts weiter, als den dortigen Code an der aufrufenden Stelle einzufügen. Du hast also bei jedem Request eine separate Datenbankverbindung. Und für diese muss das Statement jedes Mal neu präpariert werden. Die eigentlichen Vorteile von PS kommen im PHP-Umfeld kaum zum Tragen.[*] Meines Erachtens lohnt sich der Einsatz trotzdem. Der Text des Statements wird übersichtlicher als beim Zusammenstückeln von Teilstrings, und das Quotieren und Maskieren kann (und muss) man sich sparen.

        Eine zusätzliche Maskierung oder Absicherung der übergebenen Variablen ist nicht mehr notwendig?

        Das hab ich doch schon in einer früheren Antwort erklärt. Bei einem PS gehen Befehl und Daten[**] getrennte Wege. Die Daten müssen deshalb nicht für eine Übertragung in einem Befehlskontext als Daten gekennzeichnet werden.

        [*] Persistente Vebindungen mal unbetrachtet gelassen. Die erfordern einen wesentlich höheren Verwaltungsaufwand seitens der Anwendung.
        [**] jedenfalls die Daten, die du bindest. Für andere im Statement befindliche Daten gelten die üblichen Quotier- und Maskierregeln.

        echo "$verabschiedung $name";