Posts van een user

In een vorige paragraaf hebben we een pagina gemaakt waar posts konden worden toegevoegd. Nu we een inlog mogelijkheid hebben kunnen we de ingevoerd post koppelen aan de ingevoerde gebruiker.

In controllers/post-store.php stond vanaf regel 32 de volgende code die een post invoert 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
]);

De 63 was het user_id, op deze plaats willen we nu het id van de ingelogde gebruiker plaatsen. Dit kan eenvoudig door deze uit de session te halen.

$db->query("INSERT INTO posts (title, content, user_id) VALUES (?, ?, ?)", [
  $_POST['title'],
  $_POST['content'],
  $_SESSION['user']['id'], // user_id uit de session
]);

Ook kunnen we de helper functie user() gebruiken om het probleem op te lossen (zelfde resultaat)

$db->query("INSERT INTO posts (title, content, user_id) VALUES (?, ?, ?)", [
  $_POST['title'],
  $_POST['content'],
  user()->id, // user_id dmv helper functie
]);

Alleen voor ingelogde gebruikers

Uiteraard mag je de pagina waar je posts aan kan maken alleen benaderen als je ingelogde gebruiker bent.

De route kunnen we beveiligen met de auth() functie.

router.php

if(auth()){
  $route->get('post-create', "views/post-create.view.php");
}

Het is nu alleen nog voor ingelogde gebruikers mogelijk om naar /post-create te gaan.
Toch staat de link nu ook nog bij niet ingelogde gebruikers op de pagina waar de posts te zien zijn. Dus daar moeten we ook een kleine aanpassing doen.

views/posts.view.php

<?php if (auth()): ?>
  <a href="/post-create" class="text-indigo-600 hover:text-indigo-400">Post toevoegen</a><br>
<?php endif; ?>

Om de link naar /post-create zetten we een if(auth()): dus alleen als je ingelogd bent zal de link op het scherm worden getoond.

User tonen bij een post

Misschien wil je ook nog tonen wie een post heeft geschreven. Uiteraard kan dat ook, daarvoor moeten we de query die alle posts ophaalt iets aanpassen.

$result = $db->query("SELECT posts.*, users.name FROM posts, users WHERE posts.user_id = users.id AND title LIKE ? or content LIKE ?", [
  "%{$_GET['search']}%",
  "%{$_GET['search']}%"
])->fetchAll();

En indien er niet wordt gezocht

$result = $db->query("SELECT posts.*, users.name FROM posts, users WHERE posts.user_id = users.id")->fetchAll();

We maken dus een join tussen de posts tabel en de user tabel. Hiermee worden ook alle user gegevens opgehaald. In de select geven we aan dat we alleen de name van de user willen hebben.

Onder de content in de view kan je de naam van de gebruiker bijvoorbeeld tonen met de volgende code

<h3 class="italic text-sm mt-3">Door: <?= htmlspecialchars($post['name']) ?></h3>