sql >> データベース >  >> RDS >> Mysql

PHPおよびMySQLデータベースでブログを作成する方法-バックエンド

    これは、PHPとMySQLを使用してブログを作成する方法に関する4部構成のシリーズのパート3です。ここで前の2つのパートを見ることができます:パート1、パート2。

    このチュートリアルの最後の2つの部分では、パブリックエリアの作成を終了しました。データベースを設定し、データベーステーブルにデータを挿入して、これをクエリしてページに表示することもできました。しかし、PHPMyAdminのようなデータベースクライアントを使用して、ユーザー、投稿、トピックを常に作成したいとは限りません。これを行うには、Webサイトのインターフェイスと、管理者権限を持つログインユーザーが必要です。

    管理者権限を持つユーザーがログインすると、管理者ダッシュボードに自動的にリダイレクトされます。ただし、システムにはまだ管理者ユーザーを作成していません。すぐにそれを行います。

    complete-blog-php / adminフォルダーに、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> &nbsp; &nbsp; 
    				<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>
    

    ブラウザでhttp://localhost/complete-blog-php/admin/dashboard.phpにアクセスすると、スタイルが設定されておらず、2つのファイルを含めることができないというエラーメッセージが表示されます。これは、これらのファイルをまだ作成していないためです。すぐに行います。

    管理フォルダ内にincludesという名前のフォルダを作成します。

    管理領域用に個別のincludesフォルダーを作成した理由は、すべての管理ファイルが1つのフォルダー(admin)にあることを確認するためです。後で、htaccess認証を使用してadminフォルダーのセキュリティを強化できます。ただし、このチュートリアルではこれを行いません。

    この新しく作成されたincludesフォルダーに、head_section.phpという名前のファイルを作成します。 head_section.phpを開き、次のコードを追加します:

    <!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">
    

    ブラウザにdashboard.phpページをリロードします。現在残っているエラーメッセージは、1つのファイル(admin_functions.php)に関するものです。すぐにそれになります。

    バックエンドに入ると、ユーザーはユーザー、投稿、トピックを作成、読み取り、更新、削除できます。ユーザーから始めましょう。 adminフォルダーに、users.php

    という名前のファイルを作成します。

    次に、users.phpを開き、次のコードを追加します。

    users.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']; ?>, &nbsp;
    								<?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>
    

    これが、users.phpファイルで行う必要があるすべてです。ユーザーの作成、編集、削除はこの1つのファイルで行われます。

    users.phpファイルの先頭で、データベースからすべての管理者ユーザーの配列を返す関数getAdminUsers()を呼び出しています。この関数は、まだ作成していないadmin_functions.phpファイル内で定義されますが、関数呼び出しの直前にusers.phpファイルに含まれていることがわかります。

    adminフォルダーに、admin_functions.phpを作成し、次のコードを追加します。

    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;
    }
    ?>

    ブラウザにdashboard.phpページをリロードすると、エラーメッセージが表示されなくなります。

    次に、navbar.phpページとmenu.phpページを含めます。これらは、パブリックエリアの場合と同じように、管理ページの繰り返しセグメントです。

    したがって、admin/includesフォルダ内にnavbar.phpとmenu.phpの2つのファイルを作成します。

    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> &nbsp; &nbsp; <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>

    次に、管理セクションのスタイルを作成しましょう。 complete-blog-php / static / css /フォルダー内に、admin_styling.cssという名前のファイルを作成し、次のコードを追加します。

    /* * * * * * * * * *
    * 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;}
    

    ブラウザでhttp://localhost/complete-blog-php/admin/users.phpにアクセスすると、ファイルmessages.phpが見つからないというエラーが表示されます。 complete-blog-ph / includeフォルダーにmessages.phpという名前のファイルを作成し、その中に次のコードを追加します。

    <?php if (isset($_SESSION['message'])) : ?>
          <div class="message" >
          	<p>
              <?php 
              	echo $_SESSION['message']; 
              	unset($_SESSION['message']);
              ?>
          	</p>
          </div>
    <?php endif ?>

    これにより、通知メッセージが表示され、ユーザーのアクションに関するフィードバックが提供されます。

    管理者ユーザーの作成、読み取り、更新、削除

    users.phpページには、管理者ユーザーの作成と更新の両方のフォームと、ユーザーの一覧表示と削除のテーブルが既に表示されています。残っているのは、これらのアクションを実行するPHP関数を追加することだけです。したがって、admin_functions.phpファイルを開き、ページ上部のAdminユーザーアクション(ifステートメント)の直後、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);
    	}
    }

    追加したコードには、管理者ユーザー変数の初期化、管理者ユーザーアクション、管理者ユーザー関数の3つの主要部分がこの順序で含まれています。これは、次に来るトピックのコードを追加するのと同じ形式です。今のところ、ユーザーの作成、読み取り、更新、削除はすでに可能です。

    次に、http://localhost/complete/admin/users.phpにアクセスします。ユーザーを作成し、そのユーザーに管理者ロールを割り当てます。今後、このユーザーでログインするため、この管理者ユーザーのユーザー名とパスワードを忘れないでください。例:

    ユーザー名:John、メール:[email protected]、パスワード:johndoe。

    トピックの作成、読み取り、更新、削除

    トピックについては、complete-blog-php /admin/フォルダー内にtopics.phpという1つのファイルのみを作成します。

    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>

    次に、PHPコードをadmin_functions.php内に記述して、トピックに対してこれらの操作を実行します。

    次のコードには3つのセクションがあります。各セクションはコメントを使用して上部にラベルが付けられており、3つは変数、アクション、および関数です。したがって、admin_functions.phpファイルに次のコードを追加しますが、コメントを使用して以下に示すように、それに応じて分割してください。

    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);
    	}
    }

    これにより、トピックを作成、読み取り、更新、削除できます。

    お待ち頂きまして、ありがとうございます。次のパートでは、投稿を作成するためのフォームを追加します。 ckeditorを使用して、ユーザーがテキスト、画像、リストにスタイルを追加できるようにします。

    またね!


    1. SQL Server Express Editionでストアドプロシージャを毎日実行するにはどうすればよいですか?

    2. MariaDBでのMONTHNAME()のしくみ

    3. 数十億行に最適なデータストア

    4. Hibernateを使用してPostgreSQL配列をマップする方法