Database class

PDO

Hieronder een korte uitleg van een query dmv van de PDO extensie.

Om dit te laten werken is het belangrijk dat in config.php de juiste database connecties zijn ingevuld.
Daarnaast wordt gebruik gemaakt van de config() functie. Let op dat je die in je functions.php komt te staan.

Toevoegen aan functions.php

function config($param)
{
    global $config;
    $path_items = explode(".", $param);
    $result = $config;
    foreach ($path_items as $item) {
        if (isset($result[$item]))
            $result = $result[$item];
        else {
            dd("config param " . $param . " bestaat niet");
        }
    }
    return $result;
}

Hieronder staat een Database class die we hieronder kort zullen bespreken. Een class is een blauwdruk van een object. Database.php komt in de root directory te staan. Let op de hoofdletter in de bestandsnaam. Zo geef je aan dat in het een class betreft.

<?php

class Database
{
    //is de PDO connectie
    private $connection;

    //wordt aangeroepen als je een nieuw database object aanmaakt
    public function __construct()
    {
        $dns = "mysql:host=" . config('database.host') . ";" .
            "port=" . config('database.port') . ";" .
            "dbname=" . config('database.dbname') . ";" .
            "charset=" . config('database.charset');

        try { //probeer een verbinding te maken
            $this->connection = new PDO($dns, config('database.user'), config('database.password'), [
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
            ]);
        } catch (Exception $e) { //als het niet lukt dan...
            $this->showException($e);
        }
    }

    public function query($sql, $params = [])
    {
        try { //probeer de query uit te voeren

            //aanmaken van een query
            $query = $this->connection->prepare($sql);

            //query uitvoeren
            $query->execute($params);

            return $query;
        } catch (Exception $e) { //als het niet lukt dan ...
            $this->showException($e);
        }
    }

    public function lastInsertId()
    {
        return $this->connection->lastInsertId();
    }

    //tonen van een mislukking
    private function showException($exception)
    {
        //pas aan voor een productie omgeving
        dd($exception->getMessage());

        //productie
        //echo "Er is een fout opgetreden, ga <a href='/'>terug</a> naar de website";
        //die();
    }
}

Een class is een beschrijving van een object dat je steeds kan herbruiken. Omdat wij regelmatig onze database gaan aanroepen is het handig om dit in een class te zetten. Deze is eenvoudig aan te roepen. Zonder dat we steeds weer moeten kijken hoe alles werkt.

Als je niet snapt wat er gebeurt is dit helemaal niet erg. Dit is een eenmalige actie en we kunnen deze telkens opnieuw gebruiken.

Database class gebruiken

<?php //dit is een voorbeeld die je kan uitvoeren in index.php
//Hier kunnen we alles inladen wat we op elke pagina nodig hebben

//configuratie bestand
$config = require "config.php";

//Onze veel gebruikte functies
require "functions.php";

require "Database.php";

//nieuw object Database aanmaken, we stoppen hier de configuratie gegevens in om verbinding met de database te maken
$db = new Database($config['database']);

//gegevens in een variabele zetten (meerdere users)
$users = $db->query("SELECT * FROM users")->fetchAll();
//dd($users);

//enkele user
$user = $db->query("SELECT * FROM users WHERE id=1")->fetch();
//dd($user);

//dynamische query die is beschermt tegen SQL-injecties
//voor de ? zal in dit geval 1 worden ingevuld. (dit zal meestal een variabele zijn die je via een formulier meestuurd.
//zie voor verdere uitleg https://laracasts.com/series/php-for-beginners-2023-edition/episodes/20
$user = $db->query("SELECT * FROM users WHERE id = ?", [1])->fetch();
//dd($user);

//met meerdere parameters: maakt query SELECT * FROM users WHERE email='john@mail.nl' and password='doe'
$user = $db->query("SELECT * FROM users WHERE email = ? AND password = ?", ['john@mail.nl', 'doe'])->fetch();
//dd($user); //zal false op het scherm schrijven omdat deze user niet bestaat

In index.php kan je even spelen met bovenstaande code. Hiermee kan je een query op de database uitvoeren. Met de dd() functie kan je het resultaat op het scherm schrijven. Het verschil tussen fetch() en fetchAll() is het ophalen van één resultaat of meerdere resultaten. Let op dit is alleen om even te testen. Daarna verwijderen we de code uiteraard uit index.php.

Uiteraard kan je ook update queries op deze manier uitvoeren

$db = new Database();
$db->query("UPDATE users SET voornaam = ? WHERE id=?",['Piet',1]);

Deze query zal de voornaam van id=1 wijzigen in Piet

Aantal gewijzigde rijen

Als je wilt weten hoeveel rijen er gewijzigd

$db = new Database();
$aantal = $db->query("UPDATE users SET voornaam = ? WHERE id=?", ['Pietje', 1])->rowCount();

$aantal zal een getal zijn. Indien 0 dan is er iets mislukt met de update.

Id van een insert

Als je een insert-query doet met een autoincreament kolom dan wil je af en toe weten welk id is aangemaakt.

$db->query("INSERT INTO users (email,password,voornaam,achternaam) VALUES (?,?,?,?)", [
    'pietje@mail.nl',
    password_hash('password', PASSWORD_BCRYPT),
    'Pietje',
    'Puck'
]);
$id = $db->lastInsertId();
dd($id);

$id krijgt het id'nr van de laatst ingevoerde user.

Gegevens verwijderen

$db = new Database();
$aantal = $db->query("DELETE FROM users WHERE id=?", [1])->rowCount();
dd($aantal);

Dit zal user met id=1 weggooien. Indien deze user bestaat dan zal $aantal gelijk zijn aan 1 (1 rij verwijderd).

 

MYSQLI

Under construction...