Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách tạo blog trong cơ sở dữ liệu PHP và MySQL - Bài đăng của quản trị viên

Đây là phần thứ 4 và là phần cuối cùng của loạt bài gồm 4 phần về Cách xây dựng blog với cơ sở dữ liệu PHP và MySQL. Bạn có thể xem các phần khác tại đây:phần 1, phần 2 và phần 3.

Cho đến nay, chúng tôi đã tạo một khu vực công cộng liệt kê các bài đăng đã xuất bản từ bảng các bài đăng trong cơ sở dữ liệu MySQL. Chúng tôi cũng đã hoàn thành hệ thống đăng ký người dùng xử lý đăng nhập cho cả người dùng quản trị và người dùng bình thường. Trong phần phụ trợ, người dùng quản trị viên đã đăng nhập hiện có thể tạo người dùng quản trị viên khác cũng như các chủ đề.

Trong phần này, chúng tôi sẽ làm việc với các bài đăng trên blog. Chúng tôi sẽ tạo một trang cung cấp cho người dùng quản trị viên đã đăng nhập (hoặc tác giả) một biểu mẫu để tạo một bài đăng blog mới.

Chúng ta sẽ tạo hai tệp:tệp posts.php bên trong thư mục quản trị, và tệp post_functions.php bên trong thư mục admin / include. Tệp posts.php liệt kê tất cả các bài đăng nhận được từ cơ sở dữ liệu ở định dạng bảng trong khi post_functions.php chứa các hàm thực hiện các thao tác trên bài đăng, chẳng hạn như truy vấn chúng từ cơ sở dữ liệu và trả chúng về tệp posts.php.

Đặt mã này vào tệp posts.php của bạn:

<?php  include('../config.php'); ?>
<?php  include(ROOT_PATH . '/admin/includes/admin_functions.php'); ?>
<?php  include(ROOT_PATH . '/admin/includes/post_functions.php'); ?>
<?php include(ROOT_PATH . '/admin/includes/head_section.php'); ?>

<!-- Get all admin posts from DB -->
<?php $posts = getAllPosts(); ?>
	<title>Admin | Manage Posts</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') ?>

		<!-- Display records from DB-->
		<div class="table-div"  style="width: 80%;">
			<!-- Display notification message -->
			<?php include(ROOT_PATH . '/includes/messages.php') ?>

			<?php if (empty($posts)): ?>
				<h1 style="text-align: center; margin-top: 20px;">No posts in the database.</h1>
			<?php else: ?>
				<table class="table">
						<thead>
						<th>N</th>
						<th>Title</th>
						<th>Author</th>
						<th>Views</th>
						<!-- Only Admin can publish/unpublish post -->
						<?php if ($_SESSION['user']['role'] == "Admin"): ?>
							<th><small>Publish</small></th>
						<?php endif ?>
						<th><small>Edit</small></th>
						<th><small>Delete</small></th>
					</thead>
					<tbody>
					<?php foreach ($posts as $key => $post): ?>
						<tr>
							<td><?php echo $key + 1; ?></td>
							<td><?php echo $post['author']; ?></td>
							<td>
								<a 	target="_blank"
								href="<?php echo BASE_URL . 'single_post.php?post-slug=' . $post['slug'] ?>">
									<?php echo $post['title']; ?>	
								</a>
							</td>
							<td><?php echo $post['views']; ?></td>
							
							<!-- Only Admin can publish/unpublish post -->
							<?php if ($_SESSION['user']['role'] == "Admin" ): ?>
								<td>
								<?php if ($post['published'] == true): ?>
									<a class="fa fa-check btn unpublish"
										href="posts.php?unpublish=<?php echo $post['id'] ?>">
									</a>
								<?php else: ?>
									<a class="fa fa-times btn publish"
										href="posts.php?publish=<?php echo $post['id'] ?>">
									</a>
								<?php endif ?>
								</td>
							<?php endif ?>

							<td>
								<a class="fa fa-pencil btn edit"
									href="create_post.php?edit-post=<?php echo $post['id'] ?>">
								</a>
							</td>
							<td>
								<a  class="fa fa-trash btn delete" 
									href="create_post.php?delete-post=<?php echo $post['id'] ?>">
								</a>
							</td>
						</tr>
					<?php endforeach ?>
					</tbody>
				</table>
			<?php endif ?>
		</div>
		<!-- // Display records from DB -->
	</div>
