خیلی وقتها سریع یک فرم «ارتباط با ما» مینویسیم، ولی اگر درست هندل نشه، پر از مشکل امنیتی و باگ میشه؛ از 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