dedlfix: Zweieinhalb Bedingungen → drei Antworten

Beitrag lesen

Tach!

und angenehmer haben:→ PDO

Angenehmer

Hm. Definiere mal "angenehmer".

Das angenehmer bezieht sich auf das Handling von Prepared Statements.

Für den, der mal eben hunderte Skripte umschreiben muss, kann es durchaus "angenehmer" sein, dass er einiges davon mit "suchen und ersetzen" (womöglich tools wie sed...) erledigen kann. Nach dieser Definition wäre mysqli-* "angenehmer".

Kurzfristig. Die Umstellung ist das eine, aber wenn man schon auf ein modernes System umstellt, kann man auch möchten, dessen Möglichkeiten zu nutzen. Eine wesentliche davon sind die Prepared Statements. Und da kommt ein entscheidender Unterschied zwischen mysqli und PDO ins Spiel.

Wenn man mit mysqli Prepared Statements verwenden möchte, muss man bind_param und bind_result verwenden. Dazu muss man aber Variablen binden. Einfach so einen Wert zu übergeben geht nicht, man muss ihn erst in die gebundene Variable legen. Auch das Ergebnis kann man nicht einfach so als Array oder Objekt entgegennehmen, man hat es nur in den gebundenen Variablen zur Verfügung und muss es sich dann in eine andere Struktur übersetzen, wenn man es nicht gleich an Ort und Stelle ausgibt. Für kleine Scripts ist diese Vorgehensweise nicht weiter tragisch, aber für größere Anwendungen, die mit Datenobjekten arbeiten, ist das unvorteilhaft.

Auch wenn man anfängt, Universalhandler zu erstellen, die mit Querys mit beliebiger Anzahl Parameter und beliebiger Anzahl Ergebnisfelder umgehen können soll, dann muss man sich was ausdenken, wie man die Parameter und Ergebnisfelder in bindbare Variablen oder gleichwertigen Ersatz übertragen kann. Da kommt man dann an solche Konstrukte wie call_user_func_array() und Referenzen-Handling.

Wie schön einfach geht das doch bei PDO. Man kann da genauso umständlich binden, aber man kann auch ohne Binden sehr einfach dem Execute ein Array mit Parametern übergeben und fertig ist. Auch die Ergebnisse kann man sich wie bei herkömmlichen Query-Handling als Objekt oder Array liefern lassen, ohne selbst irgendwelche Übertragungen vornehmen zu müssen. Das ist verwenderfreundlich und nicht die viel zu technische Implementierung von mysqli.

Performance

Ich dachte eigentlich, mysqli müsste deutlich performanter sein, weil es sich auf eine Datenbank konzentriert und also gegenüber PDO eine Abstraktionsschicht einspart. Doch das ist offenbar nicht so.

Da verstehe ich deinen Gedankengang nicht so ganz. PDO ist ja kein ORM, was einen Haufen zusätzliche Arbeit erledigt, sondern erstmal nur eine Übersetzung von einem generellen Funktionsnamen in den jeweiligen der DBMS-API. Das macht eine native Schnittstelle nicht prinzipiell anders. Sie übersetzt den spezifischen PHP-Funktionsnamen in den Funktionsnamen der DBMS-API. Die Unterschiede kommen dann zum Vorschein, wenn der eine oder der andere Layer Zusatzfunktionen anbieten und mehr eigene Arbeit als eine solche 1:1 Übersetzung hat. Alles in allem, denke ich, sind die Unterschiede der Übersetzungsarbeit eher im Bereich Mikrooptimierung anzusiedeln. Das eigentliche Datenschaufeln im DBMS ist in der Regel der Hauptanteil an einer Abfrage.

dedlfix.