Laat ik het anders verwoorden: de
voordelen die in dat artikel worden genoemd zijn duidelijk gekleurd, en daarnaast zijn het geen echte voordelen. Het is overwegend propaganda uit het pro-PDO kamp.
Ik zeg ook niet dat je te allen tijde mysqli zou moeten gebruiken, beide hebben toepassingen en soms is PDO handiger dan mysqli en soms ook andersom.
Het vervelende van zo'n artikel is dat veel mensen die met deze materie beginnen waarschijnlijk de bomen door het bos niet kunnen zien en vervolgens zo'n artikel lezen en dan op grond van deze (wat mij betreft foutieve of op zijn minst zeer gebrekkige) informatie besluiten om dan maar PDO te gebruiken.
En vervolgens gebruiken zij op hun beurt deze referentie op het moment dat anderen aan hun vragen wat zij zouden moeten gebruiken of waar zij de voorkeur aan geven, en mogelijk ook waarom. Daarbij herhalen ze braaf de argumenten die in dat artikel werden genoemd, maar die argumenten snijden echt weinig hout.
Op den duur is het een echt gevestigd misverstand dat dit artikel een soort van autoriteit is die zou "aantonen" dat je toch moet concluderen dat PDO uiteindelijk een "betere" keuze zou zijn.
Laten we
heel snel door de speerpunten heen
rennenlopen:
API support
Beide ondersteunen OOP. Uit oogpunt van modulair werken (en omdat je andere code ook deze aanpak heeft etc.) verdient de OOP-aanpak meestal de voorkeur. In dit opzicht maakt het dus niet uit wat je kiest.
Database support
PDO ondersteunt 12+ drivers, mysqli enkel Mysql.
Okay. Maar als je voor de keuze PDO vs MySQLi stond, dan maak je dus blijkbaar gebruik van een MySQL-database, anders was je meteen met PDO aan de slag gegaan nietwaar? Of je gebruikt een andere database in welk geval je aangewezen bent op vendor-specifieke code/libraries in welk geval PDO (alsook mysqli) om te beginnen geen optie was.
Dan het volgende, aangenomen dat je dus een MySQL-database gebruikt. Heb je dan ondersteuning voor andere database(driver)s nodig? Hoe vaak komt het in de levensloop van een applicatie voor dat je van database schakelt? Ik heb het nog niet meegemaakt.
En als daar sprake van is, dan is dit nog steeds een traject, en niet een of andere schakelaar die je omgooit waarbij je alles in de andere db kiepert en je meteen kunt gaan ofzo.
En zelfs als je in die situatie PDO had gebruikt, dan had je dat nog steeds niet gered (los van het feit dat je alles zou moeten testen, tenzij je het leuk vindt om gevaarlijk te leven), omdat PDO niet uit zichzelf voorziet in Database-Abstractie - de SQL-code die je schrijft is nog steeds toegespitst op de database en is niet per definitie compatibel met de andere database die worden ondersteund door PDO. Tenzij je dus object relational mapping toepast zoals later in het relaas wordt voorgesteld, maar dat wordt hier gemakshalve even vergeten. En het feit dat je nog steeds maatwerk moet schrijven voor een specifieke database om het verschil te overbruggen, dus wat was ook alweer het voordeel van al deze abstractie?
Named Parameters
Okay, dit kan handig zijn (in PDO), maar als je je variabelen omschrijvende namen geeft dan hoeft dit niet echt een issue te zijn? En in MySQLi zijn prepared statements... niet optimaal.
Los daarvan, al dat binden van variabelen etc., aint nobody got time for that!
Dan zou je een debat kunnen voeren over het gebruik van prepared statements, en of je dat verplicht zou moeten stellen. Ik denk dat het belangrijker is dat je snapt wat je doet, in plaats van dat je je redding zoekt in een specifieke methodiek, en je jezelf dan veilig waant voor potentiële gevaren, en vervolgens dingen doet die zeer onveilig zijn (variabelen concateneren in prepared statements, het gebeurt nog steeds). Er zijn meerdere manieren om queries te beveiligen en in ALLE gevallen moet je weten waarom dit queries veilig maakt. Dit wordt dan verankerd in een procedure of werkwijze.
Maar je zult nog steeds altijd moeten waken voor de gevaren op elk moment dat je met "(user) data" werkt (informatie uit een of andere interne of externe bron, ook de data in je eigen database zou je als "niet veilig" moeten bestempelen).
Object Mapping
Lijkt me handig als je betaald wordt per geschreven regel code :p.
Of je mappers gebruikt staat verder ook los van welke aanpak je kiest. Dus ook in dit geval maakt het niet uit.
Security
Het injectie-voorbeeld wat daar gegeven wordt werkt volgens mij niet eens (meer), standaard staat MySQLi (en ook PDO, of liever gezegd de MySQL driver van PDO) niet toe dat meerdere queries tegelijkertijd worden uitvoeren (en waarschijnlijk is dit standaard in MySQL zelf). Daarnaast is het toestaan en/of gebruiken van multiqueries of aanverwante functionaliteit heel erg onveilig (heeft iig haken en ogen ten aanzien van escaping) en ook nogal onverstandig. Ook bieden multiqueries geen garanties voor het volledig uitvoeren van alle queries in zo'n batch en daarbij is er een veel beter alternatief hiervoor: transacties.
Het maakt niet uit of je PDO gebruikt of mysqli, als je niet snapt wat je aan het doen bent en/of je geen procedure hebt die voorschrijft hoe je hier veilig mee om zou moeten gaan dan is het hek sowieso van de dam.
Performance
Maakt niet uit, dit wordt zelfs op de PHP-site zelf verkondigd.
Om dan vervolgens te kunnen concluderen:
Ultimately, PDO wins this battle with ease.
Alsof PDO in alle/de meeste opzichten met kop en schouders uitsteekt boven de rest?
Nou nee, niet echt. Of liever gezegd, echt niet.
Gemakshalve vergeet het artikel ook te vermelden dat de leercurve niet zit in het handjevol classes en methoden waar PDO over beschikt, maar in de database driver-specifieke instellingen die bepalen hoe de database reageert op bepaalde queries. PDO is namelijk niet op voorhand "gebruiksklaar" voor wat voor database dan ook. mysqli daarintegen is "ready to go".
Het enige wat PDO "echt" brengt is enige standaardisatie in het communiceren met je database, maar de communicatie zelf is nog steeds database-specifiek.
Het enige wat ik eigenlijk wil overdragen is dat je je niet moet laten overrompelen (of "omlullen") door dit soort artikelen maar dat je zelf kritisch blijft nadenken over wat er wordt gezegd en wat er wordt beweerd. Schat dit vervolgens op waarde in plaats van enkel de pro's en contra's te tellen want in dit artikel zijn de (uitvergrote) pro's nogal zwak. Daarom is wat mij betreft dit artikel nou niet bepaald een goede advocaat voor PDO.
Zowel PDO alsook mysqli hebben hun sterktes en gebreken, maar zolang ik (uitsluitend) van MySQL/MariaDB gebruik maak is er voor mij geen enkele reden om PDO te gebruiken... tenzij ik hier een specifieke reden voor heb. Zo waren fatsoenlijke prepared statements handig om een importscript snel te laten verlopen (en om dit in mysqli te programmeren voelt onwijs omslachtig aan). Maar dat is precies het ding: laat deze keuze een ontwerpbeslissing zijn, de klus bepaalt het gereedschap, niet andersom.
Dat hele artikel is zoiets als "Hamer vs Zaag", en de hamer komt als winnaar uit de bus. Dan heb ik zoiets van "
Toegepast op welke situatie?". Een hamer is lang niet altijd het betere stuk gereedschap.