# K Validatie

Er zijn twee vormen van validatie:

- client side validatie
- server side validatie

### Client side validatie

Let op deze validatie heeft twee grote nadelen:

Kwetsbaarheid voor manipulatie: Client-side validatie vindt plaats op de computer van de gebruiker, wat betekent dat kwaadwillende gebruikers de validatieregels gemakkelijk kunnen omzeilen of uitschakelen door de client-side code aan te passen of uit te schakelen. Dit maakt het onbetrouwbaar voor het beveiligen van gevoelige gegevens of kritieke processen.

Browserafhankelijkheid: Client-side validatie kan verschillen tussen browsers.

Maar deze validatie is zeer eenvoudig toe te passen dus wel wenselijk om als extra beveiliging te gebruiken.

Hieronder een paar voorbeelden hoe te gebruiken

<input type="text" name="title" placeholder="Titel" required>
Door de required entity toe te voegen aan een form field maak je veld verplicht de browser zal een melding geven wanneer de gebruiker het veld leeg laat. (let op dit gebeurt niet met hele oude browsers)
<input type="email" name="email" placeholder="email" required>
Door het type in een input veld mee te geven wordt ook een validatie gedaan. In bovenstaand voorbeeld kunnen alleen geldige email adressen worden ingevoerd.
Daarnaast zijn nog een aantal Javascript validaties mogelijk. Maar die gaan te ver voor deze cursus.

### Server side validatie

Bij server side validatie ga je valideren op het moment dat het formulier naar de server is verstuurd.
We zullen een voorbeeld uitwerken voor het opslaan van een nieuwe 'post'. Dit opslaan gebeurt in de controller `post-store.php`. Deze gaan we hieronder aanpassen voor validatie
Daarvoor starten we met het aanmaken van een lege `$errors` array. In deze array gaan we alle fouten opslaan die we tegen komen.

    // in $errors worden de foutmeldingen opgeslagen
    $errors = [];

    if ($_POST != null) {

Daarna starten we met validatie. Hieronder kijken we of de tekst lengte van de titel niet gelijk aan 0 is. Indien dat wel zo is wordt een boodschap in de `$errors` array gezet.

      // controleren of de titel is ingevuld
      if (strlen($_POST['title']) == 0) {
        $errors['title'] = "Titel mag niet leeg zijn";
      }

Indien er geen errors zijn (`$errors` is leeg) dan mag de post ingevoerd worden in de database.

      if (empty($errors)) {
        // invoeren van de gegevens in de database
        $db->query("INSERT INTO posts (title, content, user_id) VALUES (?, ?, ?)", [
          $_POST['title'],
          $_POST['content'],
          63, // user_id hard coded wordt later vervangen door
        ]);

        //hier kan je alleen komen als de query goed is uitgevoerd
        flash("Post is opgeslagen", true, 3000);

        // doorsturen naar posts pagina
        header("Location: /posts");
      }
    }

Als laaste helemaal onder aan het bestand verwijzen we door naar de view `post-create.view.php`. We geven hier de `$errors` mee zodat ze deze variabele in onze view kunnen gebruiken.

    //er is geen post dus we laten het formulier zien
    view("post-create", [
      'errors' => $errors
    ]);

We openen onze post-create.view.php en voegen onder het invoer veld van de titel een stukje code om een foutmelding te laten zien (we hebben de required bij de titel even weggelaten om de code te kunnen testen)

    <input type="text" name="title" placeholder="Titel"><br>
    <?php if (isset($errors['title'])): ?>
      <p class="text-red-500 text-sm my-2"><?= $errors['title'] ?></p>
    <?php endif; ?>

Indien $errors['title'] bestaat dan zal de foutmelding getoond worden zoals hieronder

Nu hebben we nog een probleem. Wanneer we een tekst hebben ingevoerd bij content en de titel hebben leeggelaten. Zal de foutmelding verschijnen, maar is de tekst van content ook leeg. Dit is niet wenselijk, dan moet de gebruiker de hele tekst opnieuw intypen. Een manier om dit te voorkomen zou het volgende kunnen zijn.

    <textarea name="content" placeholder="Content..."><?= $_POST['content'] ?? '' ?></textarea><br>

We vullen de textarea met hetgeen we zo juist verstuurd hebben. De `?? ''` zal een legen waarden invullen indien er niets is verstuurd (`$_POST['content']` niet bestaat)

Voor het input veld werkt dan door de entity value te vullen:

    <input type="text" name="title" placeholder="Titel" value="<?= $_POST['title'] ?? ''?>"><br>

Als we de validatie verder uitwerken ook voor het content veld zal de code alsvolgt worden (klik op de link)
controller post-store.php
view post-create.view.php