</body>
</html>

Ở phần trên cùng, chúng tôi bao gồm tệp post_functions.php mới được tạo. Hãy mở nó ngay bây giờ và thêm mã truy xuất các bài đăng từ cơ sở dữ liệu.

post_functions.php:

<?php 
// Post variables
$post_id = 0;
$isEditingPost = false;
$published = 0;
$title = "";
$post_slug = "";
$body = "";
$featured_image = "";
$post_topic = "";

/* - - - - - - - - - - 
-  Post functions
- - - - - - - - - - -*/
// get all posts from DB
function getAllPosts()
{
	global $conn;
	
	// Admin can view all posts
	// Author can only view their posts
	if ($_SESSION['user']['role'] == "Admin") {
		$sql = "SELECT * FROM posts";
	} elseif ($_SESSION['user']['role'] == "Author") {
		$user_id = $_SESSION['user']['id'];
		$sql = "SELECT * FROM posts WHERE user_id=$user_id";
	}
	$result = mysqli_query($conn, $sql);
	$posts = mysqli_fetch_all($result, MYSQLI_ASSOC);

	$final_posts = array();
	foreach ($posts as $post) {
		$post['author'] = getPostAuthorById($post['user_id']);
		array_push($final_posts, $post);
	}
	return $final_posts;
}
// get the author/username of a post
function getPostAuthorById($user_id)
{
	global $conn;
	$sql = "SELECT username FROM users WHERE id=$user_id";
	$result = mysqli_query($conn, $sql);
	if ($result) {
		// return username
		return mysqli_fetch_assoc($result)['username'];
	} else {
		return null;
	}
}
?>

Bây giờ, hãy truy cập http://localhost/complete-blog-php/login.php và đăng nhập bằng tên người dùng và mật khẩu bạn đã tạo trong hướng dẫn cuối cùng. Nếu bạn không đăng nhập, bạn sẽ gặp phải lỗi.

Sau khi đăng nhập, hãy truy cập http://localhost/complete-blog-php/admin/posts.php.

Nếu mọi việc suôn sẻ, bạn sẽ thấy rằng trang có 2 bài đăng (những bài chúng tôi đã tạo trước đó) được hiển thị trong một bảng.

Tại thời điểm này, chúng tôi có thể truy vấn cơ sở dữ liệu cho các bài đăng và liệt kê chúng ở định dạng bảng. Hãy cung cấp một biểu mẫu để thực sự tạo các bài đăng. Tạo tệp create_post.php bên trong thư mục quản trị của bạn và dán mã này vào đó:

complete-blog-php / admin / create_post.php:

