اتصال به پایگاه داده PDO - Credentials در PHP

04 بهمن 1397
درسنامه درس 2 از سری آموزش PDO
PDO-connection

با سلام، در قسمت قبل در مورد مزایای PDO صحبت کردیم و به شما پیشنهاد استفاده از WAMP را (برای ویندوز) دادیم. در این قسمت کد نویسی را شروع کرده و برای هر مورد مثالی ذکر می کنیم.

پایگاه های داده ی تحت پشتیبانی

در جلسه ی قبل گفتیم که PDO می تواند به پایگاه های داده ی زیادی متصل شود. لیستی از این پایگاه های داده را در تصویر زیر می بینید:

پایگاه های داده ای که تحت پشتیبانی PDO هستند
پایگاه های داده ای که تحت پشتیبانی PDO هستند

اتصال به پایگاه داده با PDO

PDO از یک متد اتصال به نام DSN استفاده می کند. با اینکه این متد فاکتور پیچیده ای ندارد اما ممکن است برای تازه کار ها سر در گمی ایجاد کند، بنابراین من یک مثال کامل از این مسئله را با تمام توضیحات آن برای شما می آورم.

ابتدا باید بدانید DSN یک رشته است که جفت های parameter=value آن با (;) از هم جدا می شوند. همیشه باید از فرمت خاص خود این رشته پیروی کنید، بنابراین استفاده از فاصله ها (space) و quotation ها و ... الزامی ندارد.

تنها چیزی که باید آن را رعایت کنید استفاده از جدا کننده ی (;) بین جفت ها است. می توانید این مورد را در سایت PHP مشاهده کنید.

بنابراین برای اتصال به پایگاه داده، PDO از شما می خواهد سه نوع داده ی مختلف را به آن بدهید:

  • database driver و host و db (schema) name و charset باید داخل خود رشته ی DSN قرار بگیرند. موارد دلخواه دیگری مانند port و unix_socket نیز در این قسمت قرار خواهند گرفت.
  • username و password تحویل constructor داده می شوند.
  • موارد دلخواه دیگر داخل آرایه ی آپشن ها قرار می گیرند.

این موارد را به صورت کامل توضیح خواهم داد اما ابتدا باید با ساختار PDO به صورت کامل آشنا شویم.

ساختار کامل PDO به شرح زیر است:

PDO {
      __construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] ) 
	bool beginTransaction ( void ) 
	bool commit ( void ) 
	mixed errorCode ( void ) 
	array errorInfo ( void ) 
	int exec ( string $statement ) 
	mixed getAttribute ( int $attribute ) 
	static array getAvailableDrivers ( void ) 
	bool inTransaction ( void ) 
	string lastInsertId ([ string $name = NULL ] ) 
	PDOStatement prepare ( string $statement [, array $driver_options = array() ] ) 
	PDOStatement query ( string $statement ) 
	string quote ( string $string [, int $parameter_type = PDO::PARAM_STR ] ) 
	bool rollBack ( void ) 
	bool setAttribute ( int $attribute , mixed $value ) }mp($var_name);
}

حتما با خودتان می گویید کجای این آسان تر از mysqli است! اما صبر کنید! این ساختار کامل PDO است؛ به عبارت دیگر این ساختار شامل تمام گزینه های دلخواه و هر ورودی ممکن است.

ما در برنامه نویسی از اکثر این موارد استفاده نمی کنیم و ساختار کلی را جهت آشنایی شما با آن آورده ام تا اگر موردی نظرتان را جلب کرد آن را جست و جو کنید. در این ساختار تنها خط اول موضوع بحث امروز ماست.

به عقیده ی من بهترین راه یادگیری برنامه نویسی و اکثر مسائل در حرفه های مختلف با مثال است و هیچ چیز جای تجربه را نمی گیرد. بنابراین پر مصرف ترین موارد را بر اساس یک مثال کامل توضیح می دهم. ابتدا یک مثال ساده از اتصال به MySQL:

<?php
$dbhost = 'localhost';
$dbname='hr';
$dbuser = 'root';
$dbpass = '';
$dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
?>

