Ankündigung

Einklappen
Keine Ankündigung bisher.

PDO - Beitrag

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Zitat von VPh Beitrag anzeigen
    Ist bei Queries ohne Kontextwechsel doch nur unnötiger Overhead.
    Diesen "Overhead" kannst du dann beseitigen, wenn du wirklich welchen gemessen hast.

    Was meinst du mit "Queries ohne Kontextwechsel"? Ein Statement ohne Parameter? Es mag sein, dass ...
    PHP-Code:
    $dbconn = new PDO();
    $result $dbconn->query('select column from uselesstable'); 
    ein paar Microsekunden schneller ist als ...
    PHP-Code:
    $dbconn = new PDO();
    (
    $stmt $dbconn->prepare('select column from uselesstable'))->execute(); 
    ..., aber das funktioniert halt auch nur dann, wenn das jeweilige Stück Quellcode ausschließlich festverdrahtetes SQL abarbeitet.
    Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

    Kommentar


    • #17
      Ja.

      Syntax etwas simpler - Ein Funktionsaufruf weniger,
      Ausführung minimal schneller - Zeit für Preparen mainly; keine Ahnung ob ohne Parameter auch nochmal die zweite Tour durch den MySQL-Optimizer gemacht wird; evtl. DBMS-spezfische Performance-Geschichten, alte MySQL-Versionen konnten PS nicht in den Query-Cache aufnehmen z.B.
      MetaKommunikation im Code(?) - einfache Funktion für 'einfache' Operationen, komplexere Funktionen für komplexere Operationen wie eben Userinput oder mehrfache gleiche Abfrage mit wechselnden Parametern

      Das sind kleine Extras, die man über den einfacheren Weg erhält. Ich sehe da noch keinen Nachteil.
      [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
      [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

      Kommentar


      • #18
        Es ist performance-technisch egal ob du prepared Statements für basic queries nimmst oder reguläre. Wenn du im Mikrosekunden-Bereich optimieren musst, lief etwas vollkommen falsch.
        [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

        Kommentar


        • #19
          Wenn man bei PDO mit mysql ATTR_EMULATE_PREPARES ausgeschaltet hat wird sowieso wirklich jede query als prepared statement geschickt *. also auch welche, wie
          PHP-Code:
          $result $dbconn->query('select column from uselesstable'); 
          insofern kann man wirklich gleich für alles prepared statements nehmen.

          Edit 1: *kann man gut sehen, wenn man den query log von mysql anschaut. testcode:
          PHP-Code:
          $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
          $stmt=$pdo->query("select 1");
          var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)); 
          im query-log findet man dann:
          Code:
                     Prepare    select 1
                     Execute    select 1
          schaltet man emulate_prepares an findet man im query log stattdessen
          Code:
                     Query    select 1
          zusätzlich hat sich auch der datentyp verändert von der 1, die wir fetchen. ist emulate_prepares ausgeschaltet zeigt das var_dump
          Code:
          array(1) { [0]=> array(1) { [1]=> int(1) } }
          bei eingeschaltetem emulate_prepares dagegen:
          Code:
          array(1) { [0]=> array(1) { [1]=> string(1) "1" } }
          Edit 2: schade, dass nun doch attr_emulate_prepares nicht mit im artikel ist. imho gehört das in den ersten code zum verbindungsaufbau:
          PHP-Code:
          $dsn  'mysql:dbname=test;host=localhost;charset=utf8';
          $user 'root';
          $pass '';
          $options = array(
              
          PDO::ATTR_EMULATE_PREPARES => false,
              
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
              
          PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ
          );
          $pdo = new PDO($dsn$user$pass$options); 
          liebe Grüße
          Fräulein Dingsda

          Kommentar


          • #20
            Bin bisher immer davon ausgegangen, daß PDO::ATTR_EMULATE_PREPARES für MySQL per Defaultwert auf false steht und ein Setzen überflüssig ist.
            Habe den obigen Beitrag von Fräulein Dingsda zum Anlass genommen, dies mal zu überprüfen und mußte feststellen, das es bei den mir verfügbaren Systemen leider nicht auf false steht.

            Kommentar


            • #21
              Ok, danke. Somit nehme ich zusammenfassend für den Artikel mit:

              1. PDO::ATTR_EMULATE_PREPARES => false, mit in Verbindungserstellung aufnehmen, gem. #19

              2. Den Teil mit nackten Queries (ohne Prep.Statem.) entfernen (speziell weil bestimmt Anfänger Copy&Paste verwenden). Dann ist es explizit im Code ersichtlich was verwendet wird und die DB-Zugriffe es ist einheitlich Durchgängig.

              3. Keine Backticks, weil man dadurch die Portabilität verliert, jedoch Hinweis das man auf die reservierten Keywords achten muss, die ja vermutlich auch je DBMS wieder varrieren können.
              The string "()()" is not palindrom but the String "())(" is.

              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar


              • #22
                Und ich habe gedacht, der Hinweis darauf, daß es per default auf true steht, kam von Dir, jspit
                Finde den Post grad nicht auf die Schnelle, aber mir war so?!
                Competence-Center -> Enjoy the Informatrix
                PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                Kommentar


                • #23
                  Ich vermute, du hast noch PDO bindValue mit PDO::PARAM_INT für LIMIT im Hinterkopf. Dort hat aber auch schon dingsda einige wertvolle Hinweise gegeben.

                  Kommentar


                  • #24
                    Zitat von hausl Beitrag anzeigen
                    1. PDO::ATTR_EMULATE_PREPARES => false, mit in Verbindungserstellung aufnehmen, gem. #19

                    2. Den Teil mit nackten Queries (ohne Prep.Statem.) entfernen (speziell weil bestimmt Anfänger Copy&Paste verwenden). Dann ist es explizit im Code ersichtlich was verwendet wird und die DB-Zugriffe es ist einheitlich Durchgängig.

                    3. Keine Backticks, weil man dadurch die Portabilität verliert, jedoch Hinweis das man auf die reservierten Keywords achten muss, die ja vermutlich auch je DBMS wieder varrieren können.
                    Habe den Beitrag eben mal ensprechend überarbeitet ... bitte um Feedback wenn nochwas zu ergänzen wäre. Danke!

                    http://php-de.github.io/jumpto/pdo/

                    LG
                    The string "()()" is not palindrom but the String "())(" is.

                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar

                    Lädt...
                    X