<?php  include('../config.php'); ?>
<?php  include(ROOT_PATH . '/admin/includes/admin_functions.php'); ?>
<?php  include(ROOT_PATH . '/admin/includes/post_functions.php'); ?>
<?php include(ROOT_PATH . '/admin/includes/head_section.php'); ?>
<!-- Get all topics -->
<?php $topics = getAllTopics();	?>
	<title>Admin | Create Post</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 create-post-div">
			<h1 class="page-title">Create/Edit Post</h1>
			<form method="post" enctype="multipart/form-data" action="<?php echo BASE_URL . 'admin/create_post.php'; ?>" >
				<!-- validation errors for the form -->
				<?php include(ROOT_PATH . '/includes/errors.php') ?>

				<!-- if editing post, the id is required to identify that post -->
				<?php if ($isEditingPost === true): ?>
					<input type="hidden" name="post_id" value="<?php echo $post_id; ?>">
				<?php endif ?>

				<input type="text" name="title" value="<?php echo $title; ?>" placeholder="Title">
				<label style="float: left; margin: 5px auto 5px;">Featured image</label>
				<input type="file" name="featured_image" >
				<textarea name="body" id="body" cols="30" rows="10"><?php echo $body; ?></textarea>
				<select name="topic_id">
					<option value="" selected disabled>Choose topic</option>
					<?php foreach ($topics as $topic): ?>
						<option value="<?php echo $topic['id']; ?>">
							<?php echo $topic['name']; ?>
						</option>
					<?php endforeach ?>
				</select>
				
				<!-- Only admin users can view publish input field -->
				<?php if ($_SESSION['user']['role'] == "Admin"): ?>
					<!-- display checkbox according to whether post has been published or not -->
					<?php if ($published == true): ?>
						<label for="publish">
							Publish
							<input type="checkbox" value="1" name="publish" checked="checked">&nbsp;
						</label>
					<?php else: ?>
						<label for="publish">
							Publish
							<input type="checkbox" value="1" name="publish">&nbsp;
						</label>
					<?php endif ?>
				<?php endif ?>
				
				<!-- if editing post, display the update button instead of create button -->
				<?php if ($isEditingPost === true): ?> 
					<button type="submit" class="btn" name="update_post">UPDATE</button>
				<?php else: ?>
					<button type="submit" class="btn" name="create_post">Save Post</button>
				<?php endif ?>

			</form>
		</div>
		<!-- // Middle form - to create and edit -->
	</div>
</body>
</html>

<script>
	CKEDITOR.replace('body');
</script>

Thông thường đối với một bài đăng trên blog, bạn sẽ cần viết một số văn bản ở dạng Bold, Italics, Underline, Headings, danh sách có thứ tự và không có thứ tự cũng như tải lên hình ảnh. Để làm được điều này, bạn sẽ cần một ckeditor cung cấp cho bạn một kho văn bản giàu các tính năng này. Điều này yêu cầu chúng tôi bao gồm tập lệnh plugin ckeditor mà chúng tôi đã thực hiện trong tệp head_section.php.

Để kích hoạt ckeditor này trên một textarea, bạn phải thực hiện 3 điều sau:

  1. Chúng tôi phải bao gồm tập lệnh nguồn CKEditor (như chúng tôi đã làm trong tệp head_section.php)
  2. Chúng ta phải có một vùng văn bản và cung cấp cho nó một id (giả sử id ="body", như chúng ta đã làm trong trường hợp này)
  3. Cuối cùng, chúng ta phải khởi tạo textarea bằng tập lệnh này (như chúng ta đã làm trong create_post.php):
<script>
	CKEDITOR.replace('body');
</script>

Mở http://localhost/complete-blog-php/admin/create_post.php trong trình duyệt và bạn sẽ thấy vùng văn bản được biến đổi.

Chúng tôi sẽ sử dụng cùng một biểu mẫu để tạo và chỉnh sửa bài đăng. Việc còn lại bây giờ là chúng ta viết các hàm chịu trách nhiệm tạo, chỉnh sửa, cập nhật và xóa bài viết. Chúng tôi làm điều đó trong post_functions.php. Mở post_functions.php và thêm các hàm này và câu lệnh if vào nó.

perfect-blog-php / admin / include / post_functions.php:

/* - - - - - - - - - - 
-  Post actions
- - - - - - - - - - -*/
// if user clicks the create post button
if (isset($_POST['create_post'])) { createPost($_POST); }
// if user clicks the Edit post button
if (isset($_GET['edit-post'])) {
	$isEditingPost = true;
	$post_id = $_GET['edit-post'];
	editPost($post_id);
}
// if user clicks the update post button
if (isset($_POST['update_post'])) {
	updatePost($_POST);
}
// if user clicks the Delete post button
if (isset($_GET['delete-post'])) {
	$post_id = $_GET['delete-post'];
	deletePost($post_id);
}

