Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP और MySQL डेटाबेस में ब्लॉग कैसे बनाये - Admin Posts

PHP और MySQL डेटाबेस के साथ ब्लॉग कैसे बनाएं पर 4-भाग श्रृंखला का यह चौथा और अंतिम भाग है। आप अन्य भाग यहाँ देख सकते हैं: भाग 1, भाग 2, और भाग 3।

अब तक हमने एक सार्वजनिक क्षेत्र बनाया है जो एक MySQL डेटाबेस पोस्ट तालिका से प्रकाशित पोस्ट सूचीबद्ध करता है। हमने एक उपयोगकर्ता पंजीकरण प्रणाली भी पूरी की है जो व्यवस्थापक उपयोगकर्ताओं और सामान्य उपयोगकर्ताओं दोनों के लिए लॉगिन संभालती है। बैकएंड में, लॉग इन व्यवस्थापक उपयोगकर्ता अब अन्य व्यवस्थापक उपयोगकर्ताओं के साथ-साथ विषय भी बना सकता है।

इस खंड में, हम ब्लॉग पोस्ट पर काम करेंगे। हम एक नया ब्लॉग पोस्ट बनाने के लिए एक फ़ॉर्म के साथ लॉग इन व्यवस्थापक उपयोगकर्ताओं (या लेखकों) को प्रदान करने वाला एक पृष्ठ बनाएंगे।

हम दो फ़ाइलें बनाएंगे:व्यवस्थापक फ़ोल्डर के अंदर पोस्ट.php फ़ाइल, और व्यवस्थापक के अंदर post_functions.php/फ़ोल्डर शामिल है। post.php फ़ाइल डेटाबेस से प्राप्त सभी पोस्ट को तालिका प्रारूप में सूचीबद्ध करती है जबकि post_functions.php में ऐसे कार्य होते हैं जो डेटाबेस से क्वेरी करने और उन्हें पोस्ट पर वापस करने जैसे कार्यों पर कार्य करते हैं। php फ़ाइल।

इस कोड को अपनी पोस्ट.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 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>

शीर्ष खंड में, हम नव निर्मित post_functions.php फ़ाइल शामिल करते हैं। आइए इसे अभी खोलें और डेटाबेस से पोस्ट पुनर्प्राप्त करने वाला कोड जोड़ें।

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

अब http://localhost/complete-blog-php/login.php पर जाएं और पिछले ट्यूटोरियल में आपके द्वारा बनाए गए यूज़रनेम और पासवर्ड से लॉग इन करें। यदि आप लॉग इन नहीं करते हैं तो आप त्रुटियों का सामना करने जा रहे हैं।

लॉग इन करने के बाद, http://localhost/complete-blog-php/admin/posts.php पर जाएं।

यदि सब कुछ ठीक रहा, तो आप देखेंगे कि पृष्ठ में 2 पोस्ट हैं (जिन्हें हमने पहले बनाया था) एक तालिका में प्रदर्शित हैं।

इस बिंदु पर, हम पोस्ट के लिए डेटाबेस को क्वेरी करने और उन्हें एक सारणीबद्ध प्रारूप में सूचीबद्ध करने में सक्षम हैं। आइए वास्तव में पोस्ट बनाने के लिए एक फॉर्म प्रदान करें। अपने व्यवस्थापक फ़ोल्डर के अंदर create_post.php फ़ाइल बनाएं और इस कोड को उसमें पेस्ट करें:

पूर्ण-ब्लॉग-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>

अक्सर एक ब्लॉग पोस्ट के लिए, आपको बोल्ड, इटैलिक, अंडरलाइन, हेडिंग, ऑर्डर की गई और अनियंत्रित सूचियों के साथ-साथ छवियों को अपलोड करने में कुछ टेक्स्ट लिखने की आवश्यकता होगी। ऐसा करने के लिए आपको इन सुविधाओं से भरपूर टेक्स्ट क्षेत्र प्रदान करने के लिए एक सीकेडिटर की आवश्यकता होगी। इसके लिए हमें ckeditor प्लगइन स्क्रिप्ट को शामिल करना होगा जो हमने पहले ही head_section.php फ़ाइल में किया था।

