M.: /PHP Verständnisfrage zu PDO

Mahlzeit,
mal ne kurze Frage zu PHPs PDO.
Ich schreib ja das Statement nur einmal und kann dann, je nach Treiber, auf verschiedenen Datenbank zugreifen.

Haben jetzt die Datenbanken alle die gleiche Syntax (hab mich bisher nur mit MySQL und oberflächlich mit PostgreSQL beschäftigt) oder wird die intern umgeschrieben? Oder muss ich Datenbankspezifische Abfragen schreiben?

Im letzten Fall macht ja das Konzept nur wenig Sinn.

Macht mich schlau ;)

  1. Tach!

    mal ne kurze Frage zu PHPs PDO.
    Ich schreib ja das Statement nur einmal und kann dann, je nach Treiber, auf verschiedenen Datenbank zugreifen.

    PDO vereinheitlicht nur den Zugriff auf verschiedene DBMS, ansonsten musst du für jedes DBMS deren speziellen Funktionen verwenden. Und diese haben sich ziemlich uneinheitlich entwickelt. Andererseits braucht man (selten meist) auch mal spezielle Funktioen um bestimmte Features des DBMS ansprechen zu können. Insofern sind DBMS-spezifische Funktionen nicht ganz unnütz.

    Haben jetzt die Datenbanken alle die gleiche Syntax (hab mich bisher nur mit MySQL und oberflächlich mit PostgreSQL beschäftigt) oder wird die intern umgeschrieben? Oder muss ich Datenbankspezifische Abfragen schreiben?

    Natürlich nicht, nein und jein. Jedes DBMS hat zumindest verschiedene Zusätze zum SQL-Standard. Es gibt eine gemeinsame Basis, mit der man die RUDI/CRUD-Funktionalität dialektübergreifend hinbekommt. Aber wenn es ans Eingemachte mit einer komplexen SQL-Query gehen soll, kommt man schnell an die Stelle, an der man DBMS-Spezifika einsetzt. Und das war's dann mit der Interoperabilität. PDO jedenfalls reicht die Querys einfach nur durch. Es nimmt keine Vereinheitlichung auf Statementbasis vor. Lediglich bei Prepared Statements greift es ein und stellt diese Funktionalität auch den Systemem zur Verfügung, die das nicht können. Wobei ich nicht weiß, ob es mittlerweile auch vereinheitlicht, dass einige Systeme namensbasiert binden können (:foo, :bar), andere nur positionsorientiert (?, ?).

    Im letzten Fall macht ja das Konzept nur wenig Sinn.

    Es vereinheitlicht und vereinfacht teilweise den Zugriff. Das ist schon viel wert, wenn du mehrere DBMS unterstützen willst. Oder du willst bei deinen Projekten mal MySQL, mal SQLite verwenden, dann freut es dich sicher auch, dass du nicht zwei (oder mehr) verschiedene Funktionssammlungen verwenden musst.

    dedlfix.

    1. Erstmal danke an dich und Christian :)

      Es vereinheitlicht und vereinfacht teilweise den Zugriff. Das ist schon viel wert, wenn du mehrere DBMS unterstützen willst. Oder du willst bei deinen Projekten mal MySQL, mal SQLite verwenden, dann freut es dich sicher auch, dass du nicht zwei (oder mehr) verschiedene Funktionssammlungen verwenden musst.

      [Christian Kruse]

      Nein, leider ist das nicht der Fall. Nicht nur ist die Syntax oft sehr unterschiedlich (warum gibt es ANSI-SQL, wenn sich außer PostgreSQL keiner drein hält?!) sondern auch das Featureset unterscheidet sich sehr. Du musst oft unterschiedliche Statements pro DBMS schreiben.

      Ok, dann ist es (leider) so, wie ich mir das gedacht hab.
      Dann bleibt also auch weiterhin nur die Möglichkeit , z.B. die Datenbankaufrufe in eine Klasse zu packen (je DBMS eine eigene) und die Aufrufe irgendwie zu verallgemeinern.
      Das mache ich bisher ja schon, aber da ich noch die alten mysql-Funktionen drin hab, muss ich langsam umstellen.
      Aktuell ist zwar nur mysql relevant aber man will ja flexibel bleiben ;)
      Mal sehen, wie ich mein Vorhaben umsetze. Zumindest weiss ich jetzt was ich vor mir hab ;)

      1. Tach!

        Dann bleibt also auch weiterhin nur die Möglichkeit , z.B. die Datenbankaufrufe in eine Klasse zu packen (je DBMS eine eigene) und die Aufrufe irgendwie zu verallgemeinern.
        Aktuell ist zwar nur mysql relevant aber man will ja flexibel bleiben ;)

        Du könntest auf einen ORM umsteigen und nur seine Funktionalitäten verwenden, ohne direkt SQL zu schreiben. Das reicht, solange du nur 08/15-Datenzugriffe hast und keine komplexen SQL-Gebilde fabrizieren musst.

        dedlfix.

        1. Du könntest auf einen ORM umsteigen und nur seine Funktionalitäten verwenden, ohne direkt SQL zu schreiben. Das reicht, solange du nur 08/15-Datenzugriffe hast und keine komplexen SQL-Gebilde fabrizieren musst.

          Das Problem dabei ist, für die einfachen Datenzugriffe reicht aktuell die fertige Klasse aus, die aus Parametern ein Statement bastelt. Die Umstellung auf PDO oder Mysqli ist maximal 3 Stunden Arbeit.
          Ich brauch eher was für komplexere Statements, aber hab da schonmal angefangen ein Konzept zu entwerfen.
          Ich will ein Objekt mit Daten füttern und dadurch können auch komplexe Anfragen realisiert werden.Jetzt muss ich mir nur noch überlegen, wie die Klasse dazu aussehen soll ;)

  2. Moin M.,

    Haben jetzt die Datenbanken alle die gleiche Syntax (hab mich bisher nur mit MySQL und oberflächlich mit PostgreSQL beschäftigt) oder wird die intern umgeschrieben? Oder muss ich Datenbankspezifische Abfragen schreiben?

    Nein, leider ist das nicht der Fall. Nicht nur ist die Syntax oft sehr unterschiedlich (warum gibt es ANSI-SQL, wenn sich außer PostgreSQL keiner drein hält?!) sondern auch das Featureset unterscheidet sich sehr. Du musst oft unterschiedliche Statements pro DBMS schreiben.

    LG,
     CK