
آموزش گام به گام ایجاد سیستم ثبتنام آنلاین با PHP و MySQL - صفر تا 100
در دنیای امروز، سیستمهای ثبتنام آنلاین به یکی از اجزای حیاتی هر کسبوکار و موسسه آموزشی تبدیل شدهاند. این سیستمها باعث میشوند فرآیند جذب کاربران و ثبتنام در دورهها، رویدادها یا خدمات به شکل کاملاً خودکار، سریع و بدون نیاز به حضور فیزیکی انجام شود. با استفاده از یک سیستم ثبتنام آنلاین، مدیران به راحتی میتوانند اطلاعات کاربران را جمعآوری و مدیریت کنند، در حالی که کاربران هم تجربهای ساده و بدون دردسر در ثبتنام خواهند داشت. به همین دلیل توسعه و پیادهسازی چنین سیستمی برای برنامهنویسان وب یک مهارت مهم و کاربردی است.
این پروژه که در این پست معرفی میکنیم، یک سیستم ثبتنام آنلاین کامل است که با زبان برنامهنویسی PHP و پایگاه داده MySQL طراحی شده است. PHP به دلیل سادگی، کارایی بالا و قابلیت اجرای سریع روی سرورهای وب بسیار محبوب است و MySQL یکی از قدرتمندترین و پرکاربردترین سیستمهای مدیریت پایگاه داده رابطهای است. ترکیب این دو تکنولوژی، یک زیرساخت قوی برای طراحی سیستمهای دینامیک تحت وب ایجاد میکند که قابلیت توسعه و سفارشیسازی بالایی دارند.
در این سیستم ثبتنام آنلاین، امکانات متعددی پیادهسازی شده است؛ از جمله فرم ثبتنام پویا، اعتبارسنجی دادهها در سمت کاربر و سرور، ذخیره امن اطلاعات، نمایش لیست کاربران ثبتنامشده، و مدیریت کاربران با سطوح دسترسی مختلف. همچنین به نکات امنیتی مهمی مانند جلوگیری از حملات SQL Injection، رمزنگاری پسوردها و محافظت در برابر CSRF توجه شده تا سیستم علاوه بر کارایی، از نظر امنیتی نیز مطمئن باشد.
یکی از ویژگیهای برجسته این پروژه، طراحی رابط کاربری ساده و کاربرپسند با HTML و CSS است که امکان استفاده آسان را برای کاربران فراهم میکند. این رابط به گونهای طراحی شده که بتواند در دستگاههای مختلف از جمله موبایل و تبلت به خوبی نمایش داده شود. علاوه بر این، کدهای PHP به صورت ماژولار نوشته شدهاند تا درک و نگهداری آنها برای توسعهدهندگان ساده باشد و بتوانند براحتی قابلیتهای جدید را به سیستم اضافه کنند.
در ادامه این پست، تمامی بخشهای این پروژه به صورت کامل و گام به گام بررسی خواهد شد. از ساختار پایگاه داده، نحوه طراحی فرمهای ثبتنام، کدهای PHP برای پردازش و ذخیره دادهها، تا نکات امنیتی و روشهای بهینهسازی سیستم، همه به صورت دقیق توضیح داده میشوند. بنابراین اگر قصد دارید یک سیستم ثبتنام آنلاین حرفهای و قابل اعتماد بسازید یا میخواهید مهارتهای خود در PHP و MySQL را افزایش دهید، این مطلب یک منبع کامل و کاربردی برای شما خواهد بود.
📋 فهرست :
-
مقدمه: چرا سیستم ثبتنام آنلاین اهمیت دارد؟
-
امکانات و ویژگیهای سیستم ثبتنام طراحیشده
-
معرفی ساختار پایگاهداده (MySQL)
-
طراحی رابط کاربری (HTML + CSS)
-
پیادهسازی سمت سرور با PHP
-
اعتبارسنجی فرمها (فرانتاند و بکاند)
-
نحوه اتصال PHP به پایگاهداده
-
ذخیره اطلاعات ثبتنام در دیتابیس
-
نمایش لیست کاربران ثبتنامشده
-
اعمال سطح دسترسی (مدیر / کاربر)
-
افزودن قابلیت ویرایش و حذف ثبتنام
-
نکات امنیتی مهم در طراحی این سیستم
-
نحوه استفاده، نصب و اجرای پروژه
-
نتیجهگیری + لینک دانلود سورسکد پروژه
مقدمه: چرا سیستم ثبتنام آنلاین اهمیت دارد؟
در دنیای دیجیتال امروز، بسیاری از فرایندهای اداری و دستی به سمت خودکارسازی و آنلاین شدن حرکت کردهاند. یکی از این فرایندها، ثبتنام کاربران، مشتریان یا دانشجویان در انواع سیستمها و خدمات مختلف است. سیستم ثبتنام آنلاین نهتنها باعث صرفهجویی در زمان و هزینه میشود، بلکه دقت، امنیت و دسترسی آسانتری را برای کاربران فراهم میسازد.
فرض کنید شما مدیریت یک دوره آموزشی، باشگاه ورزشی، یا رویداد را بر عهده دارید. اگر هنوز از روشهای سنتی (فرمهای کاغذی یا اکسل دستی) استفاده میکنید، ممکن است با مشکلاتی مانند موارد زیر مواجه باشید:
-
ورود اطلاعات تکراری یا نادرست
-
نیاز به بررسی دستی و زمانبر
-
عدم امکان پیگیری دقیق وضعیت ثبتنام
-
دشواری در بروزرسانی یا ویرایش اطلاعات
در مقابل، با استفاده از یک سیستم ثبتنام آنلاین تحت وب، میتوانید تمامی این مشکلات را با یک ابزار ساده و کاربردی برطرف کنید. سیستمهایی که با زبان PHP و پایگاهداده MySQL ساخته میشوند، علاوهبر رایگان بودن و انعطافپذیری بالا، بهراحتی در هاستهای مختلف قابل نصب هستند.
در این مقاله، به بررسی یک پروژه عملی و کاربردی تحت عنوان سورس کد سیستم ثبتنام آنلاین با PHP و MySQL خواهیم پرداخت. این پروژه میتواند پایهای برای ساخت سیستمهای بزرگتر مانند ثبتنام دانشآموزان، اعضای سازمان، شرکتکنندگان در دورهها یا حتی سامانههای پرداخت و عضویت باشد.
در ادامه با امکانات این سیستم و نحوه طراحی و پیادهسازی آن آشنا خواهیم شد...
امکانات و ویژگیهای سیستم ثبتنام طراحیشده
سیستمی که در این پروژه طراحی شده، یک پلتفرم ساده اما کاربردی و قابل توسعه است که میتواند برای انواع کاربردها مانند ثبتنام در دورههای آموزشی، عضویت در باشگاهها، ثبتنام دانشآموزان یا حتی ثبتنام کاربران سایت مورد استفاده قرار گیرد. در این بخش، به معرفی مهمترین ویژگیهای این سیستم میپردازیم:
🔹 1. فرم ثبتنام با فیلدهای ضروری
فرم ثبتنام شامل اطلاعات پایهای مانند:
-
نام و نام خانوادگی
-
ایمیل
-
شماره تماس
-
انتخاب نوع دوره / رویداد / گروه
-
رمز عبور برای ورود به سیستم (در صورت نیاز)
تمامی فیلدها با اعتبارسنجی سمت کاربر و سمت سرور محافظت میشوند.
🔹 2. ذخیره اطلاعات در پایگاهداده MySQL
پس از ارسال فرم، اطلاعات ثبتنام بهصورت کاملاً ایمن در پایگاهداده MySQL ذخیره میشود و امکان مدیریت، نمایش، ویرایش یا حذف آنها فراهم است.
🔹 3. پنل مدیریت ساده
مدیر سیستم میتواند:
-
لیست ثبتنامشدگان را مشاهده کند
-
اطلاعات ثبتشده را ویرایش یا حذف نماید
-
تعداد کل ثبتنامها را مشاهده کند
(در نسخه پیشرفتهتر میتوان گزارشگیری نیز اضافه کرد.)
🔹 4. نمایش لیست کاربران ثبتنامشده
لیستی از افراد ثبتنامشده بهصورت جدولی نمایش داده میشود که شامل جزئیاتی مانند نام، ایمیل، زمان ثبتنام و عملیات مدیریتی (ویرایش / حذف) است.
🔹 5. اعتبارسنجی فرمها
در این سیستم، هم از JavaScript برای بررسی اولیه فرم در سمت کاربر (Client-side) استفاده شده و هم از PHP برای اعتبارسنجی نهایی در سمت سرور (Server-side)، تا امنیت حفظ شود.
🔹 6. امنیت اولیه
اطلاعات مهم مانند رمز عبور، با الگوریتم hash (مانند SHA-256) رمزنگاری شده و از حملاتی مثل SQL Injection جلوگیری میشود.
🔹 7. قابلیت ویرایش و حذف اطلاعات ثبتنام
هر رکورد قابل ویرایش یا حذف است تا بتوان اطلاعات کاربران را در صورت نیاز بروزرسانی کرد.
🔹 8. طراحی واکنشگرا و ساده (Responsive)
رابط کاربری سیستم با HTML و CSS طراحی شده و در موبایل، تبلت و دسکتاپ به خوبی نمایش داده میشود.
معرفی ساختار پایگاهداده (MySQL)
در طراحی یک سیستم ثبتنام آنلاین، پایگاهداده نقش ستون فقرات را ایفا میکند. تمامی اطلاعاتی که کاربران وارد میکنند (مانند نام، ایمیل، شماره تماس و...) باید در یک ساختار منظم، ایمن و قابل بازیابی ذخیره شوند. در این پروژه، از MySQL بهعنوان سیستم مدیریت پایگاهداده استفاده شده که بهخاطر سرعت بالا، امنیت مناسب و سازگاری کامل با PHP بسیار پرکاربرد است.
📁 نام پایگاهداده:
registration_system
📦 جدول اصلی:
users
این جدول تمام اطلاعات کاربران ثبتنامشده را در خود نگهداری میکند.
📐 ساختار جدول users
بهصورت زیر طراحی شده است:
نام فیلد (ستون) | نوع داده | توضیح |
---|---|---|
id |
INT (Primary Key, Auto Increment) | شناسه یکتای کاربر |
full_name |
VARCHAR(100) | نام و نام خانوادگی |
email |
VARCHAR(100) | ایمیل کاربر (منحصربهفرد) |
phone |
VARCHAR(20) | شماره تماس |
course |
VARCHAR(100) | دوره یا گروه انتخابی |
password |
VARCHAR(255) | رمز عبور (رمزنگاریشده) |
created_at |
TIMESTAMP | تاریخ و زمان ثبتنام |
🧱 کوئری ساخت جدول (SQL):
sql
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, full_name VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, phone VARCHAR(20) NOT NULL, course VARCHAR(100) NOT NULL, password VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
نکات مهم طراحی:
-
کلید اصلی (Primary Key) برای رکوردهای یکتا استفاده شده.
-
ایمیل بهعنوان فیلد منحصربهفرد (UNIQUE) تعریف شده تا از تکرار جلوگیری شود.
-
فیلد
password
با اندازه مناسب طراحی شده تا رمزنگاریها (مانند SHA-256 یا Bcrypt) در آن جا بگیرد. -
فیلد
created_at
بهصورت خودکار زمان ثبتنام را ذخیره میکند.
طراحی رابط کاربری (HTML + CSS)
طراحی رابط کاربری (UI) یکی از مهمترین بخشهای هر سیستم آنلاین است. کاربران باید بتوانند بدون پیچیدگی، فرم ثبتنام را مشاهده و اطلاعات خود را بهراحتی وارد کنند. در این پروژه، رابط کاربری با استفاده از HTML و CSS ساده و واکنشگرا (Responsive) طراحی شده است تا در دستگاههای مختلف مانند موبایل، تبلت و دسکتاپ بهدرستی نمایش داده شود.
🖼 ساختار کلی فرم ثبتنام:
فرم ثبتنام در یک باکس مرکزی قرار گرفته و شامل فیلدهای اصلی زیر است:
-
نام و نام خانوادگی
-
ایمیل
-
شماره تماس
-
انتخاب دوره یا گروه
-
رمز عبور
-
دکمه ثبتنام
🧩 کد HTML فرم ثبتنام:
html
<form action="register.php" method="post" class="registration-form"> <h2>فرم ثبتنام</h2> <input type="text" name="full_name" placeholder="نام و نام خانوادگی" required> <input type="email" name="email" placeholder="ایمیل" required> <input type="text" name="phone" placeholder="شماره تماس" required> <select name="course" required> <option value="">-- انتخاب دوره --</option> <option value="php">PHP مقدماتی</option> <option value="mysql">MySQL کاربردی</option> <option value="html-css">HTML & CSS</option> </select> <input type="password" name="password" placeholder="رمز عبور" required> <button type="submit">ثبتنام</button> </form>
🎨 کد CSS برای استایل فرم:
css
body { font-family: 'Vazir', sans-serif; background: #f5f5f5; display: flex; justify-content: center; align-items: center; height: 100vh; } .registration-form { background: white; padding: 30px; border-radius: 10px; box-shadow: 0 0 15px rgba(0,0,0,0.1); width: 100%; max-width: 400px; } .registration-form h2 { text-align: center; margin-bottom: 20px; } .registration-form input, .registration-form select, .registration-form button { width: 100%; margin-bottom: 15px; padding: 10px; font-size: 14px; border-radius: 5px; border: 1px solid #ccc; } .registration-form button { background-color: #28a745; color: white; font-weight: bold; border: none; cursor: pointer; } .registration-form button:hover { background-color: #218838; }
✅ نکات طراحی رابط:
-
طراحی بهصورت ساده، تمیز و قابل فهم است.
-
رنگبندی مناسب برای جلب اعتماد کاربر استفاده شده.
-
عناصر فرم فاصلهگذاری مناسبی دارند و در موبایل نیز کاملاً خوانا هستند.
-
از فونت فارسی (مثلاً Vazir) استفاده شده تا ظاهر پروژه حرفهای باشد.
پیادهسازی سمت سرور با PHP
تا اینجا فرم ثبتنام را با استفاده از HTML و CSS طراحی کردیم. حالا وقت آن است که عملیات سمت سرور را با زبان PHP پیادهسازی کنیم تا اطلاعات واردشده توسط کاربر:
-
اعتبارسنجی شوند
-
در پایگاهداده ذخیره شوند
-
خطاها یا پیام موفقیت به کاربر نمایش داده شود
این پردازشها در فایل register.php
انجام میشود.
🛠 گام اول: اتصال به پایگاهداده MySQL
ابتدا در فایل config.php
اطلاعات اتصال به دیتابیس را تعریف میکنیم:
php
<?php // فایل config.php $host = "localhost"; $dbname = "registration_system"; $username = "root"; $password = ""; try { $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("خطا در اتصال به پایگاهداده: " . $e->getMessage()); } ?>
🧪 گام دوم: پردازش فرم در فایل register.php
php
<?php require_once 'config.php'; if ($_SERVER["REQUEST_METHOD"] == "POST") { // دریافت اطلاعات از فرم $full_name = trim($_POST["full_name"]); $email = trim($_POST["email"]); $phone = trim($_POST["phone"]); $course = trim($_POST["course"]); $password = trim($_POST["password"]); // اعتبارسنجی اولیه if (empty($full_name) || empty($email) || empty($phone) || empty($course) || empty($password)) { die("لطفاً همه فیلدها را پر کنید."); } // بررسی تکراری نبودن ایمیل $stmt = $pdo->prepare("SELECT id FROM users WHERE email = ?"); $stmt->execute([$email]); if ($stmt->rowCount() > 0) { die("این ایمیل قبلاً ثبتنام شده است."); } // رمزنگاری رمز عبور $hashed_password = hash('sha256', $password); // ثبت اطلاعات در پایگاهداده $stmt = $pdo->prepare("INSERT INTO users (full_name, email, phone, course, password) VALUES (?, ?, ?, ?, ?)"); $stmt->execute([$full_name, $email, $phone, $course, $hashed_password]); echo "ثبتنام با موفقیت انجام شد!"; } ?>
✅ نکات مهم:
-
از PDO برای اتصال به پایگاهداده استفاده شده که امنیت و انعطافپذیری بالاتری نسبت به
mysqli
دارد. -
رمز عبور کاربر بهصورت رمزنگاریشده (hash) در دیتابیس ذخیره میشود.
-
از تکنیک Prepared Statements برای جلوگیری از حملات SQL Injection استفاده شده.
-
در صورت ثبت موفق، پیام تایید نمایش داده میشود.
اعتبارسنجی فرمها (فرانتاند و بکاند)
در سیستم ثبتنام آنلاین، اعتبارسنجی اطلاعاتی که کاربران وارد میکنند اهمیت بالایی دارد تا:
-
دادههای نادرست یا ناقص وارد پایگاهداده نشود،
-
امنیت سیستم حفظ شود،
-
تجربه کاربری بهبود یابد.
برای این کار از دو مرحله اعتبارسنجی استفاده میکنیم:
۱. اعتبارسنجی سمت کلاینت (فرانتاند)
۲. اعتبارسنجی سمت سرور (بکاند)
۱. اعتبارسنجی سمت کلاینت (فرانتاند)
این مرحله با استفاده از JavaScript انجام میشود و باعث میشود کاربر قبل از ارسال فرم، خطاهای ساده مثل خالی بودن فیلدها، فرمت ایمیل و شماره تماس را ببیند.
مثال ساده اعتبارسنجی با JavaScript:
html
<script> document.querySelector('.registration-form').addEventListener('submit', function(e) { let fullName = this.full_name.value.trim(); let email = this.email.value.trim(); let phone = this.phone.value.trim(); let course = this.course.value; let password = this.password.value; // بررسی خالی بودن فیلدها if (!fullName || !email || !phone || !course || !password) { alert("لطفاً همه فیلدها را پر کنید."); e.preventDefault(); // جلوگیری از ارسال فرم return; } // اعتبارسنجی ساده ایمیل let emailRegex = /^[^s@]+@[^s@]+.[^s@]+$/; if (!emailRegex.test(email)) { alert("لطفاً ایمیل معتبر وارد کنید."); e.preventDefault(); return; } // اعتبارسنجی شماره تماس (مثلاً حداقل 10 رقم) let phoneRegex = /^d{10,}$/; if (!phoneRegex.test(phone)) { alert("لطفاً شماره تماس معتبر وارد کنید."); e.preventDefault(); return; } // اعتبارسنجی رمز عبور (حداقل 6 کاراکتر) if (password.length < 6) { alert("رمز عبور باید حداقل 6 کاراکتر باشد."); e.preventDefault(); return; } }); </script>
۲. اعتبارسنجی سمت سرور (بکاند)
با اینکه اعتبارسنجی سمت کلاینت باعث بهبود تجربه کاربری میشود، اما بههیچوجه نباید جایگزین اعتبارسنجی سمت سرور شود، چون کاربر میتواند این کدها را دور بزند.
در بخش PHP (فایل register.php
) اعتبارسنجیهای زیر انجام میشود:
-
بررسی خالی بودن فیلدها
-
بررسی تکراری نبودن ایمیل
-
اعتبارسنجی فرمت ایمیل با تابع
filter_var()
-
محدودیت طول و نوع دادهها
-
رمزنگاری و تایید امنیت رمز عبور
مثال اعتبارسنجی ایمیل در PHP:
php
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { die("ایمیل وارد شده معتبر نیست."); }
چرا اعتبارسنجی دو مرحلهای مهم است؟
-
فرانتاند سرعت بازخورد را بالا میبرد و از ارسال دادههای نامناسب جلوگیری میکند.
-
بکاند امنیت و صحت دادهها را تضمین میکند.
جمعبندی:
مرحله | وظیفه | زبان/ابزار |
---|---|---|
فرانتاند | جلوگیری از ارسال داده نادرست و نمایش سریع پیام خطا | JavaScript, HTML5 |
بکاند | اعتبارسنجی نهایی و حفظ امنیت سیستم | PHP |
نحوه اتصال PHP به پایگاهداده MySQL
برای اینکه بتوانیم دادهها را در سیستم ثبتنام ذخیره کنیم و از پایگاهداده بازیابی کنیم، ابتدا باید PHP را به MySQL متصل کنیم. این اتصال، نقطه شروع تمام عملیات پایگاهداده در پروژه است.
روشهای اتصال به MySQL در PHP
PHP دو روش اصلی برای اتصال به MySQL دارد:
-
موسسه MySQLi (MySQL Improved Extension)
-
PDO (PHP Data Objects)
چرا بهتر است از PDO استفاده کنیم؟
-
PDO از چندین نوع پایگاهداده پشتیبانی میکند (MySQL، SQLite، PostgreSQL و ...).
-
امکان استفاده از Prepared Statements برای جلوگیری از حملات SQL Injection دارد.
-
مدیریت خطا و استثناها در PDO بهتر است.
-
کد تمیزتر و قابل نگهداریتری ایجاد میکند.
بنابراین در این پروژه ما از PDO استفاده میکنیم.
نمونه کد اتصال با PDO
php
<?php $host = 'localhost'; // نام سرور پایگاهداده (معمولاً localhost) $dbname = 'registration_system'; // نام پایگاهداده $username = 'root'; // نام کاربری پایگاهداده $password = ''; // رمز عبور پایگاهداده (در لوکال معمولاً خالی است) try { // ایجاد شیء PDO و اتصال $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password); // تنظیم حالت گزارش خطا به Exception (بیشتر برای خطایابی) $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "اتصال به پایگاهداده موفقیتآمیز بود."; } catch (PDOException $e) { // در صورت خطا، پیغام نمایش داده شود و اجرای کد متوقف شود die("خطا در اتصال به پایگاهداده: " . $e->getMessage()); } ?>
نکات مهم:
-
در رشته اتصال (
dsn
)، پارامترcharset=utf8
را وارد میکنیم تا مشکلات مربوط به کدگذاری کاراکترها (مثل فارسی) حل شود. -
باید اطلاعات دقیق دیتابیس شامل نام سرور، نام دیتابیس، نام کاربری و رمز عبور را صحیح وارد کنید.
-
بخش
try-catch
برای گرفتن خطاهای احتمالی اتصال است که به صورت قابل کنترل مدیریت شود.
کاربرد اتصال در پروژه ثبتنام
این کد اتصال را معمولاً در یک فایل جداگانه مثلاً config.php
قرار میدهیم و در سایر فایلها آن را فراخوانی میکنیم تا اتصال یکپارچه و بدون تکرار باشد.
php
// در فایل register.php یا هر جای دیگر require_once 'config.php'; // سپس میتوانیم از $pdo برای اجرای دستورات SQL استفاده کنیم
ذخیره اطلاعات ثبتنام در دیتابیس
بعد از اینکه کاربر اطلاعاتش را در فرم ثبتنام وارد کرد و فرم را ارسال کرد، باید این اطلاعات به سرور PHP ارسال شود. سرور اطلاعات را دریافت، اعتبارسنجی و سپس در جدول مربوط به کاربران در پایگاهداده ذخیره میکند.
گامهای اصلی ذخیرهسازی اطلاعات:
-
دریافت اطلاعات فرم
-
اعتبارسنجی اطلاعات (این مرحله را قبلاً توضیح دادیم)
-
بررسی تکراری نبودن ایمیل (مثلاً ایمیل قبلاً ثبت نشده باشد)
-
رمزنگاری رمز عبور
-
ذخیره اطلاعات در دیتابیس با استفاده از کوئری INSERT
نمونه کد ذخیره اطلاعات در فایل register.php
php
<?php require_once 'config.php'; // اتصال به دیتابیس if ($_SERVER["REQUEST_METHOD"] == "POST") { // 1. دریافت اطلاعات از فرم $full_name = trim($_POST["full_name"]); $email = trim($_POST["email"]); $phone = trim($_POST["phone"]); $course = trim($_POST["course"]); $password = trim($_POST["password"]); // 2. اعتبارسنجی ساده (مثلاً چک خالی نبودن) if (empty($full_name) || empty($email) || empty($phone) || empty($course) || empty($password)) { die("لطفاً همه فیلدها را پر کنید."); } // 3. بررسی ایمیل تکراری $stmt = $pdo->prepare("SELECT id FROM users WHERE email = ?"); $stmt->execute([$email]); if ($stmt->rowCount() > 0) { die("این ایمیل قبلاً ثبتنام شده است."); } // 4. رمزنگاری رمز عبور $hashed_password = password_hash($password, PASSWORD_DEFAULT); // 5. ذخیره در دیتابیس $stmt = $pdo->prepare("INSERT INTO users (full_name, email, phone, course, password) VALUES (?, ?, ?, ?, ?)"); $result = $stmt->execute([$full_name, $email, $phone, $course, $hashed_password]); if ($result) { echo "ثبتنام با موفقیت انجام شد!"; } else { echo "خطا در ثبتنام، لطفاً مجدداً تلاش کنید."; } } ?>
نکات مهم:
-
از تابع
password_hash()
استفاده کردیم که الگوریتم قوی و استاندارد برای هش کردن رمز عبور ارائه میدهد (به جایhash('sha256', ...)
که کمتر امن است). -
از Prepared Statements برای جلوگیری از حملات SQL Injection استفاده شده است.
-
پس از اجرای کوئری
INSERT
، اگر عملیات موفقیتآمیز باشد، پیام موفقیت نشان داده میشود. -
اگر مشکلی در ذخیرهسازی باشد، پیام خطای مناسبی نمایش داده میشود.
جدول نمونه users
در MySQL
برای این کد، جدول باید به این صورت تعریف شده باشد:
sql
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, full_name VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, phone VARCHAR(20) NOT NULL, course VARCHAR(100) NOT NULL, password VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
نمایش لیست کاربران ثبتنامشده
هدف این قسمت نمایش اطلاعات کاربران ذخیرهشده در جدول users
به صورت یک جدول مرتب در صفحه وب است. این قابلیت به مدیر سایت اجازه میدهد همه کاربران ثبتنامشده را مشاهده کند.
گامهای اصلی نمایش لیست کاربران:
-
اتصال به دیتابیس
-
اجرای کوئری SELECT برای دریافت همه رکوردها
-
نمایش دادهها در قالب جدول HTML
نمونه کد PHP برای نمایش کاربران (list_users.php
):
php
<?php require_once 'config.php'; // اتصال به دیتابیس try { // 2. دریافت همه کاربران از جدول users $stmt = $pdo->query("SELECT id, full_name, email, phone, course, created_at FROM users ORDER BY created_at DESC"); $users = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { die("خطا در دریافت اطلاعات کاربران: " . $e->getMessage()); } ?> <!DOCTYPE html> <html lang="fa"> <head> <meta charset="UTF-8"> <title>لیست کاربران ثبتنامشده</title> <style> table { border-collapse: collapse; width: 100%; font-family: Tahoma, sans-serif; } th, td { border: 1px solid #ddd; padding: 8px; text-align: center; } th { background-color: #4CAF50; color: white; } tr:nth-child(even){ background-color: #f2f2f2; } </style> </head> <body> <h2>لیست کاربران ثبتنامشده</h2> <?php if (count($users) > 0): ?> <table> <thead> <tr> <th>شناسه</th> <th>نام و نام خانوادگی</th> <th>ایمیل</th> <th>شماره تماس</th> <th>دوره ثبتنامی</th> <th>تاریخ ثبتنام</th> </tr> </thead> <tbody> <?php foreach ($users as $user): ?> <tr> <td><?= htmlspecialchars($user['id']) ?></td> <td><?= htmlspecialchars($user['full_name']) ?></td> <td><?= htmlspecialchars($user['email']) ?></td> <td><?= htmlspecialchars($user['phone']) ?></td> <td><?= htmlspecialchars($user['course']) ?></td> <td><?= htmlspecialchars($user['created_at']) ?></td> </tr> <?php endforeach; ?> </tbody> </table> <?php else: ?> <p>هیچ کاربری ثبتنام نکرده است.</p> <?php endif; ?> </body> </html>
نکات مهم:
-
از تابع
htmlspecialchars()
برای جلوگیری از مشکلات امنیتی مانند XSS استفاده شده است. -
جدول دارای استایل ساده و خوانا است که میتوان آن را به دلخواه حرفهایتر کرد.
-
دادهها بر اساس جدیدترین ثبتنامها مرتب شدهاند (
ORDER BY created_at DESC
).
اعمال سطح دسترسی (مدیر / کاربر)
1. افزودن ستون نقش (role) در جدول کاربران
ابتدا باید در جدول users
ستونی اضافه کنیم که نقش هر کاربر را مشخص کند. معمولاً نقشها مثل "admin"
برای مدیر و "user"
برای کاربران عادی تعریف میشود.
مثال SQL برای افزودن ستون:
sql
ALTER TABLE users ADD COLUMN role VARCHAR(20) NOT NULL DEFAULT 'user';
-
مقدار پیشفرض برای همه کاربران عادی
"user"
خواهد بود. -
هنگام ایجاد حساب مدیر، مقدار
"admin"
وارد میشود.
2. ثبت نقش هنگام ثبتنام
اگر سیستم شما امکان ثبتنام کاربران عادی را دارد، معمولا نقش "user"
ثبت میشود.
اگر بخواهید مدیر ثبت کنید، میتوانید به صورت دستی در پایگاه داده مقدار "admin"
قرار دهید یا در فرم ثبتنام جداگانه این گزینه را اضافه کنید (معمولاً برای امنیت بهتر این کار از طریق پنل مدیریت انجام میشود).
مثال در register.php
:
php
$role = 'user'; // نقش پیشفرض // در صورتی که بخواهید نقش را از فرم بگیرید: // $role = trim($_POST["role"]); // فقط اگر فیلد role در فرم باشد $stmt = $pdo->prepare("INSERT INTO users (full_name, email, phone, course, password, role) VALUES (?, ?, ?, ?, ?, ?)"); $result = $stmt->execute([$full_name, $email, $phone, $course, $hashed_password, $role]);
3. ایجاد سیستم ورود (Login) و ذخیره نقش در نشست (Session)
در صفحه ورود (مثلاً login.php
) پس از اعتبارسنجی ایمیل و رمز عبور، باید نقش کاربر را دریافت و در سشن ذخیره کنیم.
نمونه کد:
php
<?php session_start(); require_once 'config.php'; if ($_SERVER["REQUEST_METHOD"] == "POST") { $email = trim($_POST["email"]); $password = trim($_POST["password"]); $stmt = $pdo->prepare("SELECT id, password, role FROM users WHERE email = ?"); $stmt->execute([$email]); $user = $stmt->fetch(PDO::FETCH_ASSOC); if ($user && password_verify($password, $user['password'])) { // ذخیره اطلاعات کاربر در سشن $_SESSION['user_id'] = $user['id']; $_SESSION['user_role'] = $user['role']; // هدایت بر اساس نقش if ($user['role'] == 'admin') { header("Location: admin_dashboard.php"); } else { header("Location: user_dashboard.php"); } exit(); } else { echo "ایمیل یا رمز عبور اشتباه است."; } } ?>
4. محدود کردن دسترسی صفحات بر اساس نقش
در ابتدای صفحات مهم (مثلاً پنل مدیریت) کد زیر را قرار میدهیم تا فقط مدیر اجازه دسترسی داشته باشد:
php
<?php session_start(); if (!isset($_SESSION['user_role']) || $_SESSION['user_role'] != 'admin') { // اگر نقش مدیر نبود، هدایت به صفحه ورود یا صفحه بدون دسترسی header("Location: login.php"); exit(); } ?>
برای صفحات کاربران عادی هم میتوان بررسی کرد که کاربر وارد شده باشد:
php
<?php session_start(); if (!isset($_SESSION['user_id'])) { header("Location: login.php"); exit(); } ?>
5. نمایش محتوای متفاوت بر اساس نقش
در صفحههای مشترک، میتوان محتوایی مثل منو یا دکمههای خاص مدیر را فقط به نقش مدیر نمایش داد:
php
<?php if (isset($_SESSION['user_role']) && $_SESSION['user_role'] == 'admin'): ?> <a href="admin_dashboard.php">پنل مدیریت</a> <?php endif; ?>
نکات مهم امنیتی:
-
حتماً بررسی دسترسی را در هر صفحه حساس انجام دهید، نه فقط در منو یا ظاهر صفحه.
-
برای امنیت بیشتر، نشستها (Sessions) را با
session_regenerate_id()
پس از ورود موفق به روز کنید. -
از HTTPS استفاده کنید تا دادهها ایمن منتقل شوند.
افزودن قابلیت ویرایش و حذف ثبتنام
1. ساخت صفحه نمایش لیست کاربران با دکمههای ویرایش و حذف
ابتدا در صفحه نمایش لیست کاربران (مثلاً list_users.php
) در کنار هر رکورد دو دکمه یا لینک برای ویرایش و حذف قرار میدهیم:
php
<td> <a href="edit_user.php?id=<?= $user['id'] ?>">ویرایش</a> | <a href="delete_user.php?id=<?= $user['id'] ?>" onclick="return confirm('آیا از حذف این کاربر مطمئن هستید؟');">حذف</a> </td>
2. ایجاد صفحه ویرایش اطلاعات کاربر (edit_user.php
)
دریافت اطلاعات کاربر
در این صفحه ابتدا شناسه کاربر (id
) را از پارامتر URL میگیریم و اطلاعات آن را از دیتابیس میخوانیم تا فرم با دادههای قبلی پر شود:
php
<?php require_once 'config.php'; if (!isset($_GET['id']) || empty($_GET['id'])) { die("شناسه کاربر مشخص نشده است."); } $id = intval($_GET['id']); // دریافت اطلاعات کاربر $stmt = $pdo->prepare("SELECT full_name, email, phone, course FROM users WHERE id = ?"); $stmt->execute([$id]); $user = $stmt->fetch(PDO::FETCH_ASSOC); if (!$user) { die("کاربر یافت نشد."); } ?>
فرم ویرایش با مقادیر اولیه
html
<form method="post" action="edit_user.php?id=<?= $id ?>"> نام و نام خانوادگی: <input type="text" name="full_name" value="<?= htmlspecialchars($user['full_name']) ?>" required><br> ایمیل: <input type="email" name="email" value="<?= htmlspecialchars($user['email']) ?>" required><br> شماره تماس: <input type="text" name="phone" value="<?= htmlspecialchars($user['phone']) ?>"><br> دوره ثبتنامی: <input type="text" name="course" value="<?= htmlspecialchars($user['course']) ?>"><br> <button type="submit">ذخیره تغییرات</button> </form>
ذخیره تغییرات در دیتابیس
بعد از ارسال فرم، دادهها را اعتبارسنجی و با کوئری UPDATE ذخیره میکنیم:
php
<?php if ($_SERVER['REQUEST_METHOD'] == 'POST') { $full_name = trim($_POST['full_name']); $email = trim($_POST['email']); $phone = trim($_POST['phone']); $course = trim($_POST['course']); // اعتبارسنجی ساده (میتوانید پیشرفتهتر کنید) $stmt = $pdo->prepare("UPDATE users SET full_name = ?, email = ?, phone = ?, course = ? WHERE id = ?"); $result = $stmt->execute([$full_name, $email, $phone, $course, $id]); if ($result) { header("Location: list_users.php?msg=ویرایش با موفقیت انجام شد"); exit(); } else { echo "خطا در بهروزرسانی اطلاعات."; } } ?>
3. ایجاد صفحه حذف کاربر (delete_user.php
)
این صفحه فقط کافی است شناسه کاربر را دریافت کرده و رکورد مربوطه را حذف کند:
php
<?php require_once 'config.php'; if (!isset($_GET['id']) || empty($_GET['id'])) { die("شناسه کاربر مشخص نشده است."); } $id = intval($_GET['id']); $stmt = $pdo->prepare("DELETE FROM users WHERE id = ?"); $result = $stmt->execute([$id]); if ($result) { header("Location: list_users.php?msg=حذف با موفقیت انجام شد"); exit(); } else { echo "خطا در حذف کاربر."; } ?>
نکات امنیتی و کاربردی:
-
برای جلوگیری از حذف یا ویرایش توسط کاربران غیرمجاز، بررسی سطح دسترسی (مدیر بودن) را در ابتدای صفحات ویرایش و حذف قرار دهید.
-
بهتر است برای عملیات حذف و ویرایش از روشهای POST استفاده کنید یا حداقل اعتبارسنجیهای امنیتی مثل توکن CSRF اضافه کنید.
-
در فرم ویرایش اگر ایمیل قابل تغییر است، باید بررسی کنید که ایمیل تکراری ثبت نشود.
-
بعد از انجام هر عملیات (ویرایش یا حذف) پیام موفقیت یا خطا به کاربر نمایش داده شود.
نکات امنیتی مهم در طراحی سیستم ثبتنام آنلاین با PHP و MySQL
1. استفاده از پیشپردازش و آمادهسازی کوئریها (Prepared Statements)
-
برای جلوگیری از حملات SQL Injection، هرگز مقادیر ورودی کاربران را مستقیماً در کوئری SQL وارد نکنید.
-
از Prepared Statements در PDO یا MySQLi استفاده کنید تا کوئریها و دادهها به طور امن از هم جدا شوند.
مثال با PDO:
php
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?"); $stmt->execute([$email]);
2. اعتبارسنجی و پاکسازی ورودیهای کاربران
-
قبل از ذخیره دادهها، ورودیها را به دقت اعتبارسنجی کنید (فرمت ایمیل، طول متن، نوع دادهها و غیره).
-
همچنین از توابعی مانند
htmlspecialchars()
برای جلوگیری از XSS (تزریق کد جاوااسکریپت) هنگام نمایش دادهها استفاده کنید.
3. رمزنگاری امن رمز عبور
-
از توابع مدرن PHP مانند
password_hash()
برای هش کردن پسوردها استفاده کنید. -
هرگز رمز عبور را به صورت متنی ساده (plain text) در دیتابیس ذخیره نکنید.
-
برای بررسی پسورد از
password_verify()
استفاده کنید.
4. مدیریت جلسهها (Sessions) به صورت امن
-
از
session_start()
در ابتدای صفحات استفاده کنید. -
برای جلوگیری از حملات Session Hijacking از
session_regenerate_id(true)
بعد از ورود موفق استفاده کنید. -
در صورت عدم فعالیت کاربر، نشست را منقضی (expire) کنید.
-
استفاده از کوکیهای امن و HttpOnly:
php
session_set_cookie_params([ 'secure' => true, 'httponly' => true, 'samesite' => 'Strict' ]);
5. محافظت در برابر حملات CSRF (Cross-Site Request Forgery)
-
برای فرمهای حساس (مثل ثبتنام، ورود، ویرایش و حذف) از توکنهای CSRF استفاده کنید.
-
توکن را در فرم مخفی قرار داده و هنگام ارسال، اعتبارسنجی کنید.
6. کنترل دسترسی و اعمال سطح دسترسی دقیق
-
دسترسی به بخشهای مدیریت فقط برای کاربران با نقش
"admin"
فعال باشد. -
هر صفحه حساس باید بررسی کند کاربر وارد شده و نقش مناسب را دارد.
-
دادههایی که کاربر مجاز نیست ببیند یا تغییر دهد، به هیچ وجه در دسترس نباشد.
7. استفاده از HTTPS
-
سایت خود را با گواهی SSL مجهز کنید.
-
انتقال اطلاعات به صورت رمزنگاری شده انجام شود تا دادههای حساس مثل رمز عبور در معرض رهگیری نباشند.
8. جلوگیری از افشای اطلاعات حساس
-
خطاهای کامل PHP را به کاربران نمایش ندهید.
-
لاگ خطاها را در فایلهای جداگانه و امن ذخیره کنید.
-
پیغامهای خطا عمومی و کلی باشند و اطلاعات دیتابیس یا مسیرهای سرور را افشا نکنند.
9. محدود کردن اندازه و نوع فایلهای آپلودی (اگر آپلود دارید)
-
اگر امکان آپلود فایل در سیستم وجود دارد، حتماً پسوند و حجم فایلها را محدود کنید.
-
از محلهای امن برای ذخیرهسازی استفاده کنید.
10. بهروزرسانی مرتب سرور و نرمافزارها
-
PHP، MySQL، وب سرور و کتابخانهها را همیشه به آخرین نسخههای پایدار بهروزرسانی کنید.
-
از نسخههای قدیمی و ناامن استفاده نکنید.
نحوه استفاده، نصب و اجرای پروژه سیستم ثبتنام آنلاین با PHP و MySQL
1. پیشنیازها و نرمافزارهای لازم
برای اجرای این پروژه نیاز به موارد زیر دارید:
-
وب سرور: معمولاً از Apache یا Nginx استفاده میشود.
-
PHP: نسخه 7.4 یا بالاتر پیشنهاد میشود.
-
MySQL یا MariaDB: برای پایگاه داده.
-
ابزار مدیریت پایگاه داده (اختیاری): مثل phpMyAdmin برای مدیریت سادهتر دیتابیس.
-
نرمافزارهای بسته آماده مثل XAMPP یا WAMP: اگر نمیخواهید جداگانه وب سرور، PHP و MySQL را نصب کنید، این بستهها همه را یکجا دارند.
2. دانلود و آمادهسازی پروژه
-
پروژه سیستم ثبتنام را از منبع مربوطه دانلود کنید (یا اگر سورس کد خودتان است، آن را در فولدر مناسب قرار دهید).
-
پوشه پروژه را در مسیر htdocs (برای XAMPP) یا مسیر ریشه وب سرور خود قرار دهید.
مثلاً:
makefile
C:xampphtdocs
egistration_system
3. ساخت پایگاه داده و جداول در MySQL
3-1. ورود به MySQL
-
از طریق phpMyAdmin یا خط فرمان MySQL وارد شوید.
3-2. ایجاد پایگاه داده جدید
sql
CREATE DATABASE registration_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE registration_db;
3-3. ایجاد جدول کاربران (نمونه)
sql
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, full_name VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, phone VARCHAR(20), course VARCHAR(100), password VARCHAR(255) NOT NULL, role ENUM('user', 'admin') DEFAULT 'user', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
4. پیکربندی اتصال به پایگاه داده در PHP
-
فایل کانفیگ پروژه را باز کنید (مثلاً
config.php
). -
اطلاعات اتصال به دیتابیس را وارد کنید:
php
<?php $host = 'localhost'; // یا آدرس سرور دیتابیس $db = 'registration_db'; $user = 'root'; // نام کاربری دیتابیس $pass = ''; // رمز عبور دیتابیس $charset = 'utf8mb4'; $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]; try { $pdo = new PDO($dsn, $user, $pass, $options); } catch (PDOException $e) { throw new PDOException($e->getMessage(), (int)$e->getCode()); } ?>
5. اجرای پروژه در مرورگر
-
وب سرور خود را اجرا کنید (مثلاً در XAMPP روی دکمه Start برای Apache و MySQL کلیک کنید).
-
مرورگر را باز کنید و آدرس پروژه را وارد کنید:
arduino
http://localhost/registration_system/
-
صفحه اصلی سیستم ثبتنام آنلاین باید نمایش داده شود.
6. نحوه کار با سیستم
-
با فرم ثبتنام، یک حساب کاربری جدید ایجاد کنید.
-
سپس میتوانید به بخش مدیریت یا نمایش لیست کاربران بروید (در صورت پیادهسازی سطح دسترسی).
-
اطلاعات ثبتنام شده را مشاهده، ویرایش یا حذف کنید.
7. نکات تکمیلی
-
در صورت بروز خطا، فایلهای لاگ وب سرور و PHP را بررسی کنید.
-
اگر از فریمورک یا کتابخانه خاصی استفاده میکنید، دستورالعمل نصب آن را نیز دنبال کنید.
-
در محیطهای واقعی، حتماً از HTTPS و تنظیمات امنیتی مناسب بهره ببرید.
در نهایت، طراحی و پیادهسازی یک سیستم ثبتنام آنلاین با PHP و MySQL نه تنها به شما کمک میکند مهارتهای برنامهنویسی خود را به سطح حرفهای برسانید، بلکه امکان ارائه یک ابزار کاربردی و قابل توسعه برای کسبوکارها و سازمانها را نیز فراهم میکند. سیستمهای آنلاین ثبتنام، فرآیندهای سنتی کاغذی و زمانبر را حذف کرده و موجب افزایش دقت، سرعت و رضایت کاربران میشوند. این پروژه نمونهای عالی برای یادگیری اصول مهم برنامهنویسی وب، امنیت دادهها و کار با پایگاه داده است.
فراموش نکنید که امنیت در سیستمهای ثبتنام آنلاین بسیار حیاتی است. محافظت از دادههای کاربران و جلوگیری از نفوذهای احتمالی باید همیشه در اولویت قرار گیرد. استفاده از روشهای رمزنگاری قوی برای پسوردها، جلوگیری از تزریق کدهای مخرب و اعتبارسنجی کامل دادهها در سمت سرور، از جمله مهمترین نکات امنیتی هستند که در این پروژه رعایت شدهاند. همچنین توصیه میشود پس از توسعه، سیستم را تحت تستهای امنیتی و بارگذاری قرار دهید تا عملکرد و امنیت آن تضمین شود.
این پروژه علاوه بر کاربرد عملی، یک نقطه شروع عالی برای توسعهدهندگانی است که میخواهند سیستمهای بزرگتر و پیچیدهتری بسازند. با درک ساختار و نحوه کار این سیستم، میتوانید به راحتی قابلیتهای پیشرفتهتری مانند ارسال ایمیل تأیید، بازیابی رمز عبور، گزارشگیری پیشرفته و حتی اتصال به سرویسهای پرداخت آنلاین را به آن اضافه کنید. توسعه تدریجی و ماژولار این پروژه باعث میشود مدیریت آن سادهتر و قابلیت نگهداری آن افزایش یابد.
در پایان، امیدوارم این آموزش و سورس کد ارائه شده بتواند به شما در مسیر یادگیری برنامهنویسی PHP و ساخت پروژههای کاربردی کمک کند. اگر سوالی داشتید یا نیاز به راهنمایی بیشتری در مورد این پروژه داشتید، خوشحال میشوم در بخش نظرات پاسخگو باشم. همچنین اگر علاقهمند به پروژههای مشابه یا آموزشهای تخصصیتر هستید، پیشنهاد میکنم سایر مطالب سایت را دنبال کنید تا بتوانید دانش خود را روزبهروز گستردهتر و عمیقتر کنید.