ChatGPT said:
You want a classified post script with features such as pagination, categories, location selection, and user management (signup, login, dashboard). It also needs an admin panel for managing posts and users. Below is a PHP script outline to guide you through the process, utilizing PDO (PHP Data Objects) for secure database interactions and implementing URL rewriting for better SEO.
1. Database Design
Here’s a basic schema for the database tables you'll need:
sql
CopyEdit
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL ); CREATE TABLE locations (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL ); CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT NOT NULL,
price DECIMAL(10, 2),
category_id INT,
location_id INT,
user_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (category_id) REFERENCES categories(id), FOREIGN KEY (location_id) REFERENCES locations(id), FOREIGN KEY (user_id) REFERENCES users(id)
);
2. Configuration (config.php)
php
CopyEdit
<?php $host = 'localhost'; $dbname = 'classified_db'; $username = 'root'; $password = ''; try { $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) { echo "Connection failed: " . $e->getMessage();
} ?>
3. URL Rewriting (htaccess)
apacheCopyEditRewriteEngine On RewriteBase / # Redirect for post URL RewriteRule ^post/([0-9]+)/([a-zA-Z0-9_-]+)$ post.php?id=$1&title=$2 [QSA,L] # Make URLs for categories and locations SEO-friendly RewriteRule ^category/([a-zA-Z0-9_-]+)$ category.php?name=$1 [QSA,L] RewriteRule ^location/([a-zA-Z0-9_-]+)$ location.php?name=$1 [QSA,L]
4. Frontend (HTML/PHP)
Post a Classified (post.php)
php
CopyEdit
<?php include 'config.php'; if ($_SERVER['REQUEST_METHOD'] == 'POST') { $title = $_POST['title']; $description = $_POST['description']; $category_id = $_POST['category']; $location_id = $_POST['location']; $price = $_POST['price']; $user_id = 1; // Fetch from session or login system $stmt = $pdo->prepare("INSERT INTO posts (title, description, price, category_id, location_id, user_id) VALUES (?, ?, ?, ?, ?, ?)"); $stmt->execute([$title, $description, $price, $category_id, $location_id, $user_id]); header('Location: index.php');
} ?> <form method="post">
<input type="text" name="title" placeholder="Title">
<textarea name="description" placeholder="Description"></textarea>
<input type="number" name="price" placeholder="Price">
<select name="category"> <?php $categories = $pdo->query("SELECT * FROM categories")->fetchAll(); foreach ($categories as $category) { echo "<option value='{$category['id']}'>{$category['name']}</option>";
} ?> </select>
<select name="location"> <?php $locations = $pdo->query("SELECT * FROM locations")->fetchAll(); foreach ($locations as $location) { echo "<option value='{$location['id']}'>{$location['name']}</option>";
} ?> </select>
<button type="submit">Post</button>
</form>
Listing & Pagination (index.php)
php
CopyEdit
<?php include 'config.php'; // Pagination variables $limit = 10; $page = isset($_GET['page']) ? $_GET['page'] : 1; $offset = ($page - 1) * $limit; // Fetch posts with pagination $stmt = $pdo->prepare("SELECT p.*, c.name AS category, l.name AS location FROM posts p
JOIN categories c ON p.category_id = c.id
JOIN locations l ON p.location_id = l.id LIMIT :limit OFFSET :offset"); $stmt->bindParam(':limit', $limit, PDO::PARAM_INT); $stmt->bindParam(':offset', $offset, PDO::PARAM_INT); $stmt->execute(); $posts = $stmt->fetchAll(); foreach ($posts as $post) { echo "<div><a href='post.php?id={$post['id']}&title=" . urlencode($post['title']) . "'>{$post['title']}</a> - {$post['category']} - {$post['location']}</div>";
} // Pagination $stmt = $pdo->query("SELECT COUNT(*) FROM posts"); $total = $stmt->fetchColumn(); $pages = ceil($total / $limit); for ($i = 1; $i <= $pages; $i++) { echo "<a href='index.php?page=$i'>$i</a> ";
} ?>
5. User Signup and Login
Signup (signup.php)
php
CopyEdit
<?php include 'config.php'; if ($_SERVER['REQUEST_METHOD'] == 'POST') { $username = $_POST['username']; $password = password_hash($_POST['password'], PASSWORD_BCRYPT); $email = $_POST['email']; $stmt = $pdo->prepare("INSERT INTO users (username, password, email) VALUES (?, ?, ?)"); $stmt->execute([$username, $password, $email]); header('Location: login.php');
} ?> <form method="post">
<input type="text" name="username" placeholder="Username" required>
<input type="email" name="email" placeholder="Email" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Signup</button>
</form>
Login (login.php)
php
CopyEdit
<?php session_start(); include 'config.php'; if ($_SERVER['REQUEST_METHOD'] == 'POST') { $username = $_POST['username']; $password = $_POST['password']; $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?"); $stmt->execute([$username]); $user = $stmt->fetch(); if ($user && password_verify($password, $user['password'])) { $_SESSION['user_id'] = $user['id']; header('Location: dashboard.php');
} else { echo "Invalid credentials!";
}
} ?> <form method="post">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Login</button>
</form>
6. Admin Panel (admin.php)
php
CopyEdit
<?php session_start(); include 'config.php'; if (!isset($_SESSION['user_id'])) { header('Location: login.php'); exit;
} // Only allow admin access $user_id = $_SESSION['user_id']; $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ? AND role = 'admin'"); $stmt->execute([$user_id]); $admin = $stmt->fetch(); if (!$admin) { echo "Access Denied"; exit;
} $posts = $pdo->query("SELECT * FROM posts")->fetchAll(); foreach ($posts as $post) { echo "<div>{$post['title']} - <a href='edit_post.php?id={$post['id']}'>Edit</a> | <a href='delete_post.php?id={$post['id']}'>Delete</a></div>";
} ?>
7. Delete Post (delete_post.php)
php
CopyEdit
<?php include 'config.php'; if (isset($_GET['id'])) { $post_id = $_GET['id']; $stmt = $pdo->prepare("DELETE FROM posts WHERE id = ?"); $stmt->execute([$post_id]); header('Location: admin.php');
} ?>
Key Features:
-
User Authentication: Signup, login, session handling.
-
Post Management: Posting, editing, deleting, and viewing posts with pagination.
-
Category & Location Filters: Post filtering and listing based on categories and locations.
-
Admin Panel: Managing posts and user data from the admin panel.
-
SEO URL Rewrite: Friendly URLs for posts, categories, and locations.
This script gives a strong foundation for your classified ad site. You'll need to expand and refine the user experience and admin features, such as adding more fields for post management, email verification, user roles, etc.
Let me know if you need help with any specific functionality or further improvements!
You said:
ChatGPT said:
To add the complete user authentication, post management (with posting, editing, deleting, and viewing posts), category and location filtering, an admin panel, and SEO-friendly URLs to your PHP script, I'll outline each feature with the necessary code. The goal is to have everything integrated in a clean, manageable way.
1. User Authentication
Signup (signup.php)
The signup script will allow users to register by providing their username, email, and password. The password will be hashed before being stored in the database.
php
CopyEdit
<?php include 'config.php'; if ($_SERVER['REQUEST_METHOD'] == 'POST') { $username = $_POST['username']; $password = password_hash($_POST['password'], PASSWORD_BCRYPT); $email = $_POST['email']; // Check if username or email exists $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? OR email = ?"); $stmt->execute([$username, $email]); if ($stmt->rowCount() > 0) { echo "Username or email already exists!";
} else { // Insert new user $stmt = $pdo->prepare("INSERT INTO users (username, password, email) VALUES (?, ?, ?)"); $stmt->execute([$username, $password, $email]); echo "Signup successful!"; header('Location: login.php');
}
} ?> <form method="post">
<input type="text" name="username" placeholder="Username" required>
<input type="email" name="email" placeholder="Email" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Signup</button>
</form>
Login (login.php)
The login script checks the username and password against the database, sets a session if the login is successful, and redirects to the dashboard.
php
CopyEdit
<?php session_start(); include 'config.php'; if ($_SERVER['REQUEST_METHOD'] == 'POST') { $username = $_POST['username']; $password = $_POST['password']; $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?"); $stmt->execute([$username]); $user = $stmt->fetch(); if ($user && password_verify($password, $user['password'])) { $_SESSION['user_id'] = $user['id']; header('Location: dashboard.php');
} else { echo "Invalid credentials!";
}
} ?> <form method="post">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Login</button>
</form>
Session Handling (session_start.php)
Always start a session on each page that requires user authentication.
php
CopyEdit
<?php session_start(); if (!isset($_SESSION['user_id'])) { header('Location: login.php'); exit;
} ?>
2. Post Management
Post Listing with Pagination (index.php)
php
CopyEdit
<?php include 'config.php'; // Pagination settings $limit = 10; $page = isset($_GET['page']) ? $_GET['page'] : 1; $offset = ($page - 1) * $limit; // Fetch posts with pagination and filtering by category and location $whereClauses = []; $params = []; if (isset($_GET['category'])) { $whereClauses[] = 'p.category_id = ?'; $params[] = $_GET['category'];
} if (isset($_GET['location'])) { $whereClauses[] = 'p.location_id = ?'; $params[] = $_GET['location'];
} $whereSql = count($whereClauses) ? 'WHERE ' . implode(' AND ', $whereClauses) : ''; $sql = "SELECT p.*, c.name AS category, l.name AS location FROM posts p
JOIN categories c ON p.category_id = c.id
JOIN locations l ON p.location_id = l.id $whereSql LIMIT ? OFFSET ?"; $params[] = $limit; $params[] = $offset; $stmt = $pdo->prepare($sql); $stmt->execute($params); $posts = $stmt->fetchAll(); // Display posts foreach ($posts as $post) { echo "<div><a href='post.php?id={$post['id']}&title=" . urlencode($post['title']) . "'>{$post['title']}</a> - {$post['category']} - {$post['location']}</div>";
} // Pagination $stmt = $pdo->query("SELECT COUNT(*) FROM posts"); $total = $stmt->fetchColumn(); $pages = ceil($total / $limit); for ($i = 1; $i <= $pages; $i++) { echo "<a href='index.php?page=$i'>$i</a> ";
} ?>
Post Creation (post_create.php)
php
CopyEdit
<?php include 'config.php'; session_start(); if ($_SERVER['REQUEST_METHOD'] == 'POST') { $title = $_POST['title']; $description = $_POST['description']; $price = $_POST['price']; $category_id = $_POST['category']; $location_id = $_POST['location']; $user_id = $_SESSION['user_id']; $stmt = $pdo->prepare("INSERT INTO posts (title, description, price, category_id, location_id, user_id)
VALUES (?, ?, ?, ?, ?, ?)"); $stmt->execute([$title, $description, $price, $category_id, $location_id, $user_id]); header('Location: index.php');
} ?> <form method="post">
<input type="text" name="title" placeholder="Title" required>
<textarea name="description" placeholder="Description" required></textarea>
<input type="number" name="price" placeholder="Price" required>
<select name="category"> <?php $categories = $pdo->query("SELECT * FROM categories")->fetchAll(); foreach ($categories as $category) { echo "<option value='{$category['id']}'>{$category['name']}</option>";
} ?> </select>
<select name="location"> <?php $locations = $pdo->query("SELECT * FROM locations")->fetchAll(); foreach ($locations as $location) { echo "<option value='{$location['id']}'>{$location['name']}</option>";
} ?> </select>
<button type="submit">Post</button>
</form>
Post Editing (post_edit.php)
php
CopyEdit
<?php include 'config.php'; session_start(); if (isset($_GET['id'])) { $post_id = $_GET['id']; // Fetch the post data for editing $stmt = $pdo->prepare("SELECT * FROM posts WHERE id = ? AND user_id = ?"); $stmt->execute([$post_id, $_SESSION['user_id']]); $post = $stmt->fetch(); if (!$post) { echo "You are not authorized to edit this post."; exit;
} if ($_SERVER['REQUEST_METHOD'] == 'POST') { $title = $_POST['title']; $description = $_POST['description']; $price = $_POST['price']; $category_id = $_POST['category']; $location_id = $_POST['location']; $stmt = $pdo->prepare("UPDATE posts SET title = ?, description = ?, price = ?, category_id = ?, location_id = ? WHERE id = ?"); $stmt->
Guru Sadhana News Update
Quick Links
Cookie Preferences
We use cookies to enhance your browsing experience, serve personalized content, and analyze our traffic. Please select your preferences below.