Tutorials

MySQLi

Een korte introductie over MySQLi de toekomst van MySQL

Pagina 1

Inleiding

Vanaf PHP6 zal mysql_* niet meer ondersteunt worden. Dat is ook niet gek want mysql_* stamt nog uit de tijd van PHP3 en heeft in de achterligende code eigenlijk geen veranderingen ondergaan.
In PHP5 heeft men daarom gekozen voor MySQLi of te wel MySQL Improved.


MySQLi heeft naast die I in de naam nog een aantal belangrijke wijzigingen. Eén van de belangrijkste is: STMT (Prepared statements).


Een algemene tip voor mensen die vanaf nu complete systemen en/of website gaan bouwen die niet meer PHP4 compatible hoeven te zijn is dus: Gebruik geen MySQL maar MySQLi of werkt via bijvoorbeeld [php]PDO[/php].


Literatuur/Naslag:
Pagina 2

Eisen aan de server

MySQLi stelt natuurlijk wel een aantal eisen aan de server:
  • [item]De MySQL server moet minimaal versie 4.1 zijn[/item][item]PHP is minimaal versie 5[/item][item]De MySQLi extensie moet ingeschakeld zijn.[/item]

Dat laatste kan je heel makkelijk controleren door een bestand aan te maken met:

<?php
    phpinfo();
?>

Als het goed is vindt je een kopje met mysqli. Zo niet dan zal je je PHP.ini moeten openen en een ; weghalen voor: extension=php_mysqli.dll
Na een herstart van je webservices/php zal MySQLi geactiveerd zijn.

NB: Er zijn distributies van PHP in omloop geweest waarbij de MySQL en MySQLi extensie in één bestand zaten.
Pagina 3

Verbinden met MySQL server - nieuwe stijl

In MySQLi is er een belangrijke keuze;
  • [item]Gaan we voor de ouderwetse functie stijl[/item][item]OF[/item][item]Gaan we voor de OOP stijl[/item]


Ik zal ze alle twee beschrijven:
We beginnen lekker ouderwets met de functie stijl.

<?php
    $connectie = mysqli_connect('host','gebruikersnaam','wachtwoord','database');
?>

Belangrijk in MySQLi is dat we de verbindings resource opslaan in een variabelen en dat we naast het gebruikelijke stukje ook een database meegeven. Een opdracht als mysqli_select_db bestaat namelijk niet!

Als we kiezen voor OOP werk dan verbinden we zo:

<?php
    $mysqli = new mysqli('host', 'gebruikersnaam', 'wachtwoord', 'database');
?>

We hebben nu een MySQLi object gekregen.

Foutafhandeling
De foutafhandeling voor verbindingsfouten is voor beide stijlen bijna hetzelfde en verloopt via mysqli_connect_error en mysqli_connect_errno.
Voor de functie stijl gebruiken we:

<?php
    if ($connectie == false)
    {
        printf("Er kan geen verbinding worden gemaakt met de database. Foutmelding: %s\n", mysqli_connect_error());
    }
?>

Voor de OOP stijl gebruiken we:

<?php
    if (mysqli_connect_errno())
    {
        printf("Er kan geen verbinding worden gemaakt met de dtabase. Foutmelding: %s\n", mysqli_connect_error());
    }
?>
Pagina 4

Een simpele select

Laten we lekker simpel beginnen met een dood normale select query en we doen meteen een num_rows erbij.
Voor de functie stijl is eigenlijk alles hetzelfde behalve dan dat we eerst de verbindingsresources meegeven.

<?php
    $resultaat = mysqli_query($connectie, "SELECT * FROM tabel");
    while ($record = mysqli_fetch_assoc($resultaat))
    {
        print_r($record);
    }
    echo "\r\nAantal records: " . mysqli_num_rows($resultaat);
?>


Niks bijzonders toch? Nu de OOP stijl:

<?php
    $resultaat = $mysqli->query("SELECT * FROM tabel");
    while ($record = $resultaat->fetch_assoc())
    {
        print_r($record);
    }
    echo "\r\nAantal records: " . $resultaat->num_rows;
