Checklist PDO MySql

Om verbinding te leggen met een database, heb je de class PDO nodig. PDO is een laag tussen de database en je applicatie waarmee je allerlei opdrachten kunt geven aan je database. In geval van PDO maakt het eigenlijk niet uit welke database je gebruikt, door de flexibiliteit van PDO kun je deze laag op bijna iedere database loslaten.

$db = new PDO('mysql:host=localhost;dbname=test' , 'root' , '');

Bovenstaande code maakt een nieuw object aan van de class PDO. Met $db kun je nu alle methoden en eigenschappen van PDO class aanroepen. Begrijp je nog niet hoe een class werkt? Verdiep je dan eerst in de werking van classes.

query() methode

$stmt = $db->query("SELECT * FROM users");
while ($row = $stmt->fetch()) {
echo $row['naam'];
}

Met de methode query() kun je de gewenste gegevens uit de database trekken en naar je site overzetten. Aan de variabele $stmt hangen de methoden en properties van de PDO class. De methode fetch() geeft aan dat je data uit de database wilt halen. Door $stmt->fetch() te gebruiken, haal je de data uit de database in een array. Deze array komt via de while – loop vervolgens op je site terecht.

fetch() methode

// $stmt->fetch();
// methode PDO class om data uit de database te halen

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
// methode fetch maar nu specifiek als een associatieve array
echo $row['naam']; 
// associatieve array maakt het mogelijk de data per kolomnaam in de database op te halen
}

while ($row = $stmt->fetch(PDO::FETCH_NUM)){
// methode fetch maar nu specifiek als een numeriek array
echo $row[1]; 
// numeriek array maakt het mogelijk de data per nummer van de kolom in de database op te halen
}

Met de fetch() methode kun je de data omzetten naar iets dat leesbaar wordt op je site. Je plukt de data uit de database, zet deze om in een array soort dat je wilt en vervolgens met een While() { … } loop tover je het om naar iets dat leesbaar wordt. De fetch() methode heeft een aantal opties die je kunt be├»nvloeden, de belangrijkste voor nu is de soort array waarmee je wilt gaan werken (associatief of numeriek). De associatieve array is in de praktijk het meest bruikbaar, aangezien deze de naam van de kolom van de data uit de database gebruikt. Dit zorgt ervoor dat je code leesbaar en onderhoudbaar blijft voor de toekomst.

Let op: de fetch() methode heeft een nadeel in de praktijk. Deze methode haalt 1 rij per keer op en maakt daarvan een array. Met de While -loop kun je dit vervolgens wel regelen. Maar in de praktijk kom je daarom vaker de volgende methode tegen: fetchAll().

fetchAll() methode

$stmt->fetchAll(PDO::FETCH_ASSOC);
// methode van PDO class om data uit de database te halen. 
// nu haalt het de data als een array met alle gegevens uit de database

foreach ($stmt as $row) {
echo $row['naam']. "<br/>";
}

Met de fetchall() methode haal je in 1 keer alle data uit de database, stopt het in een associatieve array en deze kun je vervolgens uitlezen met de foreach() statement.

Prepared statements

In de voorgaande blokken heb je alleen vaste data uit de database gehaald. Maar wat als je nu een specifiek stuk van de data uit de database wilt halen? In dat geval werk je met variabelen en dus met input van de gebruiker van je site. In dat geval geldt: alleen prepared statements zijn toegestaan! Waarom? Omdat dit de veilige manier is om gegevens uit de database te halen zonder dat een hacker de kans krijgt je data te saboteren.

// Gegevens uit dat database trekken met positionele placeholder
$sql = 'SELECT * FROM users WHERE username = ?';

// Of met een benoemde placeholder (let op: is dubbele punt voor de variabele)
$sql = 'SELECT * FROM users WHERE username = :username';

// Prepare vervolgens de query voor gebruik bij ? gebruik
$stmt = $db->prepare($sql);
$stmt->execute([$username]);
$user = $stmt->fetch();

// Prepare vervolgens de query voor gebruik bij : gebruik
$stmt = $db->prepare($sql);
$stmt->execute(['username' => $username]);
$user = $stmt->fetch();

Je moet een keuze maken welke methode je gebruikt, door elkaar heen gaat niet goed. Als je gebruik maakt van de ?-placeholder manier, dan moet je de volgorde van de variabelen goed checken met je query() (en dus je SQL) volgorde. Bij de : – placeholder maakt dit niet uit, aangezien de associatieve array in de execute() methode voor de koppeling zorgt tussen alle gegevens. Daar maakt de volgorde niet uit.