"How to" Wunsch =)

  • Wenn ich mir was wünschen darf für nächstes Jahr: Prepared Statements
    http://php.net/manual/de/pdo.prepared-statements.php


    versuche das Ganze gerade zu verstehen, bin da aber momentan noch am "Humpeln" =)



    EDIT: was ich soweit "habe":


  • Tut sich denn schon was, wenn du das ausführst (ich habs nicht probiert :) )


    Für "Prepared Statements" brauchst du PDO (PHP Data Objects). Und diese benötigen mindestens PHP 5.1 (oder PECL-Erweiterung für PHP 5.0)


    Was hast du denn damit vor? Oder einfach nur für das Verständnis?

  • Bei mir aufm Rechener ist: PHP Version 5.4.7
    Hatte xampp extra neuinstalliert usw ...
    Auf unserem webserver hab ichs noch nicht probiert.


    Die Prepared Statements funktionieren. Tut alles, was es soll.
    Allerdings nur soweit, wie man es auf php.net als "nicht Pro" verteht ;D
    Daher dachte ich ein HowTo wäre ganz nett =)


    zB ist mir noch nicht klar, was bei folgendem eigtl wirklich passiert:

    PHP
    $stmt->execute(array($ID))


    execute() führt SQL aus,
    aber wozu wird ein array in
    execute(array($ID))
    genutzt?
    Hatte getestet, ob man da mehrere IDs auf einmal abfragen kann. Ohne Erfolg.


    Zitat

    Was hast du denn damit vor? Oder einfach nur für das Verständnis?


    Ich möchte es in Zukunft nutzen, da SQL-injection dann ja nicht mehr möglich ist.
    Schneller soll es auch sein, wobei es bei sich standig ändernden Statements/Querys eher langsamer scheint.




    EDIT:
    Bin schon mal nen Schritt weiter gekommen.
    db connecten und im Fehlerfall error in var packen:

    PHP
    // connect to the db
        try{
            $dbh = new PDO('mysql:host='.MYSQL_HOST.';dbname='.MYSQL_DATENBANK, MYSQL_BENUTZER, MYSQL_KENNWORT);
        }catch(PDOException $e){
            $error = 'Error: '.$e->getMessage();
        }



    EDIT 2:
    gar nicht so einfach das alles auf anhieb zu verstehen. Aber hier ein bsp:


    Ich hab auch versucht den (zB) table zu binden (bindParam), habs aber nicht zum laufen gebracht:

    PHP
    try{
            $user=1;
            $stmt = $dbh->prepare("SELECT user, pw, dies, das FROM :table WHERE id = :value");
            $stmt->execute(array('value' => trim($user), 'table' => 'table_name'));
            if($row = $stmt->fetch(PDO::FETCH_ASSOC)){
                echo "<pre>";print_r($row);echo"</pre>";
            }
        }catch(PDOException $e){
            $error = 'Error: '.$e->getMessage();
        }


    Scheint nur für die values, also nach WHERE zu benutzen zu sein =/
    Jemand ne idee, wie man den table und evtl sogar alles in der query zu binden?



    btw - im falle eines error wie zB falscher table name ect bekomme ich auch keinen error zurück =/

  • Da Fu** !
    Sorry aber ich hab mir grad nen Ast gelacht ;D


    Prepared Statements - Persistente Verbindungen -> der Hammer!
    Anstatt bei jedem Seitenaufruf erneut die Verbindung zur db herzustellen, wird´s gecached.


    In Zahlen:
    ohne Persistente Verbindungen

    Zitat


    localhost: 1,11 sec
    SQL: 0.0254 sec
    Queries: 5


    mit Persistente Verbindungen

    Zitat


    localhost: 0,19 sec
    SQL: 0.0932 sec
    Queries: 5


    localhost ist die Dauer für das gesammte Script.


    :D Sehr sehr nice!

  • Dann mach dir doch noch mal intensiv Gedanken darüber was es bedeutet wenn Daten "gecached" werden.


    Hab ich und es hat keinen Einfluss auf die Sicherheit für unsere Zwecke.


    http://php.net/manual/de/features.persistent-connections.php

    Zitat


    Eine wichtige Zusammenfassung. Persistente Verbindungen wurden entwickelt, um eins-zu-eins Abbildungen auf reguläre Verbindungen zu haben. Das heißt, dass man immer in der Lage sein sollte, die persistenten Verbindungen durch nicht-persistente zu ersetzten, ohne dass dies den Skriptablauf verändert. Es kann (und wird vermutlich auch) die Effizienz des Skriptes beeinflussen, aber nicht dessen Verhalten.


    Siehe auch "Warnung"

  • Klang so.
    BTW - ich hatte glaub ich im ersten post geschrieben, dass die query zeit mit prepared statements 1 sec länger dauert.
    Hatte dabei aber nicht bedacht, dass ich im gesamten script auch über die gängige methode die verbindung zum SQL server aufgebaut hatte,
    Also 2 mal verbinden á ~1 sec = eine sec mehr.


    Mit prepared statements only muss ich feststellen, dass alles deutlich schneller läuft.
    Ist sicher wieder abhängig vom vorhaben, aber selbst wenn es nicht merkbar schneller wird, so macht es die arbeit im script sehr viel einfacher.


    Bin jetzt kein pro, aber selbst ich konnte 1 und 1 zusammen zäheln und habe alle SQL querys so eingerichtet, das ich sie immer wieder an andere stelle "prepared" verwenden kann.


    Ach ja - was ich noch nicht getestet ab ist, ob ein
    foreach(){#sql query ausführen}
    oder ein while einen unterschied macht.
    Sicher ist ein foreach "noob" (hatte wir schon mal drüber geredet), aber ich schätze es macht bei der geschwindigkeit keinen unterschied mehr.



    EDIT: die diagramme zeigen glaub ich ganz gut den unterschied: http://www.phphatesme.com/blog…rsistente-verbindungen-2/

Jetzt mitmachen!

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