ساخت سیستم پیام خصوصی

ساخت سیستم پیام خصوصی با PHP

ساخت سیستم پیام خصوصی با PHP

سیستم‌های پیام خصوصی یکی از اجزای اساسی بسیاری از وب‌سایت‌ها و برنامه‌های کاربردی آنلاین هستند. این سیستم‌ها به کاربران اجازه می‌دهند تا به صورت خصوصی با یکدیگر ارتباط برقرار کنند. در این مقاله، به بررسی مراحل ساخت یک سیستم پیام خصوصی ساده با استفاده از PHP خواهیم پرداخت. این سیستم شامل قابلیت‌های ارسال، دریافت، نمایش و مدیریت پیام‌ها خواهد بود.

۱. طراحی پایگاه داده

اولین قدم در ساخت سیستم پیام خصوصی، طراحی پایگاه داده است. ما به دو جدول اصلی نیاز داریم: جدول کاربران و جدول پیام‌ها.

  • جدول کاربران (users): این جدول اطلاعات کاربران را ذخیره می‌کند.
    • id (INT, PRIMARY KEY, AUTO_INCREMENT): شناسه یکتای کاربر
    • username (VARCHAR(255)): نام کاربری
    • password (VARCHAR(255)): رمز عبور (بهتر است هش شده ذخیره شود)
    • email (VARCHAR(255)): آدرس ایمیل
  • جدول پیام‌ها (messages): این جدول پیام‌ها را ذخیره می‌کند.
    • id (INT, PRIMARY KEY, AUTO_INCREMENT): شناسه یکتای پیام
    • sender_id (INT): شناسه فرستنده (کلید خارجی به جدول users)
    • receiver_id (INT): شناسه گیرنده (کلید خارجی به جدول users)
    • message (TEXT): متن پیام
    • timestamp (TIMESTAMP): زمان ارسال پیام
    • is_read (BOOLEAN): نشان‌دهنده خوانده یا نخوانده بودن پیام (0 برای نخوانده، 1 برای خوانده)

ارتباط بین این دو جدول از طریق کلیدهای خارجی (sender_id و receiver_id در جدول messages) برقرار می‌شود.

۲. ایجاد اتصال به پایگاه داده

برای تعامل با پایگاه داده، نیاز به ایجاد یک اتصال داریم. در PHP، می‌توان از PDO (PHP Data Objects) برای این منظور استفاده کرد. مثال:

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}
?>

به جای مقادیر نمونه، اطلاعات اتصال به پایگاه داده خود را وارد کنید.

۳. پیاده‌سازی ارسال پیام

برای ارسال پیام، باید یک فرم HTML ایجاد کنیم که به یک اسکریپت PHP ارسال شود. اسکریپت PHP مسئول دریافت اطلاعات فرم، اعتبارسنجی آن و درج پیام در پایگاه داده است.

فرم HTML:

<form action="send_message.php" method="post">
  <label for="receiver_id">گیرنده:</label>
  <select name="receiver_id">
    <?php
      // کد PHP برای نمایش لیست کاربران
      // اتصال به پایگاه داده و دریافت لیست کاربران
      // ایجاد گزینه‌های select بر اساس لیست کاربران
    ?>
  </select>
  <br>
  <label for="message">پیام:</label>
  <textarea name="message" rows="4" cols="50"></textarea>
  <br>
  <input type="submit" value="ارسال">
</form>

اسکریپت PHP (send_message.php):

<?php
// اتصال به پایگاه داده (همانند مرحله ۲)

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $receiver_id = $_POST["receiver_id"];
    $message = $_POST["message"];
    $sender_id = // شناسه کاربر فعلی (مثلاً از session دریافت شود)

    // اعتبارسنجی ورودی‌ها (مثلاً بررسی خالی نبودن)

    $stmt = $pdo->prepare("INSERT INTO messages (sender_id, receiver_id, message, timestamp, is_read) VALUES (?, ?, ?, NOW(), 0)");
    $stmt->execute([$sender_id, $receiver_id, $message]);

    echo "پیام با موفقیت ارسال شد.";
}
?>

۴. پیاده‌سازی دریافت و نمایش پیام‌ها

برای دریافت و نمایش پیام‌ها، باید یک اسکریپت PHP ایجاد کنیم که پیام‌های مربوط به کاربر فعلی را از پایگاه داده دریافت کرده و آن‌ها را نمایش دهد.

