🐘 درس نهم: پروژه نهایی — ساخت سیستم مدیریت کاربران با PHP
🎯 هدف این درس: ساخت یک پروژه واقعی و یکپارچه برای مدیریت کاربران با استفاده از مفاهیمی که در درسهای گذشته یاد گرفتیم.
مهمان عزیز! 👋
به آخرین درس از سطح اول دوره جامع PHP خوش آمدی.
تا اینجا قدمبهقدم با مفاهیم اصلی PHP آشنا شدی؛ از نصب محیط توسعه و تعریف متغیرها گرفته تا عملگرها، شرطها، حلقهها، آرایهها، توابع و کار با فرمها.
حالا وقت آن رسیده که این مفاهیم را کنار هم قرار بدهیم و از آنها برای ساخت یک پروژه واقعی استفاده کنیم.
در این پروژه یک سیستم مدیریت کاربران میسازیم که بتواند اطلاعات کاربران را در پایگاه داده ذخیره کند، کاربران را نمایش دهد، اطلاعات آنها را ویرایش کند و امکان حذف کاربر را نیز در اختیار مدیر قرار دهد.
💡 نکته مهم مهمان:
هدف این پروژه فقط کپی کردن کدها نیست. سعی کن هر بخش را خودت بررسی کنی و بفهمی چرا آن را نوشتهایم. این همان نقطهای است که آموزش برنامهنویسی از حفظ کردن کدها جدا میشود.
🎯 در این پروژه چه چیزی میسازیم؟
پروژه نهایی ما یک سیستم ساده اما واقعی برای مدیریت اطلاعات کاربران است.
در نسخه آموزشی این پروژه، امکانات زیر را پیادهسازی میکنیم:
- ✅ اتصال PHP به MySQL
- ✅ ایجاد پایگاه داده
- ✅ ایجاد جدول کاربران
- ✅ ثبت کاربر جدید
- ✅ نمایش فهرست کاربران
- ✅ مشاهده اطلاعات یک کاربر
- ✅ ویرایش اطلاعات کاربر
- ✅ حذف کاربر
- ✅ اعتبارسنجی اطلاعات فرم
- ✅ جلوگیری از ورود اطلاعات خالی
- ✅ استفاده از Prepared Statement برای کوئریهای حساس
- ✅ نمایش پیام موفقیت و خطا
🧩 بخش ۱: ساختار پروژه
قبل از نوشتن کد، بهتر است ساختار پروژه را مشخص کنیم.
مرتب بودن فایلها از همان ابتدای کار باعث میشود در پروژههای بزرگتر کمتر دچار سردرگمی شویم.
user-management/
│
├── config/
│ └── database.php
│
├── index.php
├── create.php
├── edit.php
├── view.php
├── delete.php
└── style.css
در ادامه هر فایل را جداگانه ایجاد میکنیم و مسئولیت مشخصی برای آن در نظر میگیریم.
🗄️ بخش ۲: ساخت پایگاه داده
ابتدا باید پایگاه داده پروژه را ایجاد کنیم.
در XAMPP، Apache و MySQL را فعال کن و سپس وارد phpMyAdmin شو.
یک پایگاه داده با نام php_course ایجاد کن.
سپس جدول کاربران را با ساختار زیر بساز.
ساخت جدول کاربران
SQL
MySQL 8
CREATE DATABASE php_course
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE php_course;
CREATE TABLE users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL UNIQUE,
phone VARCHAR(20) DEFAULT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
⚠️ نکته:
استفاده از utf8mb4 باعث میشود پایگاه داده بتواند متن فارسی و بسیاری از کاراکترهای یونیکد را به شکل صحیح ذخیره کند.
🔌 بخش ۳: اتصال PHP به MySQL
حالا باید PHP را به پایگاه داده متصل کنیم.
برای این کار یک فایل به نام database.php داخل پوشه config ایجاد کن.
اتصال به پایگاه داده
PHP
v8.2
<?php
$host = "localhost";
$username = "root";
$password = "";
$database = "php_course";
$connection = new mysqli(
$host,
$username,
$password,
$database
);
if ($connection->connect_error) {
die("خطا در اتصال به پایگاه داده: " . $connection->connect_error);
}
$connection->set_charset("utf8mb4");
?>
💡 نکته مهمان:
در محیط واقعی، اطلاعات حساس اتصال به پایگاه داده نباید مستقیماً داخل فایلهای عمومی پروژه قرار بگیرند. در پروژههای حرفهایتر معمولاً از فایلهای تنظیمات امن یا متغیرهای محیطی استفاده میکنیم.
👥 بخش ۴: نمایش کاربران
حالا که اتصال آماده است، میتوانیم اطلاعات کاربران را از جدول users دریافت کنیم.
فایل index.php را ایجاد کن.
نمایش کاربران
PHP
v8.2
<?php
require_once "config/database.php";
$result = $connection->query("SELECT id, name, email, phone, created_at FROM users ORDER BY id DESC");
?>
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<meta charset="UTF-8">
<title>مدیریت کاربران</title>
</head>
<body>
<h1>مدیریت کاربران</h1>
<a href="create.php">➕ افزودن کاربر جدید</a>
<hr>
<table border="1" cellpadding="10" cellspacing="0">
<tr>
<th>شناسه</th>
<th>نام</th>
<th>ایمیل</th>
<th>تلفن</th>
<th>عملیات</th>
</tr>
<?php while ($user = $result->fetch_assoc()): ?>
<tr>
<td><?php echo $user['id']; ?></td>
<td>
<?php echo htmlspecialchars($user['name']); ?>
</td>
<td>
<?php echo htmlspecialchars($user['email']); ?>
</td>
<td>
<?php echo htmlspecialchars($user['phone'] ?? ''); ?>
</td>
<td>
<a href="view.php?id=<?php echo $user['id']; ?>">مشاهده</a>
|
<a href="edit.php?id=<?php echo $user['id']; ?>">ویرایش</a>
|
<a href="delete.php?id=<?php echo $user['id']; ?>">حذف</a>
</td>
</tr>
<?php endwhile; ?>
</table>
</body>
</html>
➕ بخش ۵: ثبت کاربر جدید
برای ثبت کاربر جدید، ابتدا یک فرم ایجاد میکنیم.
سپس اطلاعات ارسالشده را بررسی کرده و در صورت معتبر بودن در پایگاه داده ذخیره میکنیم.
ثبت کاربر جدید
PHP
v8.2
<?php
require_once "config/database.php";
$error = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$name = trim($_POST["name"] ?? "");
$email = trim($_POST["email"] ?? "");
$phone = trim($_POST["phone"] ?? "");
if ($name === "" || $email === "") {
$error = "نام و ایمیل الزامی هستند.";
} elseif !filter_var($email, FILTER_VALIDATE_EMAIL) {
$error = "فرمت ایمیل صحیح نیست.";
} else {
$stmt = $connection->prepare(
"INSERT INTO users (name, email, phone) VALUES (?, ?, ?)"
);
$stmt->bind_param("sss", $name, $email, $phone);
if ($stmt->execute()) {
header("Location: index.php");
exit;
}
$error = "ثبت کاربر انجام نشد.";
}
}
?>
<h1>افزودن کاربر</h1>
<?php if ($error !== ""): ?>
<p><?php echo htmlspecialchars($error); ?></p>
<?php endif; ?>
<form method="post">
<label>نام:</label>
<input type="text" name="name" required>
<br><br>
<label>ایمیل:</label>
<input type="email" name="email" required>
<br><br>
<label>تلفن:</label>
<input type="text" name="phone">
<br><br>
<button type="submit">ثبت کاربر</button>
</form>
✏️ بخش ۶: ویرایش کاربر
یکی از مهمترین مفاهیم پروژههای واقعی، دریافت یک شناسه از URL و استفاده از آن برای پیدا کردن یک رکورد مشخص است.
برای مثال:
edit.php?id=5
یعنی میخواهیم کاربری با شناسه ۵ را ویرایش کنیم.
ویرایش کاربر
PHP
v8.2
<?php
require_once "config/database.php";
$id = filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT);
if (!$id) {
die("شناسه کاربر نامعتبر است.");
}
$stmt = $connection->prepare(
"SELECT id, name, email, phone FROM users WHERE id = ?"
);
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();
if !$user {
die("کاربر پیدا نشد.");
}
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$name = trim($_POST["name"] ?? "");
$email = trim($_POST["email"] ?? "");
$phone = trim($_POST["phone"] ?? "");
if ($name !== "" && filter_var($email, FILTER_VALIDATE_EMAIL)) {
$update = $connection->prepare(
"UPDATE users SET name = ?, email = ?, phone = ? WHERE id = ?"
);
$update->bind_param(
"sssi",
$name,
$email,
$phone,
$id
);
$update->execute();
header("Location: index.php");
exit;
}
}
?>
<h1>ویرایش کاربر</h1>
<form method="post">
<label>نام:</label>
<input type="text" name="name" value="<?php echo htmlspecialchars($user['name']); ?>" required>
<br><br>
<label>ایمیل:</label>
<input type="email" name="email" value="<?php echo htmlspecialchars($user['email']); ?>" required>
<br><br>
<label>تلفن:</label>
<input type="text" name="phone" value="<?php echo htmlspecialchars($user['phone'] ?? ''); ?>">
<br><br>
<button type="submit">ذخیره تغییرات</button>
</form>
🗑️ بخش ۷: حذف کاربر
حذف اطلاعات باید با دقت انجام شود.
در این مثال شناسه کاربر را دریافت میکنیم و سپس با یک Prepared Statement رکورد مربوطه را حذف میکنیم.
حذف کاربر
PHP
v8.2
<?php
require_once "config/database.php";
$id = filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT);
if ($id && $id > 0) {
$stmt = $connection->prepare(
"DELETE FROM users WHERE id = ?"
);
$stmt->bind_param("i", $id);
$stmt->execute();
}
header("Location: index.php");
exit;
?>
⚠️ نکته امنیتی:
در یک سیستم واقعی بهتر است حذف اطلاعات فقط با ارسال مستقیم لینک انجام نشود و از روشهایی مانند POST، تأیید کاربر و CSRF Token استفاده شود. این پروژه برای یادگیری مفاهیم پایه طراحی شده است.
🔐 بخش ۸: چرا Prepared Statement مهم است؟
وقتی اطلاعات کاربر را مستقیماً داخل Query قرار میدهیم، ممکن است برنامه در برابر حملاتی مانند SQL Injection آسیبپذیر شود.
به همین دلیل در پروژه از prepare() و bind_param() استفاده کردیم.
Prepared Statement
PHP
v8.2
<?php
$email = "user@example.com";
$stmt = $connection->prepare(
"SELECT id, name, email FROM users WHERE email = ?"
);
$stmt->bind_param("s", $email);
$stmt->execute();
$result = $stmt->get_result();
?>
🛡️ بخش ۹: جلوگیری از XSS هنگام نمایش اطلاعات
ذخیره کردن اطلاعات کاربر فقط یک بخش ماجراست.
هنگام نمایش اطلاعات دریافتشده از کاربر نیز باید مراقب باشیم دادهها به عنوان HTML یا JavaScript اجرا نشوند.
یکی از ابزارهای رایج PHP برای این کار تابع htmlspecialchars() است.
ایمنسازی خروجی
PHP
v8.2
<?php
$name = '<script>alert("Hello")</script>';
echo htmlspecialchars(
$name,
ENT_QUOTES,
'UTF-8'
);
?>
💡 یک قانون حرفهای:
همیشه بین «دریافت داده»، «اعتبارسنجی داده»، «ذخیره داده» و «نمایش داده» تفاوت قائل شو. این تفکیک ذهنی یکی از پایههای برنامهنویسی امن است.
🧠 بخش ۱۰: مرور مفاهیمی که در پروژه استفاده کردیم
| مفهوم | کاربرد در پروژه |
|---|---|
| متغیرها | ذخیره اطلاعات کاربران و تنظیمات |
| شرطها | بررسی خطاها و اعتبار اطلاعات |
| حلقهها | نمایش چندین کاربر |
| آرایهها | دریافت اطلاعات رکوردها |
| توابع | پردازش و اعتبارسنجی اطلاعات |
| GET | دریافت شناسه کاربر از URL |
| POST | ارسال اطلاعات فرم |
| MySQL | ذخیره اطلاعات کاربران |
🎯 تمرین نهایی
🏆 چالش نهایی مهمان
حالا نوبت توست که پروژه را یک مرحله جدیتر کنی.
بدون اینکه مستقیماً از روی کدهای بالا کپی کنی، امکانات زیر را به پروژه اضافه کن:
- 🔹 جستجوی کاربران بر اساس نام
- 🔹 نمایش تعداد کل کاربران
- 🔹 نمایش پیام مناسب هنگام خالی بودن جدول
- 🔹 اضافه کردن فیلد شهر به جدول کاربران
- 🔹 اضافه کردن تاریخ تولد
- 🔹 اعتبارسنجی شماره تلفن
- 🔹 طراحی بهتر جدول کاربران با CSS
- 🔹 اضافه کردن صفحهبندی برای تعداد زیاد کاربران
🏁 جمعبندی دوره
مهمان عزیز، با پایان این پروژه، بخش مقدماتی دوره جامع PHP را به پایان رساندی.
در این دوره از نصب محیط توسعه شروع کردیم و قدمبهقدم با متغیرها، انواع داده، عملگرها، شرطها، حلقهها، آرایهها، توابع و فرمها آشنا شدیم.
در نهایت هم همه این مفاهیم را کنار هم قرار دادیم تا یک برنامه واقعی بسازیم.
- ✅ محیط PHP را راهاندازی کردی.
- ✅ ساختار و نحوه اجرای کد PHP را شناختی.
- ✅ با متغیرها و انواع داده کار کردی.
- ✅ عملیات و عملگرهای مختلف را یاد گرفتی.
- ✅ با شرطها تصمیمگیری در برنامه را انجام دادی.
- ✅ با حلقهها عملیات تکراری را مدیریت کردی.
- ✅ با آرایهها مجموعهای از اطلاعات را مدیریت کردی.
- ✅ تابع ساختی و از پارامتر و return استفاده کردی.
- ✅ اطلاعات را از فرمهای HTML دریافت کردی.
- ✅ PHP را به MySQL متصل کردی.
- ✅ یک سیستم ساده مدیریت کاربران ساختی.
- ✅ با مفاهیم اولیه امنیت هنگام کار با دادهها آشنا شدی.
🚀 این پایان PHP نیست؛ پایان مرحله اول یادگیری توست.
اگر این پروژه را خودت پیادهسازی کردی و توانستی بدون نگاه کردن به کد، بخشهای اصلی آن را توضیح بدهی، آمادهای که وارد مباحث جدیتر PHP و توسعه وب شوی.
📚 پیشنهاد برای ادامه مسیر
در سطح بعدی میتوانیم وارد موضوعاتی مانند برنامهنویسی شیءگرا، مدیریت Session و Cookie، احراز هویت کاربران، معماری پروژه، کار حرفهای با MySQL، امنیت PHP، آپلود فایل، API و در نهایت ساخت پروژههای واقعیتر شویم.
🎓 پایان سطح اول دوره جامع PHP
حالا دیگر فقط کد PHP را نمینویسی؛ میتوانی یک مسئله را به بخشهای کوچکتر تقسیم کنی و با استفاده از PHP برای آن راهحل بسازی.