نکات در رابطه با این مثال:

  • همانطور که در مثال میبینید، معمولا مرسوم است که موارد خواسته شده را در متغیر هایی قرار دهیم و سپس متغیر ها را به PDO تحویل دهیم. این روش، روش خوبی است چرا که اگر بعد ها بخواهید چیزی را عوض کنید (مثلا رمز پایگاه داده یا آدرس آن را) می توانید به سادگی مقدار متغیر را عوض کنید اما اگر عین مقادیر را در سورس کد خود نوشته باشید، باید تک تک آن موارد را پیدا کرده و به صورت دستی تغییر دهید.
  • با اینکه این دوره برای افراد مبتدی نوشته نشده است و شما باید این مسئله را بدانید اما باز هم تاکید می کنم، هیچ گاه هیچ گاه هیچ گاه نباید پایگاه داده ی شما دارای حساب کاربری root یا رمز root یا بدون رمز باشد. این اشتباه بزرگی است که هک شدن سایت شما یا حداقل پایگاه داده را بسیار آسان می کند. تمام این مقادیر پیش فرض باید عوض شوند.
  • زمانی که DSN را نوشته و می خواهیم اتصال با پایگاه داده را برقرار کنیم، یک شیء از PDO می سازیم. این روش بهترین روش اتصال است.
  • اگر از پایگاه های داده ی دیگری مثل PostgreSQL استفاده می کنید باید driver را تغییر دهید. database driver در واقع همان عبارت mysql است که تعیین می کند PDO قرار است به چه پایگاه داده ای متصل شود. مثال:
<?php
$dbuser = 'postgres';
$dbpass = 'abc123';
$host = 'localhost';
$dbname='postgres';
$dbh = new PDO("pgsql:host=$host;dbname=$dbname", $dbuser, $dbpass);
?>

در خط آخر دستور =pgsql:host به جای =mysql:host را به وضوح مشاهده می کنید. این یک مثال ساده برای درک ابتدایی اتصال با PDO بود اما حالا یک مثال کامل با چند آپشن معروف را برای شما می نویسم و بر اساس آن توضیحاتی ارائه می کنم:

$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

متغیر های ذکر شده در مثال بالا از این قرار اند:

  • host: آدرس هاست (سرور) شما است. اگر برای نوشتن کد به وب سرور واقعی متصل نیستید و از نرم افزار هایی مثل WAMP استفاده می کنید، این مقدار معمولا برابر 127.0.0.1 یا localhost است. اگر از یک سرور واقعی استفاده می کنید و روی آن برنامه نویسی می کنید باید آدرس دقیق هاست را در این قسمت وارد کنید. این آدرس در هنگام اجاره ی سرور به شما داده می شود، در غیر این صورت با مدیریت هاستینگ خود تماس بگیرید.
  • db: نام پایگاه داده (دیتابیس) شما است. در واقع این همان مقداری است که به عنوان پارامتر به دستور ()mysql_select_db می دادیم. اگر به صورت محلی کد نویسی می کنید (مثل استفاده از WAMP) این مقدار توسط خودتان تعیین می شود اما اگر روی سرور واقعی کار می کنید باید از مدیریت هاستینگ بخواهید این آدرس را به شما بدهند. البته در ایران اکثر این موارد به دست خود شما تنظیم می شود؛ زمانی که وارد سرور خود بشوید می توانید از قسمت phpMyAdmin یک پایگاه داده به دلخواه خود بسازید.
  • user: نام کاربری است که با آن می خواهید به پایگاه داده متصل شوید.
  • pass: رمز عبور مربوط به آن نام کاربری است (در این مثال برای سهولت خالی گذاشته شده اما شما هیچ گاه پایگاه داده را بدون رمز رها نکنید).
  • charset: مخفف character set و در واقع encoding ای است که PDO بر اساس آن با پایگاه داده ارتباط برقرار می کند. به عبارت ساده تر این گزینه می گوید با چه encoding ای داده ها را بفرستد و دریافت کند. به دلیل اینکه ما ایرانی هستیم و در پایگاه داده ی خود حتما از زبان فارسی استفاده می کنیم، این مقدار باید روی utf8mb4 باشد (مانند مثال بالا).

چرا از utf-8 استفاده نکنیم؟

پشتیبانی از utf-8 در PHP به صورت ناقص است و ممکن است با مشکلاتی مواجه شوید. بنابراین حتما به جای utf-8 از utf8mb4 استفاده کنید.

خلاصه ی این جلسه

تا اینجای کار شما با قسمت های مهم و اولیه ی DSN آشنا شدید و من نیز به دلیل طولانی نشدن و خسته کننده نبودن آموزش آن را همین جا تمام می کنم. در قسمت بعد آپشن های بیشتر و نکات بیشتری از مثال بالا را توضیح خواهیم داد.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش PDO توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما (2 دیدگاه)

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

محمد معین فیروزی
28 مرداد 1398
بسیار بسیار عالی!!!خیلی جامع و مفید بود.

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

امیر زوارمی
30 مرداد 1398
سلام دوست عزیز خوشحالم که از مقاله راضی بودید

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

پاشا
31 خرداد 1398
واقعا عالی

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

امیر زوارمی
01 تیر 1398
سلام دوست عزیز، خوشحالم که این مقاله مورد توجه شما بوده

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