/* - - - - - - - - - - 
-  Post functions
- - - - - - - - - - -*/
function createPost($request_values)
	{
		global $conn, $errors, $title, $featured_image, $topic_id, $body, $published;
		$title = esc($request_values['title']);
		$body = htmlentities(esc($request_values['body']));
		if (isset($request_values['topic_id'])) {
			$topic_id = esc($request_values['topic_id']);
		}
		if (isset($request_values['publish'])) {
			$published = esc($request_values['publish']);
		}
		// create slug: if title is "The Storm Is Over", return "the-storm-is-over" as slug
		$post_slug = makeSlug($title);
		// validate form
		if (empty($title)) { array_push($errors, "Post title is required"); }
		if (empty($body)) { array_push($errors, "Post body is required"); }
		if (empty($topic_id)) { array_push($errors, "Post topic is required"); }
		// Get image name
	  	$featured_image = $_FILES['featured_image']['name'];
	  	if (empty($featured_image)) { array_push($errors, "Featured image is required"); }
	  	// image file directory
	  	$target = "../static/images/" . basename($featured_image);
	  	if (!move_uploaded_file($_FILES['featured_image']['tmp_name'], $target)) {
	  		array_push($errors, "Failed to upload image. Please check file settings for your server");
	  	}
		// Ensure that no post is saved twice. 
		$post_check_query = "SELECT * FROM posts WHERE slug='$post_slug' LIMIT 1";
		$result = mysqli_query($conn, $post_check_query);

		if (mysqli_num_rows($result) > 0) { // if post exists
			array_push($errors, "A post already exists with that title.");
		}
		// create post if there are no errors in the form
		if (count($errors) == 0) {
			$query = "INSERT INTO posts (user_id, title, slug, image, body, published, created_at, updated_at) VALUES(1, '$title', '$post_slug', '$featured_image', '$body', $published, now(), now())";
			if(mysqli_query($conn, $query)){ // if post created successfully
				$inserted_post_id = mysqli_insert_id($conn);
				// create relationship between post and topic
				$sql = "INSERT INTO post_topic (post_id, topic_id) VALUES($inserted_post_id, $topic_id)";
				mysqli_query($conn, $sql);

				$_SESSION['message'] = "Post created successfully";
				header('location: posts.php');
				exit(0);
			}
		}
	}

	/* * * * * * * * * * * * * * * * * * * * *
	* - Takes post id as parameter
	* - Fetches the post from database
	* - sets post fields on form for editing
	* * * * * * * * * * * * * * * * * * * * * */
	function editPost($role_id)
	{
		global $conn, $title, $post_slug, $body, $published, $isEditingPost, $post_id;
		$sql = "SELECT * FROM posts WHERE id=$role_id LIMIT 1";
		$result = mysqli_query($conn, $sql);
		$post = mysqli_fetch_assoc($result);
		// set form values on the form to be updated
		$title = $post['title'];
		$body = $post['body'];
		$published = $post['published'];
	}

	function updatePost($request_values)
	{
		global $conn, $errors, $post_id, $title, $featured_image, $topic_id, $body, $published;

		$title = esc($request_values['title']);
		$body = esc($request_values['body']);
		$post_id = esc($request_values['post_id']);
		if (isset($request_values['topic_id'])) {
			$topic_id = esc($request_values['topic_id']);
		}
		// create slug: if title is "The Storm Is Over", return "the-storm-is-over" as slug
		$post_slug = makeSlug($title);

		if (empty($title)) { array_push($errors, "Post title is required"); }
		if (empty($body)) { array_push($errors, "Post body is required"); }
		// if new featured image has been provided
		if (isset($_POST['featured_image'])) {
			// Get image name
		  	$featured_image = $_FILES['featured_image']['name'];
		  	// image file directory
		  	$target = "../static/images/" . basename($featured_image);
		  	if (!move_uploaded_file($_FILES['featured_image']['tmp_name'], $target)) {
		  		array_push($errors, "Failed to upload image. Please check file settings for your server");
		  	}
		}

		// register topic if there are no errors in the form
		if (count($errors) == 0) {
			$query = "UPDATE posts SET title='$title', slug='$post_slug', views=0, image='$featured_image', body='$body', published=$published, updated_at=now() WHERE id=$post_id";
			// attach topic to post on post_topic table
			if(mysqli_query($conn, $query)){ // if post created successfully
				if (isset($topic_id)) {
					$inserted_post_id = mysqli_insert_id($conn);
					// create relationship between post and topic
					$sql = "INSERT INTO post_topic (post_id, topic_id) VALUES($inserted_post_id, $topic_id)";
					mysqli_query($conn, $sql);
					$_SESSION['message'] = "Post created successfully";
					header('location: posts.php');
					exit(0);
				}
			}
			$_SESSION['message'] = "Post updated successfully";
			header('location: posts.php');
			exit(0);
		}
	}
	// delete blog post
	function deletePost($post_id)
	{
		global $conn;
		$sql = "DELETE FROM posts WHERE id=$post_id";
		if (mysqli_query($conn, $sql)) {
			$_SESSION['message'] = "Post successfully deleted";
			header("location: posts.php");
			exit(0);
		}
	}

