Dit is deel 3 van een 4-delige serie over het bouwen van een blog met PHP en MySQL. Je kunt de vorige twee delen hier bekijken:deel 1, deel 2.
In de laatste twee delen van deze tutorial zijn we klaar met het maken van de openbare ruimte. We hebben zelfs onze database opgezet, enkele gegevens in de databasetabellen ingevoegd en deze opgevraagd en op de pagina weergegeven. Maar we willen niet altijd gebruikers, berichten of onderwerpen maken met behulp van een databaseclient zoals PHPMyAdmin, toch? We willen een interface op de website en een ingelogde gebruiker met beheerdersrechten om dat te doen.
Wanneer een gebruiker met beheerdersrechten inlogt, wordt deze automatisch doorgestuurd naar het beheerdersdashboard. Maar we hebben nog geen admin-gebruiker in ons systeem aangemaakt. We zullen dat binnenkort doen.
Maak in uw complete-blog-php/admin-map een bestand met de naam dashboard.php.
dashboard.php:
<?php include('../config.php'); ?>
<?php include(ROOT_PATH . '/admin/includes/admin_functions.php'); ?>
<?php include(ROOT_PATH . '/admin/includes/head_section.php'); ?>
<title>Admin | Dashboard</title>
</head>
<body>
<div class="header">
<div class="logo">
<a href="<?php echo BASE_URL .'admin/dashboard.php' ?>">
<h1>LifeBlog - Admin</h1>
</a>
</div>
<?php if (isset($_SESSION['user'])): ?>
<div class="user-info">
<span><?php echo $_SESSION['user']['username'] ?></span>
<a href="<?php echo BASE_URL . '/logout.php'; ?>" class="logout-btn">logout</a>
</div>
<?php endif ?>
</div>
<div class="container dashboard">
<h1>Welcome</h1>
<div class="stats">
<a href="users.php" class="first">
<span>43</span> <br>
<span>Newly registered users</span>
</a>
<a href="posts.php">
<span>43</span> <br>
<span>Published posts</span>
</a>
<a>
<span>43</span> <br>
<span>Published comments</span>
</a>
</div>
<br><br><br>
<div class="buttons">
<a href="users.php">Add Users</a>
<a href="posts.php">Add Posts</a>
</div>
</div>
</body>
</html>
Ga in uw browser naar http://localhost/complete-blog-php/admin/dashboard.php en u zult zien dat er geen styling is en dat er foutmeldingen zijn over het niet opnemen van twee bestanden. Dat komt omdat we deze bestanden nog niet hebben aangemaakt. Dat doen we binnenkort.
Maak een map in uw beheerdersmap met de naam include.
De reden dat we een aparte include-map voor het admin-gebied hebben gemaakt, is om ervoor te zorgen dat alle admin-bestanden zich in één map (admin) bevinden. Later kunnen we de beveiliging van de beheerdersmap versterken met htaccess-authenticatie. Dat gaan we in deze tutorial echter niet doen.
Maak in deze nieuw aangemaakte map 'Includes' een bestand met de naam head_section.php. Open head_section.php en voeg deze code eraan toe:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- Google Fonts -->
<link href="https://fonts.googleapis.com/css?family=Averia+Serif+Libre|Noto+Serif|Tangerine" rel="stylesheet">
<!-- Font awesome -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />
<!-- ckeditor -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/ckeditor/4.8.0/ckeditor.js"></script>
<!-- Styling for public area -->
<link rel="stylesheet" href="../static/css/admin_styling.css">
Laad de dashboard.php-pagina opnieuw in de browser. Nu is de foutmelding die overblijft voor slechts één bestand (admin_functions.php). Daar komen we snel op terug.
Eenmaal in de backend kan de gebruiker gebruikers, berichten en onderwerpen maken, lezen, updaten en verwijderen. Laten we beginnen met gebruikers. Maak in uw beheerdersmap een bestand met de naam users.php
Open nu user.php en voeg deze code eraan toe:
gebruikers.php:
<?php include('../config.php'); ?>
<?php include(ROOT_PATH . '/admin/includes/admin_functions.php'); ?>
<?php
// Get all admin users from DB
$admins = getAdminUsers();
$roles = ['Admin', 'Author'];
?>
<?php include(ROOT_PATH . '/admin/includes/head_section.php'); ?>
<title>Admin | Manage users</title>
</head>
<body>
<!-- admin navbar -->
<?php include(ROOT_PATH . '/admin/includes/navbar.php') ?>
<div class="container content">
<!-- Left side menu -->
<?php include(ROOT_PATH . '/admin/includes/menu.php') ?>
<!-- Middle form - to create and edit -->
<div class="action">
<h1 class="page-title">Create/Edit Admin User</h1>
<form method="post" action="<?php echo BASE_URL . 'admin/users.php'; ?>" >
<!-- validation errors for the form -->
<?php include(ROOT_PATH . '/includes/errors.php') ?>
<!-- if editing user, the id is required to identify that user -->
<?php if ($isEditingUser === true): ?>
<input type="hidden" name="admin_id" value="<?php echo $admin_id; ?>">
<?php endif ?>
<input type="text" name="username" value="<?php echo $username; ?>" placeholder="Username">
<input type="email" name="email" value="<?php echo $email ?>" placeholder="Email">
<input type="password" name="password" placeholder="Password">
<input type="password" name="passwordConfirmation" placeholder="Password confirmation">
<select name="role">
<option value="" selected disabled>Assign role</option>
<?php foreach ($roles as $key => $role): ?>
<option value="<?php echo $role; ?>"><?php echo $role; ?></option>
<?php endforeach ?>
</select>
<!-- if editing user, display the update button instead of create button -->
<?php if ($isEditingUser === true): ?>
<button type="submit" class="btn" name="update_admin">UPDATE</button>
<?php else: ?>
<button type="submit" class="btn" name="create_admin">Save User</button>
<?php endif ?>
</form>
</div>
<!-- // Middle form - to create and edit -->
<!-- Display records from DB-->
<div class="table-div">
<!-- Display notification message -->
<?php include(ROOT_PATH . '/includes/messages.php') ?>
<?php if (empty($admins)): ?>
<h1>No admins in the database.</h1>
<?php else: ?>
<table class="table">
<thead>
<th>N</th>
<th>Admin</th>
<th>Role</th>
<th colspan="2">Action</th>
</thead>
<tbody>
<?php foreach ($admins as $key => $admin): ?>
<tr>
<td><?php echo $key + 1; ?></td>
<td>
<?php echo $admin['username']; ?>,
<?php echo $admin['email']; ?>
</td>
<td><?php echo $admin['role']; ?></td>
<td>
<a class="fa fa-pencil btn edit"
href="users.php?edit-admin=<?php echo $admin['id'] ?>">
</a>
</td>
<td>
<a class="fa fa-trash btn delete"
href="users.php?delete-admin=<?php echo $admin['id'] ?>">
</a>
</td>
</tr>
<?php endforeach ?>
</tbody>
</table>
<?php endif ?>
</div>
<!-- // Display records from DB -->
</div>
</body>
</html>
Dit is alles wat we hoeven te doen in het bestand users.php. Het aanmaken, bewerken en verwijderen van een gebruiker gebeurt in dit ene bestand.
Boven aan het bestand users.php roepen we een functie getAdminUsers() aan die een array van alle beheerdersgebruikers uit de database retourneert. Deze functie moet worden gedefinieerd in het admin_functions.php-bestand dat we nog niet hebben gemaakt, maar je kunt het zien in ons user.php-bestand net voor de functieaanroep.
Maak in uw beheerdersmap admin_functions.php en voeg deze code eraan toe:
admin_functions.php:
<?php
// Admin user variables
$admin_id = 0;
$isEditingUser = false;
$username = "";
$role = "";
$email = "";
// general variables
$errors = [];
/* - - - - - - - - - -
- Admin users actions
- - - - - - - - - - -*/
// if user clicks the create admin button
if (isset($_POST['create_admin'])) {
createAdmin($_POST);
}
// if user clicks the Edit admin button
if (isset($_GET['edit-admin'])) {
$isEditingUser = true;
$admin_id = $_GET['edit-admin'];
editAdmin($admin_id);
}
// if user clicks the update admin button
if (isset($_POST['update_admin'])) {
updateAdmin($_POST);
}
// if user clicks the Delete admin button
if (isset($_GET['delete-admin'])) {
$admin_id = $_GET['delete-admin'];
deleteAdmin($admin_id);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* - Returns all admin users and their corresponding roles
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
function getAdminUsers(){
global $conn, $roles;
$sql = "SELECT * FROM users WHERE role IS NOT NULL";
$result = mysqli_query($conn, $sql);
$users = mysqli_fetch_all($result, MYSQLI_ASSOC);
return $users;
}
/* * * * * * * * * * * * * * * * * * * * *
* - Escapes form submitted value, hence, preventing SQL injection
* * * * * * * * * * * * * * * * * * * * * */
function esc(String $value){
// bring the global db connect object into function
global $conn;
// remove empty space sorrounding string
$val = trim($value);
$val = mysqli_real_escape_string($conn, $value);
return $val;
}
// Receives a string like 'Some Sample String'
// and returns 'some-sample-string'
function makeSlug(String $string){
$string = strtolower($string);
$slug = preg_replace('/[^A-Za-z0-9-]+/', '-', $string);
return $slug;
}
?>
Laad de dashboard.php-pagina opnieuw in uw browser en de foutmelding is verdwenen.
Vervolgens voegt u de navbar.php-pagina en de menu.php-pagina toe. Dit zijn herhalende segmenten van beheerderspagina's, net zoals het geval was met de openbare ruimte.
Maak dus deze 2 bestanden in de map admin/includes:navbar.php en menu.php.
navbar.php:
<div class="header">
<div class="logo">
<a href="<?php echo BASE_URL .'admin/dashboard.php' ?>">
<h1>LifeBlog - Admin</h1>
</a>
</div>
<div class="user-info">
<span>Awa</span> <a href="<?php echo BASE_URL . '/logout.php'; ?>" class="logout-btn">logout</a>
</div>
</div>
menu.php:
<div class="menu">
<div class="card">
<div class="card-header">
<h2>Actions</h2>
</div>
<div class="card-content">
<a href="<?php echo BASE_URL . 'admin/create_post.php' ?>">Create Posts</a>
<a href="<?php echo BASE_URL . 'admin/posts.php' ?>">Manage Posts</a>
<a href="<?php echo BASE_URL . 'admin/users.php' ?>">Manage Users</a>
<a href="<?php echo BASE_URL . 'admin/topics.php' ?>">Manage Topics</a>
</div>
</div>
</div>
Laten we nu een styling maken voor de admin-sectie. Maak in de map complete-blog-php/static/css/ een bestand met de naam admin_styling.css en voeg deze code eraan toe:
/* * * * * * * * * *
* STYLING DEFAULTS
* * * * * * * * * */
* { margin: 0px; padding: 0px; }
a { text-decoration: none; }
h1, h2, h3, h4, h5, h6 { font-family: 'Noto Serif', serif; }
/* forms */
form { width: 60%; margin: 5px auto; padding-bottom: 50px; }
form input[type=file], input[type=email], input[type=password], input[type=text],
form select, form textarea {
width: 100%;
display: block;
padding: 13px 13px;
font-size: 1em;
margin: 5px auto 10px;
border-radius: 3px;
box-sizing : border-box;
background: transparent;
border: 1px solid #3E606F;
}
input[type="checkbox"] { height: 20px; float: left; }
form button { float: right; margin-left: 24%; }
form input:focus { outline: none; }
label { margin-top: 20px; float: left; }
/* tables */
table { border-collapse: collapse; width: 70%; margin: 20px auto; }
th, td { padding: 8px; text-align: left; border: 1px solid #ddd; }
th { text-align: center;}
/* buttons */
.btn {
color: white;
background: #4E6166;
text-align: center;
border: none;
border-radius: 5px;
display: block;
letter-spacing: .1em;
padding: 13px 20px;
text-decoration: none;
}
/* * * * * * * * * *
* HEADER
* * * * * * * * * */
.header {
padding: 15px 45px;
font-family: 'Noto Serif', serif;
color: white;
background: black;
}
.header .logo { width: 50%; float: left; }
.header .logo h1 { color: white; }
.header .user-info { width: 10%; margin-top: 10px; float: right;}
.header .logout-btn { color: red; text-decoration: none; }
.header:after{ content: ""; display: block; clear: both; }
/* * * * * * * * * *
* DASHBOARD
* * * * * * * * * */
.container {
width: 95%;
margin: 5px auto 50px;
border: 1px solid #BFBCB3;
padding: 10px 0px 50px;
}
.container:after { content: ""; display: block; clear: both; }
.container.dashboard h1 { text-align: center; margin: 25px; }
.container.dashboard .stats a {
display: inline-block;
padding: 30px;
margin: 5px;
width: 25%;
text-align: center;
border-radius: 3px;
border: 1px solid #BFBCB3;
}
.container.dashboard .stats a.first { margin-left: 25px; }
.container.dashboard .stats a:hover { cursor: pointer; background-color: #E1E1E1; }
.container.dashboard .buttons { margin-left: 15px; }
.container.dashboard .buttons a {
display: inline-block;
margin: 10px;
text-decoration: none;
color: #444;
padding: 10px 25px;
border: none;
background-color: #0E7D92;
color: white;
}
/* * * * * * * * * *
* PAGE CONTENT
* * * * * * * * * */
.container.content .menu { width: 16%; float: left; padding: 40px 10px; }
/* Menu card */
.container.content .menu .card .card-header {
padding: 10px;
text-align: center;
border-radius: 3px 3px 0px 0px;
background: #3E606F;
}
.container.content .menu .card .card-header h2 { color: white; }
.container.content .menu .card .card-content a {
display: block;
box-sizing: border-box;
padding: 8px 10px;
border-bottom: 1px solid #e4e1e1;
color: #444;
}
.container.content .menu .card .card-content a:hover {
padding-left: 20px; background: #F9F9F9; transition: 0.1s;
}
/* Actions div (at the middle) */
.container.content .action { width: 35%; float: left; text-align: center; }
.container.content .action form { width: 90%; }
.container.content .action .page-title { margin: 25px; }
.container.content .action.create-post-div { width: 80%; }
/* Table div (Displaying records from DB) */
.table-div { float: left; width: 47%; }
.table-div .message { width: 90%; margin-top: 20px; }
.table-div table { width: 90%; }
.table-div a.fa { color: white; padding: 3px; }
.table-div .edit { background: #004220; }
.table-div .delete { background: #F70E1A; }
.table-div .publish { background: red; }
.table-div .unpublish { background: green; }
/* * * * * * * * * *
* VALIDATION ERRORS
* * * * * * * * * */
.message {
width: 100%;
margin: 0px auto;
padding: 10px 0px;
color: #3c763d;
background: #dff0d8;
border: 1px solid #3c763d;
border-radius: 5px;
text-align: center;
}
.error {color: #a94442; background: #f2dede; border: 1px solid #a94442; margin-bottom: 20px; }
.validation_errors p {text-align: left;margin-left: 10px;}
Ga in je browser naar http://localhost/complete-blog-php/admin/users.php je ziet een foutmelding dat het bestand messages.php niet is gevonden. Maak een bestand met de naam berichten.php in de map complete-blog-ph/includes en voeg deze code daarin toe:
<?php if (isset($_SESSION['message'])) : ?>
<div class="message" >
<p>
<?php
echo $_SESSION['message'];
unset($_SESSION['message']);
?>
</p>
</div>
<?php endif ?>
Hiermee worden meldingsberichten weergegeven om de gebruiker feedback te geven over zijn acties.
Beheergebruikers aanmaken, lezen, bijwerken en verwijderen
De pagina users.php bevat al een formulier voor het maken en bijwerken van een beheerder, evenals een tabel voor het weergeven en verwijderen van gebruikers. Het enige dat overblijft is om de PHP-functies toe te voegen die deze acties uitvoeren. Open dus het bestand admin_functions.php en voeg deze code toe direct na de gebruikersacties van de beheerder (de if-instructies) bovenaan de pagina en vóór de functie getAdminUsers():
admin_functions.php:
/* - - - - - - - - - - - -
- Admin users functions
- - - - - - - - - - - - -*/
/* * * * * * * * * * * * * * * * * * * * * * *
* - Receives new admin data from form
* - Create new admin user
* - Returns all admin users with their roles
* * * * * * * * * * * * * * * * * * * * * * */
function createAdmin($request_values){
global $conn, $errors, $role, $username, $email;
$username = esc($request_values['username']);
$email = esc($request_values['email']);
$password = esc($request_values['password']);
$passwordConfirmation = esc($request_values['passwordConfirmation']);
if(isset($request_values['role'])){
$role = esc($request_values['role']);
}
// form validation: ensure that the form is correctly filled
if (empty($username)) { array_push($errors, "Uhmm...We gonna need the username"); }
if (empty($email)) { array_push($errors, "Oops.. Email is missing"); }
if (empty($role)) { array_push($errors, "Role is required for admin users");}
if (empty($password)) { array_push($errors, "uh-oh you forgot the password"); }
if ($password != $passwordConfirmation) { array_push($errors, "The two passwords do not match"); }
// Ensure that no user is registered twice.
// the email and usernames should be unique
$user_check_query = "SELECT * FROM users WHERE username='$username'
OR email='$email' LIMIT 1";
$result = mysqli_query($conn, $user_check_query);
$user = mysqli_fetch_assoc($result);
if ($user) { // if user exists
if ($user['username'] === $username) {
array_push($errors, "Username already exists");
}
if ($user['email'] === $email) {
array_push($errors, "Email already exists");
}
}
// register user if there are no errors in the form
if (count($errors) == 0) {
$password = md5($password);//encrypt the password before saving in the database
$query = "INSERT INTO users (username, email, role, password, created_at, updated_at)
VALUES('$username', '$email', '$role', '$password', now(), now())";
mysqli_query($conn, $query);
$_SESSION['message'] = "Admin user created successfully";
header('location: users.php');
exit(0);
}
}
/* * * * * * * * * * * * * * * * * * * * *
* - Takes admin id as parameter
* - Fetches the admin from database
* - sets admin fields on form for editing
* * * * * * * * * * * * * * * * * * * * * */
function editAdmin($admin_id)
{
global $conn, $username, $role, $isEditingUser, $admin_id, $email;
$sql = "SELECT * FROM users WHERE id=$admin_id LIMIT 1";
$result = mysqli_query($conn, $sql);
$admin = mysqli_fetch_assoc($result);
// set form values ($username and $email) on the form to be updated
$username = $admin['username'];
$email = $admin['email'];
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* - Receives admin request from form and updates in database
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
function updateAdmin($request_values){
global $conn, $errors, $role, $username, $isEditingUser, $admin_id, $email;
// get id of the admin to be updated
$admin_id = $request_values['admin_id'];
// set edit state to false
$isEditingUser = false;
$username = esc($request_values['username']);
$email = esc($request_values['email']);
$password = esc($request_values['password']);
$passwordConfirmation = esc($request_values['passwordConfirmation']);
if(isset($request_values['role'])){
$role = $request_values['role'];
}
// register user if there are no errors in the form
if (count($errors) == 0) {
//encrypt the password (security purposes)
$password = md5($password);
$query = "UPDATE users SET username='$username', email='$email', role='$role', password='$password' WHERE id=$admin_id";
mysqli_query($conn, $query);
$_SESSION['message'] = "Admin user updated successfully";
header('location: users.php');
exit(0);
}
}
// delete admin user
function deleteAdmin($admin_id) {
global $conn;
$sql = "DELETE FROM users WHERE id=$admin_id";
if (mysqli_query($conn, $sql)) {
$_SESSION['message'] = "User successfully deleted";
header("location: users.php");
exit(0);
}
}
De code die we zojuist hebben toegevoegd, bestaat uit 3 hoofdonderdelen:initialisatie van beheerdersgebruikersvariabelen, beheerdersgebruikersacties en beheerdersgebruikersfuncties, in die volgorde. Dit is dezelfde indeling waarin we code zullen toevoegen voor onderwerpen die hierna komen. Voorlopig kun je al een gebruiker aanmaken, lezen, bijwerken en verwijderen.
Ga nu naar http://localhost/complete/admin/users.php. Maak een gebruiker en wijs die gebruiker de beheerdersrol toe. Zorg ervoor dat u de gebruikersnaam en het wachtwoord van deze admin-gebruiker onthoudt, want in de toekomst zullen we met deze gebruiker inloggen. Bijvoorbeeld:
gebruikersnaam:John, e-mail:[email protected], wachtwoord:johndoe.
Onderwerpen maken, lezen, bijwerken en verwijderen
Voor onderwerpen gaan we slechts één bestand maken, topics.php in de complete-blog-php/admin/ map.
complete-blog-php/admin/topics.php:
<?php include('../config.php'); ?>
<?php include(ROOT_PATH . '/admin/includes/admin_functions.php'); ?>
<?php include(ROOT_PATH . '/admin/includes/head_section.php'); ?>
<!-- Get all topics from DB -->
<?php $topics = getAllTopics(); ?>
<title>Admin | Manage Topics</title>
</head>
<body>
<!-- admin navbar -->
<?php include(ROOT_PATH . '/admin/includes/navbar.php') ?>
<div class="container content">
<!-- Left side menu -->
<?php include(ROOT_PATH . '/admin/includes/menu.php') ?>
<!-- Middle form - to create and edit -->
<div class="action">
<h1 class="page-title">Create/Edit Topics</h1>
<form method="post" action="<?php echo BASE_URL . 'admin/topics.php'; ?>" >
<!-- validation errors for the form -->
<?php include(ROOT_PATH . '/includes/errors.php') ?>
<!-- if editing topic, the id is required to identify that topic -->
<?php if ($isEditingTopic === true): ?>
<input type="hidden" name="topic_id" value="<?php echo $topic_id; ?>">
<?php endif ?>
<input type="text" name="topic_name" value="<?php echo $topic_name; ?>" placeholder="Topic">
<!-- if editing topic, display the update button instead of create button -->
<?php if ($isEditingTopic === true): ?>
<button type="submit" class="btn" name="update_topic">UPDATE</button>
<?php else: ?>
<button type="submit" class="btn" name="create_topic">Save Topic</button>
<?php endif ?>
</form>
</div>
<!-- // Middle form - to create and edit -->
<!-- Display records from DB-->
<div class="table-div">
<!-- Display notification message -->
<?php include(ROOT_PATH . '/includes/messages.php') ?>
<?php if (empty($topics)): ?>
<h1>No topics in the database.</h1>
<?php else: ?>
<table class="table">
<thead>
<th>N</th>
<th>Topic Name</th>
<th colspan="2">Action</th>
</thead>
<tbody>
<?php foreach ($topics as $key => $topic): ?>
<tr>
<td><?php echo $key + 1; ?></td>
<td><?php echo $topic['name']; ?></td>
<td>
<a class="fa fa-pencil btn edit"
href="topics.php?edit-topic=<?php echo $topic['id'] ?>">
</a>
</td>
<td>
<a class="fa fa-trash btn delete"
href="topics.php?delete-topic=<?php echo $topic['id'] ?>">
</a>
</td>
</tr>
<?php endforeach ?>
</tbody>
</table>
<?php endif ?>
</div>
<!-- // Display records from DB -->
</div>
</body>
</html>
Vervolgens schrijven we de PHP-code naar binnen admin_functions.php om deze bewerkingen op het onderwerp uit te voeren.
De volgende code heeft drie secties. Elke sectie is bovenaan gelabeld met een opmerking en de drie zijn variabelen, acties en functies. Dus voeg in je admin_functions.php-bestand de volgende code toe, maar zorg ervoor dat je het dienovereenkomstig splitst zoals hieronder aangegeven met behulp van de opmerkingen.
admin_functions.php:
<?php
// Admin user variables
// ... varaibles here ...
// Topics variables
$topic_id = 0;
$isEditingTopic = false;
$topic_name = "";
/* - - - - - - - - - -
- Admin users actions
- - - - - - - - - - -*/
// ...
/* - - - - - - - - - -
- Topic actions
- - - - - - - - - - -*/
// if user clicks the create topic button
if (isset($_POST['create_topic'])) { createTopic($_POST); }
// if user clicks the Edit topic button
if (isset($_GET['edit-topic'])) {
$isEditingTopic = true;
$topic_id = $_GET['edit-topic'];
editTopic($topic_id);
}
// if user clicks the update topic button
if (isset($_POST['update_topic'])) {
updateTopic($_POST);
}
// if user clicks the Delete topic button
if (isset($_GET['delete-topic'])) {
$topic_id = $_GET['delete-topic'];
deleteTopic($topic_id);
}
/* - - - - - - - - - - - -
- Admin users functions
- - - - - - - - - - - - -*/
// ...
/* - - - - - - - - - -
- Topics functions
- - - - - - - - - - -*/
// get all topics from DB
function getAllTopics() {
global $conn;
$sql = "SELECT * FROM topics";
$result = mysqli_query($conn, $sql);
$topics = mysqli_fetch_all($result, MYSQLI_ASSOC);
return $topics;
}
function createTopic($request_values){
global $conn, $errors, $topic_name;
$topic_name = esc($request_values['topic_name']);
// create slug: if topic is "Life Advice", return "life-advice" as slug
$topic_slug = makeSlug($topic_name);
// validate form
if (empty($topic_name)) {
array_push($errors, "Topic name required");
}
// Ensure that no topic is saved twice.
$topic_check_query = "SELECT * FROM topics WHERE slug='$topic_slug' LIMIT 1";
$result = mysqli_query($conn, $topic_check_query);
if (mysqli_num_rows($result) > 0) { // if topic exists
array_push($errors, "Topic already exists");
}
// register topic if there are no errors in the form
if (count($errors) == 0) {
$query = "INSERT INTO topics (name, slug)
VALUES('$topic_name', '$topic_slug')";
mysqli_query($conn, $query);
$_SESSION['message'] = "Topic created successfully";
header('location: topics.php');
exit(0);
}
}
/* * * * * * * * * * * * * * * * * * * * *
* - Takes topic id as parameter
* - Fetches the topic from database
* - sets topic fields on form for editing
* * * * * * * * * * * * * * * * * * * * * */
function editTopic($topic_id) {
global $conn, $topic_name, $isEditingTopic, $topic_id;
$sql = "SELECT * FROM topics WHERE id=$topic_id LIMIT 1";
$result = mysqli_query($conn, $sql);
$topic = mysqli_fetch_assoc($result);
// set form values ($topic_name) on the form to be updated
$topic_name = $topic['name'];
}
function updateTopic($request_values) {
global $conn, $errors, $topic_name, $topic_id;
$topic_name = esc($request_values['topic_name']);
$topic_id = esc($request_values['topic_id']);
// create slug: if topic is "Life Advice", return "life-advice" as slug
$topic_slug = makeSlug($topic_name);
// validate form
if (empty($topic_name)) {
array_push($errors, "Topic name required");
}
// register topic if there are no errors in the form
if (count($errors) == 0) {
$query = "UPDATE topics SET name='$topic_name', slug='$topic_slug' WHERE id=$topic_id";
mysqli_query($conn, $query);
$_SESSION['message'] = "Topic updated successfully";
header('location: topics.php');
exit(0);
}
}
// delete topic
function deleteTopic($topic_id) {
global $conn;
$sql = "DELETE FROM topics WHERE id=$topic_id";
if (mysqli_query($conn, $sql)) {
$_SESSION['message'] = "Topic successfully deleted";
header("location: topics.php");
exit(0);
}
}
Hiermee kunnen we onderwerpen aanmaken, lezen, bijwerken en verwijderen.
Dank voor uw geduld. In het volgende deel voegen we een formulier toe voor het maken van berichten. We gebruiken ckeditor om een gebruiker de mogelijkheid te geven om opmaak toe te voegen aan teksten, afbeeldingen en lijsten.
Zie je daar!