Otto Wyss: Tutorial/Beispiel für Access via PDO

Ich möchte meine bisherigen MYSQL-Statements endlich auf Prepare/Execute umstellen. Aber wenn ich schon umstelle, könnte ich ja gleich auf PDO wechseln. Nur sind die Beispiele im PHP Manual bezüglich meinen Fragen nicht sehr hilfreich. Z.B. wie verwalte ich persistente DB-Verbindungen (pro Webseite, pro PHP-Session, oder sonstwie). Kennt jemand eine Einführung oder ein Beispiel-Projekt, aus dem auch konzeptionelle Antworten ersichtlich sind (deutsch oder englisch)?

  1. Hi!

    wie verwalte ich persistente DB-Verbindungen (pro Webseite, pro PHP-Session, oder sonstwie).

    Wenn du ansonsten alle nötigen Voraussetzungen für persistente Verbindungen geschaffen hast (siehe im hiesigen Archiv über eine Autorensuche nach Sven Rautenberg), dann musst du laut der Handbuchseite zum Connections and Connection management nur ein Attribut setzen und PDO übernimmt den PHP-Part.

    Lo!

    1. Wenn du ansonsten alle nötigen Voraussetzungen für persistente Verbindungen geschaffen hast (siehe im hiesigen Archiv über eine Autorensuche nach Sven Rautenberg), dann musst du laut der Handbuchseite zum Connections and Connection management nur ein Attribut setzen und PDO übernimmt den PHP-Part.

      Danke, das habe ich verstanden. Was passiert aber, wenn ich ein bereits präpariertes Statement nochmals präpariere, ohne es vorher zu deallozieren?

      Eine andere Frage, wie bindet man Parameter wenn man statt einem "Select *" ein "Select name1, name2, ..." programmieren will? Muss ich die wie Output-Paramters bei Stored Procedures behandeln? Die Beispiele auf Prepared statements and stored procedures sind diesbezüglich nicht klar. Auch das Example #4 hilf nicht viel weiter, weil die gespeicherte Prozedur nicht gezeigt wird, es ist somit nicht klar woher "PDO::PARAM_STR" kommt.

      1. Hi!

        Was passiert aber, wenn ich ein bereits präpariertes Statement nochmals präpariere, ohne es vorher zu deallozieren?

        Das kommt drauf an. MySQL beispielsweise will, dass man zuerst alle Datensätze einer ausgeführten Abfrage abholt, bevor eine neue gestartet werden kann. Alternativ kann man das Statement schließen, dann wird die Ergebnismenge ebenfalls aufgeräumt. Allerdings handeln manchmal die verschiedenen Implementationen im Hintergrund zugunsten des Programmierers. Sie fragen zum Beispiel schon bei einem query() die Ergebnismenge komplett vom Server ab und lagern sie zwischen, auf dass der Client beim Fetch nur noch den Puffer befragt. Man kann dann bereits weitere Statements starten. Für mysqli gibt es mysqli_stmt_store_result(), mit der man dieses Hintergrund-Abholen explizit anstoßen kann/muss.

        Wie allerdings PDO intern arbeitet, entzieht sich meiner Kenntnis. Wenn das PHP-Manual dazu nichts schreibt, bleibt dir nur ein ausprobieren. Ausprobieren ist eigentlich immer eine gute Idee, denn dabei sammelt man auch schon Erfahrung.

        Eine andere Frage, wie bindet man Parameter wenn man statt einem "Select *" ein "Select name1, name2, ..." programmieren will?

        Ein SELECT hat nur Eingabeparameter. Ob du * oder die Feldliste ausschreibst ist egal. Die Eingabeparameter kommen ja üblicherweise erst im WHERE-Teil. Aber das ist vermutlich nicht das worauf du hinaus willst.

        Muss ich die wie Output-Paramters bei Stored Procedures behandeln? Die Beispiele auf Prepared statements and stored procedures sind diesbezüglich nicht klar. Auch das Example #4 hilf nicht viel weiter, weil die gespeicherte Prozedur nicht gezeigt wird, es ist somit nicht klar woher "PDO::PARAM_STR" kommt.

        PDO::PARAM_STR ist eine Konstante (siehe Predefined Constants und allgemein Class Constants). Die Beispiele #4 und #5 sind nur bei Stored Procedures interessant, wenn diese einen oder mehrere Werte "obenrum" zurückgeben, sprich: über die Eingabeparameter. Ein SELECT gibt sein Ergebnis "nach unten" ab, als zu fetchende Ergebnismenge. (Eine Stored Procedure kann auch eine Ergebnismenge erzeugen. Man kann also "in beide Richtungen" Werte zurückbekommen.)

        Wenn du dir den Funktionsumfang der Klasse PDOStatement anschaust, dann siehst du da drei Methoden, die mit "bind" beginnen. bindParam() und bindValue() sind für die Eingabeparameter zuständig (und eben "obenrum"-Ausgabeparameter von Stored Procedures). bindColumn() hingegen ist für das Binden von Ergebnismengenspalten an Variablen verwendbar. Benutzen musst du das aber meines Wissens nicht, du kannst nach dem Execute auch herkömmlich fetchen.

        Lo!