Giờ đây, chúng tôi có thể tạo, đọc, cập nhật và xóa các bài đăng.

Một điều cuối cùng, hãy thêm mã để xuất bản / hủy xuất bản bài đăng. Trong cùng một tệp post_functions.php, hãy thêm mã này:

// if user clicks the publish post button
if (isset($_GET['publish']) || isset($_GET['unpublish'])) {
	$message = "";
	if (isset($_GET['publish'])) {
		$message = "Post published successfully";
		$post_id = $_GET['publish'];
	} else if (isset($_GET['unpublish'])) {
		$message = "Post successfully unpublished";
		$post_id = $_GET['unpublish'];
	}
	togglePublishPost($post_id, $message);
}
// delete blog post
function togglePublishPost($post_id, $message)
{
	global $conn;
	$sql = "UPDATE posts SET published=!published WHERE id=$post_id";
	
	if (mysqli_query($conn, $sql)) {
		$_SESSION['message'] = $message;
		header("location: posts.php");
		exit(0);
	}
}

Điều này cho phép người dùng (Người dùng quản trị) xuất bản / hủy xuất bản một bài đăng. Và điều đó đưa chúng ta đến phần cuối của hướng dẫn này.

Kết luận

Cảm ơn bạn rất nhiều vì sự kiên nhẫn của bạn. Nó mang lại cho tôi sự hài lòng vô cùng khi biết rằng một người nào đó thực sự đã làm theo hướng dẫn của tôi đến phút cuối cùng. Tôi hy vọng bạn đã học được điều gì đó đáng giá thời gian của bạn. Nếu bạn có bất kỳ ý kiến, lo lắng, góp ý nào, hãy để lại trong phần bình luận bên dưới. Bạn thậm chí có thể chỉ cần chào trong phần bình luận nếu bạn không có gì để nói. Tôi chỉ cần biết rằng bạn đã tiến xa đến mức này vì điều đó khuyến khích tôi thực hiện nhiều hướng dẫn hơn như thế này.

Hãy nhớ rằng bạn luôn có thể giúp đỡ rất nhiều bằng cách chia sẻ với bạn bè của mình.

Hãy tận hưởng phần còn lại trong ngày của bạn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL có nên đặt múi giờ thành UTC không?

  2. Tạo người dùng MySQL trên Linux qua Dòng lệnh

  3. Dự phòng &Dự phòng trên Amazon RDS

  4. Cân bằng tải MySQL &MariaDB với ProxySQL

  5. Cách hiển thị hàng không có trong bảng khác trong MySQL