TGViewer
| کانال توسعه‌دهندگان PHP | | کانال توسعه‌دهندگان PHP | @developixphp · 1.68K subscribers
Post #93 772
📨 ساخت یک فرم تماس امن با PHP 8 و PDO

خیلی وقت‌ها سریع یک فرم «ارتباط با ما» می‌نویسیم، ولی اگر درست هندل نشه، پر از مشکل امنیتی و باگ می‌شه؛ از SQL Injection گرفته تا اسپم و خطاهای عجیب. امروز یه نمونه‌ی خیلی کاربردی و مدرن با PHP 8 + PDO رو مرور می‌کنیم.

این ایده برگرفته از نمونه‌های رسمی و Best Practiceهای مستندات PHP و PDO هست:
php.net/manual/en/book.pdo.php

🔹 سناریو
فرض کن یه فرم ساده داریم: name، email و message. می‌خوایم داده‌ها رو:

• ولیدیت اولیه کنیم (خالی نبودن، ایمیل معتبر)
• امن ذخیره کنیم داخل MySQL با Prepared Statement
• خطاها رو لاگ کنیم، نه اینکه به کاربر Error خام نشون بدیم

🔹 ساخت جدول MySQL (یک‌بار روی DB اجرا کن)
CREATE TABLE contacts (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL,
message TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


🔹 فایل process_contact.php
این نمونه از strict types، PDO و Exception Handling استفاده می‌کنه؛ مناسب PHP 8 به بالا:

<?php

declare(strict_types=1);

$dsn = 'mysql:host=127.0.0.1;dbname=demo_app;charset=utf8mb4';
$user = 'demo_user';
$pass = 'demo_pass';

try {
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
} catch (PDOException $e) {
error_log('DB connection failed: ' . $e->getMessage());
http_response_code(500);
exit('Server Error');
}

$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$message = trim($_POST['message'] ?? '');

$errors = [];

if ($name === '') {
$errors[] = 'نام الزامی است.';
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = 'ایمیل نامعتبر است.';
}

if ($message === '') {
$errors[] = 'متن پیام را وارد کنید.';
}

if ($errors) {
http_response_code(422);
echo implode("\n", $errors);
exit;
}

$sql = 'INSERT INTO contacts (name, email, message) VALUES (:name, :email, :message)';
$stmt = $pdo->prepare($sql);

$stmt->execute([
':name' => $name,
':email' => $email,
':message' => $message,
]);

echo 'پیام شما با موفقیت ثبت شد.';


✨ چند نکته‌ی ریز اما مهم

• استفاده از charset=utf8mb4 برای ساپورت ایموجی و متن‌های ترکیبی.
• فعال‌کردن PDO::ERRMODE_EXCEPTION باعث می‌شه خطاها رو مثل آدم مدیریت کنیم، نه با die() و متن خام.
• filter_var برای Validation ایمیل ساده و قابل فهمه؛ برای پروژه‌های بزرگ‌تر می‌شه از کتابخونه‌های قوی‌تر استفاده کرد.
• حتماً خروجی خطا به کاربر عمومی باشه و لاگ کامل فقط در error_log ذخیره بشه.

🌱 این الگو یه اسکلت تمیز برای هر نوع فرم (ثبت‌نام، کامنت، تیکت) تو پروژه‌های PHP محسوب می‌شه. یک بار تمیز پیاده‌سازی بشه، بعد می‌تونی هی رویش توسعه بدی (CSRF token، Rate Limit, Recaptcha و غیره).

امتحانش کن، روی پروژه‌ی واقعی استفاده کن و اگر باگ یا ایده‌ی بهتری داشتی، با بقیه توسعه‌دهنده‌های PHP به اشتراک بذار 💻

🔖 #PHP #پی_اچ_پی #PHP #PDO #MySQL #Form_Handling #Validation #Backend #Web_Development

👤 Developix

💎 Channel: @DevelopixPHP
  • 👍 2
  • 👎 1
More from @developixphp
  1. Sep 26, 2026این کد موقع اجرا چه خروجی‌ای می‌ده و مشکلش کجاست؟ 🔖 #PHP #پی_اچ_پی 👤 Developix 💎 Channe…
  2. Sep 25, 2026🔥 پکیج: قراردادهای ترجمه سیمفونی اگر کد PHP را برای چندزبانگی می‌نویسید، بهتر است منطق بر…
  3. Sep 16, 2026🚀 &rlm;LaraGram Brain منتشر شد! از این به بعد برای ساخت ربات‌های تلگرام با فریم‌ورک LaraG…
  4. Sep 11, 2026ارسال ایمیل تأیید ثبت‌نام، بازیابی رمز عبور یا نوتیفیکیشن سفارش، تقریباً توی هر پروژه‌ PHP…
  5. Sep 10, 2026برنامه نویسی سوکت در PHP بخش اول عبارت دیگر در ارتباط های غیر سوکت برای ارسال یک پالس از س…
  6. Aug 31, 2026🔥 پکیج: استاندارد PSR-11 برای Container استاندارد PSR-11 فقط یه interface مشترک برای Cont…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →