## Database object

Om de database te benaderen. Gaan we gebruik maken van een database object.

Dit object plaatsen we in de "src" directory.

    <?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,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
          ]);
        } catch (Exception $e) { //als het niet lukt dan...
          $this->showException($e);
        } catch (Error $e) {
          $this->showException($e);
        }
      }

      public function query(string $sql, array $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)
      {
        //Alleen in productie
        if(config('app.env')!='production'){
          dd($exception->getMessage());
        }else{
          echo "Er is een fout opgetreden, ga <a href='/'>terug</a> naar de website";
          die();
        }
      }
    }

Als we dit object gaan gebruiken dan zal je langzamerhand ook de code gaan begrijpen.

Om dit te laten werken moeten in het configuratie bestand de verbinding met de database worden aangemaakt.

    <?php
    return [
      'app' => [
        'name' => 'Code Wizards',
        'email' => 'info@code-wizards.nl',
        'env' => 'dev',
       ],
      'database' => [
        'user' => 'root',
        'password' => 'usbw',
        'port' => 3306,
        'host' => 'localhost',
        'dbname' => 'code_wizards',
        'charset' => 'utf8mb4',
      ],
    ];

En om het database object te gebruiken moet deze worden ingeladen in het index bestand

    //Database class
    require __DIR__ . "/../src/Database.php";

## Gebruik van de database class

We gaan nu even testen of onze database connectie werkt en of we gegevens uit de database kunnen halen.

We starten even met een snelle slordige manier. Als het werkt maken we alles netjes.

We openen het bestand app/views/home.view.php en wijzigen de code in het volgende.

    <?php
    view("parts/header", ['title' => 'home']);
    view("parts/navigatie-menu");
    ?>
    <div class="sm:mx-10">
      <h1 class="text-3xl my-4">Home</h1>

      <?php
      $db = new Database();
      $result = $db->query("SELECT * FROM posts ORDER BY id LIMIT 1")->fetch();
      ?>
      <div class="border border-1 rounded p-4 bg-gray-50">
        <h2 class="font-bold"><?= $result['title'] ?></h2>
        <?= $result['content'] ?>
      </div>
    </div>
    <?php
    view("parts/footer");

We starten PHP

    <?php

We maken een database class aan met variabele naam `$db` (kies hiervoor een logische naam)

    $db = new Database();

We gebruiken onze database class om een query op de database uit te voeren. We selecteren in dit geval de meest recente "post" en stoppen dit in `$result`.

    $result = $db->query("SELECT * FROM posts ORDER BY id LIMIT 1")->fetch();

`$result` is nu een array met keys en values. De key's zijn de kolomnamen uit de tabel "posts" de values zijn de gegevens die bij de laatste "post" staan.

We sluiten PHP af

    ?>

Daarna maken we een blok aan waar we de 'titel' en de 'content' van de laatste "post" inzetten.
Het op het scherm schrijven van een value van de array kan dus met `$result['title']`

    <div class="border border-1 rounded p-4 bg-gray-50">
      <h2 class="font-bold"><?= $result['title'] ?></h2>
      <?= $result['content'] ?>
    </div>

Om het er een beetje uit te laten zien wordt tailwindcss gebruikt voor de opmaak.
- een rand die een beetje rond is
- padding van 4px
- lichtgrijze achtergrond

De gegevens uit de database worden getoond door

    <?= $result['title'] ?>

Dit is een snel notatie voor

    <?php echo $result['title']; ?>

Met als resultaat

Dit was even snel testen of het werkt. Nu gaan we de code op de juiste plaats zetten.

Logica en database interactie komt in de controller. En in de view komt alleen wat we willen laten zien.

Dus open app/controllers/home.php en plaats daar de logica in. En geef aan de view de title en content mee

    <?php

    $db = new Database();

    $result = $db->query("SELECT * FROM posts ORDER BY id LIMIT 1")->fetch();

    view("home", [
      'title' => $result['title'],
      'content' => $result['content'],
    ]);

We geven nu aan de view home (php pagina home.view.php) twee variabele mee 'title' en 'content'. Deze variabele kan je nu in home.view.php gebruiken. Uiteraard begint de variabele wel met een $

home.view.php verwijder de logica en wijzig de $result in de meegestuurde variabele $title en $content.

    <?php

    view("parts/header", ['title' => 'home']);
    view("parts/navigatie-menu");
    ?>

    <div class="sm:mx-10">
      <h1 class="text-3xl my-4">Home</h1>

        <div class="border border-1 rounded p-4 bg-gray-50">
          <h2 class="font-bold"><?= $title; ?></h2>
          <?= $content ?>
        </div>
    </div>

    <?php
    view("parts/footer");

Het komt er dan ongeveer als volgt uit te zien op de site