ویژگی تصویر

تابع real_connect() در PHP

  /  PHP   /  تابع real_connect() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع real_connect (یا متد mysqli::real_connect در سبک شیءگرا) در PHP برای برقراری اتصال دستی به سرور MySQL از طریق اکستنشن MySQLi استفاده می‌شود. این تابع زمانی کاربرد دارد که بخواهید قبل از اتصال، گزینه‌هایی مانند SSL یا تنظیمات سفارشی را پیکربندی کنید یا اتصال را به‌صورت مرحله‌ای و کنترل شده برقرار نمایید.

چرا از real_connect استفاده کنیم؟

  • قابلیت تنظیم گزینه‌ها (با mysqli_init و mysqli_options) قبل از اتصال.
  • امکان استفاده از پرچم‌های خاص (مثل MYSQLI_CLIENT_SSL، MYSQLI_CLIENT_COMPRESS).
  • کنترل بهتر بر مکانیزم اتصال در مقایسه با mysqli_connect ساده.
  • مناسب برای سناریوهای نیازمند SSL، زمان‌بندی اتصال و فرمان‌های اولیه (INIT_COMMAND).

امضای تابع و پارامترها

پارامترنوعتوضیح
hoststringنام میزبان یا آدرس آی‌پی سرور MySQL (می‌تواند ‘p:host’ برای اتصال persistent باشد)
userstringنام کاربری دیتابیس
passwdstringرمز عبور
dbnamestringنام دیتابیس (اختیاری)
portintپورت اتصال (مثلاً 3306)
socketstringمسیر سوکت یونیکس در صورت نیاز
flagsintپرچم‌های اتصال (مثل MYSQLI_CLIENT_SSL)

مثال پایه — سبک شیءگرا

$mysqli = mysqli_init();

if (!$mysqli) {
    die("mysqli_init failed");
}

if (!$mysqli->real_connect('127.0.0.1', 'user', 'pass', 'database', 3306)) {
    die("Connect error: " . mysqli_connect_error());
}

// استفاده از اتصال
$result = $mysqli->query("SELECT NOW()");
$row = $result->fetch_row();
echo $row[0];

$mysqli->close();

توضیح: در این مثال ابتدا mysqli_init فراخوانی می‌شود تا یک شیء mysqli اولیه ساخته شود. سپس real_connect برای برقراری اتصال با پارامترهای میزبان، کاربر، رمز عبور، نام دیتابیس و پورت مورد استفاده قرار می‌گیرد. اگر اتصال موفق نباشد، خطا با استفاده از mysqli_connect_error دریافت و برنامه متوقف می‌شود.

مثال: استفاده از SSL با real_connect

$mysqli = mysqli_init();

// تنظیم مسیر فایل‌های SSL
$mysqli->ssl_set('/path/client-key.pem', '/path/client-cert.pem', '/path/ca.pem', null, null);

// اگر می‌خواهید تایید سرور را نیز فعال کنید:
// mysqli_options($mysqli, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);

if (!$mysqli->real_connect('db.example.com', 'user', 'pass', 'secure_db', 3306, null, MYSQLI_CLIENT_SSL)) {
    die("SSL connect error: " . mysqli_connect_error());
}

// حالا اتصال با SSL برقرار است
$mysqli->close();

توضیح: قبل از فراخوانی real_connect از ssl_set برای مشخص کردن کلید، گواهی‌نامه و CA استفاده شده است. سپس با ارسال پرچم MYSQLI_CLIENT_SSL به real_connect، اتصال به صورت SSL برقرار می‌شود.

تفاوت real_connect با mysqli_connect

  • mysqli_connect تابعی سطح بالا و سریع برای اتصال ساده است؛ real_connect زمانی مفید است که نیاز به تنظیمات پیش از اتصال یا استفاده از ssl_set و mysqli_options دارید.
  • با real_connect می‌توانید مرحله‌ای و کنترل‌شده‌تر اتصال را مدیریت کنید.

پرچم‌های متداول (flags)

  • MYSQLI_CLIENT_SSL — استفاده از SSL
  • MYSQLI_CLIENT_COMPRESS — فشرده‌سازی بین کلاینت و سرور
  • MYSQLI_CLIENT_MULTI_STATEMENTS — اجازه اجرای چند دستور در یک کوئری

بهترین روش‌ها و نکات امنیتی

  • همیشه از prepared statements برای جلوگیری از SQL Injection استفاده کنید.
  • برای ارسال امن اطلاعات از SSL استفاده کنید و فایل‌های کلید/گواهی را در مسیرهای امن نگه دارید.
  • به جای چاپ مستقیم خطاهای دیتابیس در محیط تولید، آنها را لاگ کنید و پیام عمومی به کاربر نمایش دهید.
  • می‌توانید با mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) از استثناها (exceptions) برای مدیریت خطا استفاده کنید.

نمونه: فعال‌سازی گزارش خطا به‌صورت استثنا و استفاده از real_connect

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = mysqli_init();
try {
    $mysqli->real_connect('127.0.0.1', 'user', 'pass', 'db');
    $mysqli->set_charset('utf8mb4');
    // اعمال کوئری‌ها
} catch (mysqli_sql_exception $e) {
    // لاگ کردن خطا و مدیریت امن
    error_log($e->getMessage());
    // پیغام عمومی به کاربر
}

توضیح: با فعال‌سازی MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT، خطاهای MySQLi به صورت mysqli_sql_exception انداخته می‌شوند و می‌توانید آنها را در بلاک catch مدیریت کنید. همچنین پس از اتصال set_charset فراخوانی شده تا charset مناسب (مثلاً utf8mb4) تنظیم شود.

اشتباهات رایج و رفع آن‌ها

  • فراموش کردن فراخوانی mysqli_init زمانی که می‌خواهید گزینه‌هایی قبل از اتصال تنظیم کنید — در این حالت real_connect ممکن است مفید نباشد.
  • عدم بررسی مقدار بازگشتی real_connect — این تابع مقدار بولی برمی‌گرداند و باید خطاها بررسی شوند.
  • استفاده نامناسب از فایل‌های SSL یا مسیر نادرست — همیشه مسیرها و مجوزهای فایل را بررسی کنید.

نتیجه‌گیری

تابع real_connect یک ابزار قدرتمند برای برقراری اتصال به MySQL در PHP است که به شما امکان می‌دهد قبل از اتصال گزینه‌ها و پارامترهای امنیتی را تنظیم کنید. وقتی نیاز به تنظیمات پیشرفته مانند SSL یا پرچم‌های خاص دارید، real_connect بهترین انتخاب است؛ برای اتصالات ساده و سریع اما می‌توانید از mysqli_connect استفاده کنید. رعایت نکات امنیتی، استفاده از prepared statements و مدیریت مناسب خطاها بهترین شیوه‌ها برای استفاده ایمن و قابل‌اطمینان از این تابع هستند.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: