Een blik op MySQLi (Deel I)
Sinds PHP 5 is er een nieuwe extensie voor het gebruik met MySQL 4.1 tot 5.0: de MySQLi extensie. Deze versies van MySQL bevatten nieuwe features op verschillende vlakken en waar van toepassing biedt deze extensie daar ondersteuning voor. Denk aan dingen als SSL connecties, prepared statements, en sinds MySQL 5.0 ook stored procedures. Deze korte reeks bekijkt de mogelijkheden van MySQLi tov die van de oude MySQL extensie. Dit eerste artikel uit de reeks kijkt naar hoe je in met MySQLi de standaard dingen kunt doen die je met de MySQL extensie gewend bent.
Smaken verschillen
Het eerste verschil met de normale mysql extensie is dat de extensie in feite in 2 smaken komt: een procedurele, zoals je gewend was in PHP4 en een object georiënteerde smaak waarbij elke connectie en query resultaat een apart object is. Aangezien ik persoonlijk wel van de objecten hou, zal ik me dan ook richten op die smaak van MySQLi.
En hup! Van z'n 4 naar z'n 5!
Voor de standaard MySQL dingen gebruikte je in PHP 4 over het algemeen 7 functies:
- mysql_connect() om een connectie te maken
- mysql_select_db() om de database te selecteren
- mysql_query() om een query uit te voeren
- mysql_num_rows() om het aantal rijen in het resultaat te bepalen
- mysql_fetch_assoc() of een andere mysql_fetch_*() variant
- mysql_free_result() om de resultaten vrij te geven
- mysql_close() om de connectie weer te sluiten
Aangezien we nu een MySQLi object gebruiken zal het er allemaal net iets anders uitzien maar omdat de mannen van PHP zo aardig zijn geweest om de methodes in MySQLi vergelijkbare namen te geven als de functies in PHP4 zul je zien dat het allemaal best nog op elkaar lijkt:
-
$link = new MySQLi('localhost', 'test', 'test');
-
$link->select_db('scriptorama');
Je kunt echter ook direct de database naam doorgeven aan de constructor:
-
$link = new MySQLi('localhost', 'test', 'test', 'scriptorama');
Mag ik van jou.....
We zullen later zien dat MySQLi meerdere methodes biedt om queries uit te voeren. In dit artikel beperken we ons tot de methode zoals je deze kent van PHP 4:
-
$link = new MySQLi('localhost', 'test', 'test', 'scriptorama');
-
$result = $link->query("SELECT id, titel FROM guestbook");
-
-
while ($row = $result->fetch_assoc($res)) {
-
}
-
-
// geef het resultaat vrij
-
$result->close();
-
-
// sluit de connectie
-
$link->close();
Gaat het weer een beetje? Meneer MySQL?
Een connectie kan mislukken gaan en een query kan in de soep lopen door een simpele fout, kortom: we moeten kijken of alles goed is gegaan. Om te controleren of de connectie goed is gelopen zullen we een kleine omleiding van de object georiëteerde highway moeten nemen en de functies mysqli_connect_errno() en mysqli_connect_error() gebruiken. Deze worden niet direct door het MySQLi object ondersteund:
Om te controleren of er iets fout is gegaan bij een query kun je kijken of MySQLi::query() FALSE heeft geretourneerd. Foutmeldingen kun je dan vervolgens vinden in de property MySQLI::error zoals het volgende voorbeeld toont:
-
$link = new MySQLi('localhost', 'test', 'test', 'scriptorama');
-
-
// mysql_connect_errno() retourneert 0 als er geen fouten zijn
-
if (!$link || mysqli_connect_errno() != 0) {
-
exit;
-
}
-
-
// We hebben de tabelnaam fout geschreven
-
$result = $link->query("SELECT * FROM gestboek");
-
-
if (!$result) {
-
echo "Helaas, er is een fout opgetreden in de database<br />";
-
}
-
-
/* $result is FALSE en geen
-
* result object en dus hoeven we die
-
* te sluiten. De connectie echter wel: */
-
-
$link->close();
Opmerking:Uit usability en veiligheids overwegingen zou je de foutmelding eigenlijk niet in z'n geheel moeten tonen. In principe heeft niemand behalve jij iets aan die gegevens en het is niet nodig om eventuele kwaadwillenden de details van jouw database structuur te geven
Conclusie
Zoals je ziet kun je met MySQLi op bijna dezelfde manier, soms zelfs iets makkelijker, gegevens uit MySQL halen. In de rest van deze reeks zullen we verder kijken naar de extra mogelijkheden die de extensie biedt.
Volg Scriptorama via RSS!
Reageer ook!
Als je een onstabiele database connectie gebruikt naar een remote server zou je het volgende principe kunnen gebruiken:
Kan allemaal wel beter, want nu blijft ie tot in den eeuwigheid proberen te connecten, maar het gaat om het idee.
Door Daniel
op 02.09.06 @ 2:49 pm | Permalink
Dat is natuurlijk snel op te lossen met een retry-teller mechanisme.
Door Mathieu
op 02.09.06 @ 3:32 pm | Permalink
[...] Een blik op MySQLi I - Standaard werk [...]
Door Scriptorama » Een blik op MySQLi III - Unbuffered queries op 02.16.06 @ 10:46 pm | Permalink
[...] MySQLi I - Een introductie tot MySQLi [...]
Door Scriptorama » Afhankelijke listboxes met PHP, MySQLi en Prototype op 03.28.06 @ 10:48 pm | Permalink
Als ik op deze manier een connectie probeer te maken krijg ik de volgende error:
Fatal error: Cannot instantiate non-existent class: mysqli
Ik gebruik MySQL 5 met PHP5.
Enig idee wat er fout gaat?
Door ineke
op 04.05.06 @ 11:11 am | Permalink
Kijk eens of de mysqli extensie wel geladen is met behulp van de functie phpinfo(). Zo niet, dan zul je deze in php.ini moeten activeren.
Door Mathieu Kooiman
op 04.05.06 @ 11:25 am | Permalink