?>

Let op dat num_rows geen methode is maar een variabelen.
Pagina 5

Insert, update, delete -- old style

We gaan even wat toevoegen aan onze tabel.

Functie stijl:

<?php
    $veld1 = mysqli_real_escape_string($connectie, $veld1);
    $veld2 = mysqli_real_escape_string($connectie, $veld2);
    $resultaat = mysqli_query($connectie, "INSERT INTO tabel (veld1, veld2) VALUES ('" . $veld1 . "','" . $veld2 . "');");
    if ($resultaat == false)
    {
        echo "Query mislukt. Foutmelding: " . mysqli_error();
    }
    else
    {
        echo "Query gelukt!";
    }
?>


OOP stijl:

<?php
    $veld1 = $mysqli->real_escape_string($veld1);
    $veld2 = $mysqli->real_escape_string($veld2);
    $resultaat = $mysqli->query("INSERT INTO tabel (veld1, veld2) VALUES ('" . $veld1 . "','" . $veld2 . "');");
    if ($resultaat == false)
    {
        echo "Query mislukt. Foutmelding: " . $mysqli->error;
    }
    else
    {
        echo "Query gelukt!";
    }
?>


Weinig veranderd behalve dat het verplicht is om aan real_escape_string een connectie mee te geven.
Pagina 6

Nu goed, STMT

Willen we nu meer dan één rij toevoegen dan komen we uit bij STMT of te wel prepared statements.

Hoe werkt dit?
We leggen eerst aan de MySQL server een query voor die dient als de basis. Hierin zijn de waardes vervangen door vraagtekens (?). De MySQL server geeft als de tabel en veldnamen bestaan groen licht voor de query en we kunnen razendsnel tientalle records toevoegen. Het zelfde kan met update en delete en zelfs met select.

Stap voor stap, uitleg in de code:

<?php
    // Start een STMT
    $stmt = mysqli_stmt_init($connectie);
    // Laat de server het voorbeeld controleren
    if (mysqli_stmt_prepare($stmt, "INSERT INTO tabel (veld1, veld2) VALUES (?,?)"))
    {
        // Het sjabloon is goedgekeurd
        // Geef eerst de STMT gevolg door de types van de ? velden (s=string)
        // Geef in dezelfde volgorde als de ? de variabelen waar de waarde in voor komen.
        mysqli_stmt_bind_param($stmt, "ss", $veld1, $veld2);
        
        // Geef de variabelen een waarde
        $veld1 = 'iks';
        $veld2 = 'dee';
        mysqli_stmt_execute($stmt);

        // Nu een kwestie van nieuwe waarde bepalen en opnieuw uitvoeren...
        $veld1 = 'boris';
        $veld2 = 'niek';
        mysqli_stmt_execute($stmt);
        
        // Als laatste sluiten we de STMT
        mysqli_stmt_close($stmt);
    }
    else
    {
        echo "De query sjabloon bevat een fout.";
    }
?>


In plaats van s (string) kan ook: i voor integer, d voor double, b voor blob


Een zelfde voorbeeldje in OOP:

<?php
    $stmt = $mysqli->prepare("INSERT INTO tabel (veld1, veld2) VALUES (?, ?)");
    $stmt->bind_param('ss', $veld1, $veld2);
    $veld1 = 'iks';
    $veld2 = 'dee';
    $stmt->execute();
    $veld1 = 'boris';
    $veld2 = 'niek';
    $stmt->execute();
    $stmt->close();
?>


Opmerking Nee ik gebruik geen real_escape_string. Goed he, dat doet execute automatisch toepassen voor je.
Pagina 7

Verder....

We kunnen nog veel meer met MySQLi.
Dat zal ik ook wel allemaal hier kunnen gaan schrijven maar je kan het ook zelf (of andere laten) uitzoeken.
Met deze pagina kom je ver genoeg.





Natuurlijk staat deze tutorial ook op mijn eigen site

Reacties

0
Nog geen reacties.