اسکریپت PHP (inbox.php):

<?php
// اتصال به پایگاه داده (همانند مرحله ۲)

$user_id = // شناسه کاربر فعلی (مثلاً از session دریافت شود)

$stmt = $pdo->prepare("SELECT sender_id, message, timestamp, is_read FROM messages WHERE receiver_id = ? ORDER BY timestamp DESC");
$stmt->execute([$user_id]);

$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);

// نمایش پیام‌ها
foreach ($messages as $message) {
    echo "<div>";
    echo "از: " . // نام فرستنده (دریافت از جدول users با استفاده از sender_id) . "<br>";
    echo "پیام: " . $message['message'] . "<br>";
    echo "زمان: " . $message['timestamp'] . "<br>";

    if ($message['is_read'] == 0) {
        echo "<span style='color:red;'>جدید</span>";
    }

    echo "</div>";

    // علامت‌گذاری پیام به عنوان خوانده شده
    $stmt = $pdo->prepare("UPDATE messages SET is_read = 1 WHERE id = ?");
    $stmt->execute([$message['id']]);
}
?>

۵. مدیریت پیام‌ها (حذف، آرشیو)

علاوه بر ارسال و دریافت پیام‌ها، ممکن است نیاز به قابلیت‌های مدیریت پیام‌ها مانند حذف یا آرشیو کردن داشته باشید. این قابلیت‌ها را می‌توان با افزودن دکمه‌ها یا لینک‌هایی در صفحه نمایش پیام‌ها و ایجاد اسکریپت‌های PHP مربوطه پیاده‌سازی کرد.

مثال: حذف پیام

در صفحه نمایش پیام‌ها، یک لینک یا دکمه برای حذف پیام اضافه کنید:

<a href="delete_message.php?id=" . $message['id'] . ">حذف</a>

اسکریپت PHP (delete_message.php):

<?php
// اتصال به پایگاه داده (همانند مرحله ۲)

if (isset($_GET['id'])) {
    $message_id = $_GET['id'];

    // بررسی اینکه آیا کاربر اجازه حذف این پیام را دارد یا خیر (مثلاً بررسی اینکه آیا فرستنده یا گیرنده پیام است)

    $stmt = $pdo->prepare("DELETE FROM messages WHERE id = ?");
    $stmt->execute([$message_id]);

    header("Location: inbox.php"); // بازگشت به صفحه صندوق ورودی
    exit();
}
?>

۶. نکات امنیتی

امنیت یکی از مهم‌ترین جنبه‌های ساخت سیستم پیام خصوصی است. در اینجا چند نکته امنیتی مهم آورده شده است:

  • هش کردن رمز عبور: رمز عبور کاربران را به صورت هش شده در پایگاه داده ذخیره کنید.
  • اعتبارسنجی ورودی‌ها: تمام ورودی‌های کاربر را اعتبارسنجی کنید تا از حملات تزریق SQL و XSS جلوگیری شود.
  • جلوگیری از حملات CSRF: از توکن‌های CSRF برای جلوگیری از حملات Cross-Site Request Forgery استفاده کنید.
  • استفاده از PDO: از PDO برای تعامل با پایگاه داده استفاده کنید، زیرا این کتابخانه از پارامترهای آماده‌سازی شده (prepared statements) پشتیبانی می‌کند که به جلوگیری از حملات تزریق SQL کمک می‌کند.
  • محدود کردن دسترسی: اطمینان حاصل کنید که کاربران فقط به پیام‌های خود دسترسی دارند.

۷. بهبودها و قابلیت‌های اضافی

سیستم پیام خصوصی که در این مقاله شرح داده شد، یک سیستم ساده است. می‌توان با افزودن قابلیت‌های اضافی، آن را بهبود بخشید. برخی از این قابلیت‌ها عبارتند از:

  • پشتیبانی از فایل: امکان ارسال فایل همراه با پیام‌ها
  • اعلان‌ها: نمایش اعلان‌ها برای پیام‌های جدید
  • جستجو: امکان جستجو در پیام‌ها
  • چت آنلاین: پیاده‌سازی چت آنلاین با استفاده از WebSocket
  • گروه‌های چت: ایجاد گروه‌های چت برای ارتباط گروهی

این مقاله یک راهنمای کلی برای ساخت سیستم پیام خصوصی با PHP است. با توجه به نیازهای خاص خود، می‌توانید این سیستم را سفارشی‌سازی و بهبود بخشید.