Prepared Statements

  • Ich dachte mir, da ich sowieso gerade den Testblock hier hab, kann ich ihn auch gleich hier posten.
    Hab mir Gedanken gemacht, wie ich P.S. für mich am sinnvollsten nutze. Und falls jemand Ideen hat - her damit =)


    Ich glaube ich fange alle Fehler ab.
    Nur wenn man mehr vordefiniert als man "reinschickt" gibts komischerweise keine e-message, sondern nur den e-code.
    (bsp "...WHERE nickname = :nickname and test = :test" wobei "test" später nicht reingeschickt wird. Ergibt dann nur e-code: 'HY093')

  • Falls mal jemand Prepared S. mit LIMIT verwenden möchte:

    PHP
    $stmt = $dbh->prepare("SELECT * FROM tablename WHERE name = :name LIMIT :start, :rows"); 
    $stmt->execute( array('name' => 'cottton', 'start' => 0, 'rows' => 50) );


    Wird nicht funktionieren da die Werte als String übergeben(?) werden =)
    Also endet die Query als:

    SQL
    SELECT * FROM tablename WHERE name = ´cottton´ LIMIT ´0´,´50´


    Lösung: PDO::PARAM_INT

    PHP
    $stmt->bindParam(':param', $var, PDO::PARAM_INT);


    Sieht dann so aus:


    Wer man das Ganze dynamisch möchte:


    PS: es müssen dann wohl alle parameter auf die gleiche Art und Weise (bindParam) übergeben werden.
    Hab einen "Mix" mit bindParam und execute( array('name' => 'username') ) getestet und rannte in Fehlermeldungen.

  • Wie der Zufall so will habe ich mir heute auch Prepared Statemants angeschaut, und das auch ohne Beeinflussung durch diesen Thread und anschließend bin ich bei diesem Thread gelandet. :'D
    Ich habe das ganze noch nicht so richtig verstanden (Sinn, Nutzen, ...), aber das könnte was ganz sinnvolles sein. :'D

  • Zum Sinn: Das Beste und sicher jedem wichtigste ist, dass sql injection nicht mehr möglich ist, WENN man es so nutzt, wie es vorgesehen ist.


    Bsp wie man es "versaut":

    PHP
    $stmt = $dbh->prepare("SELECT * FROM tablename WHERE name = ".$_GET['name']." LIMIT $_POST['user_input'], :rows");


    Somit würde man die query mit user daten füllen.
    Also immer :name ect nutzen. Dann ist es "egal", was man beim execute(array('nickname' => $_GET['user_input'])) reinschickt.


    angenommen: $_GET['name'] = " ';cottton "
    dann wird hier ein bissl was schief laufen:

    PHP
    $stmt = $dbh->prepare("SELECT * FROM players WHERE nickname = '".$_GET['name']."' LIMIT 0,1"); 
    $stmt->execute();


    query: SELECT * FROM players WHERE nickname = ' ';cottton ' LIMIT 0,1


    richtig wäre:

    PHP
    $stmt = $dbh->prepare("SELECT * FROM players WHERE nickname = :nickname LIMIT 0,1"); 
    $stmt->execute(
     array(
     'nickname' => $_GET['name']
    )
    );


    query: ja, wie stellt man das dar?
    Ich hab noch kein Bsp gesehen, wie die query dann aussieht.
    Aber die query ist jedenfalls schon "fertig" - prepared.
    Kann also "nicht mehr geändert werden". Die Daten werden als Parameter übergeben.
    (Weiß nicht wie ich es sonst ausdrücken soll ;D )

  • Info: Falls jemand auch schon mal eine Query mit "WHERE IN (a,b,c,d)" via Prepared Statements nutzen wollte
    und in google keinerlei Sinvolle Lösung gefunden hat -> hier ist eine funktionierende (mMn sinnvolle) Lösung:


    Da kann user reinschicken was er will. Es wird sauber und ordentlich via Prepared Statements an die db übergeben =)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!