इस सीकेडिटर को टेक्स्ट क्षेत्र पर सक्रिय करने के लिए, 3 चीजें अवश्य की जानी चाहिए:

  1. हमें CKEditor स्रोत स्क्रिप्ट शामिल करनी चाहिए (जैसा कि हमने पहले ही head_section.php फ़ाइल में किया है)
  2. हमारे पास एक टेक्स्ट क्षेत्र होना चाहिए और उसे एक आईडी देना चाहिए (जैसे id="body", जैसा कि हमने इस मामले में किया था)
  3. अंत में, हमें इस स्क्रिप्ट के साथ टेक्स्ट क्षेत्र को इनिशियलाइज़ करना होगा (जैसा कि हमने create_post.php में किया था):
<script>
	CKEDITOR.replace('body');
</script>

ब्राउज़र में http://localhost/complete-blog-php/admin/create_post.php खोलें और आप रूपांतरित टेक्स्ट क्षेत्र देखेंगे।

हम पोस्ट बनाने और संपादित करने के लिए उसी फॉर्म का उपयोग करने जा रहे हैं। अब हमारे पास पोस्ट बनाने, संपादित करने, अपडेट करने और हटाने के लिए जिम्मेदार कार्यों को लिखना है। हम इसे post_functions.php में करते हैं। Post_functions.php खोलें और इन फंक्शन्स और if स्टेटमेंट्स को इसमें जोड़ें।

पूर्ण-ब्लॉग-php/admin/includes/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);
		}
	}

अब हम पोस्ट बनाने, पढ़ने, अपडेट करने और हटाने में सक्षम हैं।

एक आखिरी बात, आइए पोस्ट को प्रकाशित/अप्रकाशित करने के लिए कोड जोड़ें। उसी post_functions.php फ़ाइल में, यह कोड जोड़ें:

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

यह उपयोगकर्ता (व्यवस्थापक उपयोगकर्ता) को किसी पोस्ट को प्रकाशित/अप्रकाशित करने की अनुमति देता है। और यह हमें इस ट्यूटोरियल के अंत में लाता है।

निष्कर्ष

आपके धैर्य के लिए बहुत - बहुत धन्यवाद। यह जानकर मुझे बहुत संतुष्टि मिलती है कि किसी ने वास्तव में मेरे ट्यूटोरियल का बहुत अंत तक अनुसरण किया। मुझे आशा है कि आपने कुछ ऐसा सीखा जो आपके समय के लायक था। यदि आपके पास कोई टिप्पणी, चिंता, सुझाव है, तो कृपया उन्हें नीचे टिप्पणी अनुभाग में छोड़ दें। यदि आपके पास कहने के लिए कुछ नहीं है तो आप टिप्पणियों में केवल नमस्ते कह सकते हैं। मुझे बस यह जानने की जरूरत है कि आपने इसे इतना आगे बढ़ाया है क्योंकि इससे मुझे इस तरह के और अधिक ट्यूटोरियल करने के लिए प्रोत्साहित किया जाता है।

याद रखें कि आप हमेशा अपने दोस्तों के साथ साझा करके बहुत मदद कर सकते हैं।

अपने शेष दिन का आनंद लें।


  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 में महीने के हिसाब से प्रतिशत ग्रोथ मंथ की गणना कैसे करें

  2. MySQL में DATETIME फ़ील्ड से केवल दिनांक का चयन कैसे करें?

  3. वास्तविक MySQL क्वेरी समय मापना

  4. MySQL क्वेरी, MAX () + ग्रुप बाय

  5. यदि मौजूद नहीं है तो MySql तालिका सम्मिलित करें अन्यथा अद्यतन करें