Hallo, ik ben zelf bezig met een database te maken.
En in mijn boek staat dat er 3 verschillende mannieren zijn om een database aan te spreken in php 5.0

Het gaat hier om
MySQL, MySQLI & PDO.

Alleen zijn ze er vergeten bij te zetten waarom je voor welke zou kiezen en welke er nou eigenlijk de beste optie is en waarom.

Wat kan ik het beste nemen?
MYSQL mag je alvast vergeten, daar MYSQLi de opvolger is.

PDO neem je wanneer je scripts met verschillende DB's moet werken of werkbaar zijn (lees: pgSQL, acess, mySQL, ...)

MYSQLi neem je wanneer je enkel en alleen met MySQL moet gaan werken.
Bij 'een database' zijn er nog wel wat meer keuzes, MySQL is slechts 1 van de vele databases die beschikbaar zijn. En het is zeker niet de beste...

Ik gebruik zelf met veel plezier PDO, het doet alles wat ik nodig heb en werkt uitstekend met PostgreSQL en MySQL.
MySQL is de oude manier, maar nog wel meest gebruikte weliswaar. Deze heeft geen features zoals prepared statements en kent alleen functies, geen klassen. Je moet zelf om je veiligheid zorgen met mysql_real_escape_string.

MySQLi is MySQL, maar dan ietsjes sneller, en heeft ook een klasse. Daarnaast heeft hij volgens mij ook prepared statements.

PDO is wat abstracter, en kan voor verschillende databases gebruikt worden. Daardoor heeft het wat minder MySQL-only features dan bijvoorbeeld MySQLi. Verder is het volgens mij niet langzamer dan de anderen, maar heb je wel de veiligheid van Prepared Statements en het gemak dat je vrij simpel van database kan wisselen.

Ik zou voor PDO gaan, dat is 'de toekomst' zeg maar. De MySQL driver wordt binnenkort (in 5.3) overigens vervangen met mysqlnd, waardoor hij vele malen sneller zou worden. Maar ik denk dat die zowel binnen mysql, mysqli en pdo gebruikt zal gaan worden.

Prepared statements zijn veiliger omdat je niet direct de inhoud van de waarden die je in de query gebruikt in de query zet, dat doet de driver voor je. Daardoor heb je als het goed is geen last meer van SQL injection, en dat zonder dat je handmatig overal mysql_real_escape_string op aan hoeft te roepen.
Incompleet coorbeeldje:
<?php
$query = 'SELECT * FROM tabel WHERE id=:id'; // let op :id

$stmt = $dbh->prepare($query);

// variabelen in de query zetten:
$stmt->bindParam(':id', $_GET['id']);

// uitvoeren query:
$stmt->execute();
?>
Wel even oppassen, fout die veel voorkomt: bindParam heeft een variabele nodig, en niet een waarde. Hij verbindt hem by reference, zodat de waarde dus niet gekopieerd wordt, maar later, op het allerlaatste moment wordt uitgelezen door de driver.

<?php
$stmt->bindParam(':id', $_GET['id']); // werkt wel
$stmt->bindParam(':id', 24); // werkt niet

//ranzige oplossing
$stmt->bindParam(':id', $id = 24); // werkt weer wel :P
?>
@Jelmer: Hoevaak ik daar over ben gestruikeld? Ik ben de tel kwijt geraakt. Maar ja, een variabele die niet variabel is, is een beetje ongelukkig gekozen. Dan kun je hem beter direct in de query zetten.

Gelukkig leer ook ik uiteindelijk wel van mijn fouten... ;)
Ik ben er ook tig keer over gestruikeld, maar ik snap het argument wel. Ik heb nu de PDOStatement klasse maar uitgebreid met een setParam() method, die dit grapje voor mij doet. Dus bindParam() voor het binden, setParam() voor het handmatig invoeren :)

Situatie waarin ik in de problemen kom heeft er altijd mee te maken dat je een variabele aan een functie mee zou kunnen geven. Is hij wel meegegeven, dan is de waarde in de query variabel. Is hij niet meegegeven, dan vul ik zelf de waarde in. Maar om daar nu 2 aparte queries voor te maken :)
Het is me zo allemaal wat duidelijker geworden.
Ik denk dat PDO voor mij wel een goede oplossing is. Bedankt voor de uitleg!

Reageren