میخوای وارد بازار کار بشی و محصولات خودت رو بفرشی همین الان ثبت نام کن
0

اتصال به پایگاه داده – connection options قسمت ۳

۶۵ / ۱۰۰

سلام به شما همراهان و دوستان محترم سایت آموزشی و فروشگاهی مدرسه کدنویسی به دوره ی آموزش PDO خوش آمدید.

در این دوره قصد داریم شما را با اتصال به پایگاه داده – connection options قسمت ۳ به صورت کامل آشنا کرده و نحوه استفاده از آن را به شما آموزش دهیم پس با من همراه باشید


ساخت DSN برای اتصال

مثالی که در جلسه ی قبل به شما ارائه دادیم، کد زیر بود:

$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());
}

در جلسه ی قبل در مورد credentials توضیحاتی ارائه دادیم و تک تک موارد را کامل کردیم. در این قسمت به سراغ connection options می رویم.


connection options در PDO

در قسمت بعد از credentials باید آرایه ای داشته باشیم که ما نام آن را options گذاشته ایم. این آرایه شامل آپشن ها (موارد دلخواه) ای است که یا بسیار مهم هستند و یا تجربه ی کاری شما با PDO را بسیار بهتر می کنند. مواردی که در مثال بالا آورده ایم به ترتیب شامل آپشن های زیر هستند:

  • PDO::ATTR_ERRMODE : این یک آپشن بسیار ضروری است که همیشه باید روی PDO::ERRMODE_EXCEPTION تنظیم شده باشد. این گزینه به PDO می گوید هر زمانی که query ما به خطایی برخورد کرد، یک exception را throw کند. از شما انتظار می رود با مباحث throw/exception آشنا باشید. اگر نمی دانید این ها چه هستند در اینترنت سرچی بزنید. به طور خلاصه thow (به معنی پرتاب) و exception (به معنی استثنا) هستند و هنگام کار با خطا ها با آن ها کار می کنیم. اگر این آپشن به همین صورتی که گفته شد تنظیم شده باشد دیگر نیازی نیست که ما مانند mysql_query به صورت دستی کدی بنویسیم تا خطا را به ما نشان دهد. این موضوع به ما کمک بسیاری در حل مشکلات سیستم می کند.
  • PDO::ATTR_EMULATE_PREPARES : این گزینه به PDO می گوید که emulation mode را روشن کند یا خیر. این موضوع را در آینده مورد بحث قرار خواهیم داد اما باید بدانید که اکثر برنامه نویسان و محققان اعتقاد دارند به غیر از مواردی خاص، اگر از نسخه های PHP و MySQL به روز استفاده می کنید بهتر است این حالت را خاموش کنید، بعدا می توانید با استفاده از ()PDO::setAttribute در هنگام اجرا آن را به صورت دستی روشن کنید بنابراین جای نگرانی نیست. ما در این مثال این حالت را خاموش کرده (مقدار false) و بعدا توضیحات بیشتری ارائه خواهیم کرد.
  • PDO::ATTR_DEFAULT_FETCH_MODE : این گزینه تنها برای راحتی توسعه دهنده استفاده می شود. با اینکه همیشه می توانید هنگام صدا زدن تابع fetch آن را تعیین کنید (مثال: ;$row = $stmt->fetch(PDO::FETCH_ASSOC)) راحت تر است که از ابتدا آن را برای تمام حالت ها تنظیم کرده و سپس در هنگام کد نویسی، آن را برای موارد خاص تغییر دهید. همچنین هنگام استفاده از foreach جایی برای تعیین fetch mode نداریم، بنابراین بهتر است از همان ابتدا آن را تنظیم کنیم. مشهور ترین گزینه ها برای این آپشن، PDO::FETCH_ASSOC و PDO::FETCH_OBJ هستند که به ترتیب ردیف (row) های به دست آمده را در آرایه های متناظر (associative array) یا اشیاء(objects) تحویل می دهند.


مدیریت خطاها (Handling errors)

تا اینجا قسمت credentials (اعتبارات) و connection options (گزینه های اتصال) را توضیح دادیم. تنها قسمت باقی مانده در مثال ما، قسمت مدیریت خطا است که در کد زیر می بینید:

try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

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

اگر exception ای داشته باشیم که دریافت نشود (uncaught)، تبدیل به Fatal error در PHP خواهد شد. تا اینجای کار مشکلی نیست و ما به گزارش خطاها نیاز داریم تا بتوانیم مشکل برنامه را رفع کنیم اما این خطا شامل stack trace ای است که به خطا الصاق می شود.

این خطا در مورد PDO به این نحو عمل می کند که پارامتر های constructor را نیز به ما بر میگرداند؛ همانطور که می دانید این پارامتر ها همان اعتبارات ما (نام کاربری، رمز عبور و …) است. حتما می گویید که ما گزارش خطا (error reporting) را در وب سایت های واقعی غیر فعال می کنیم،

بنابراین اعتبارات ما به کسی نشان داده نمی شود. حرف شما درست است اما باز هم برای محکم کاری، exception مورد نظر را میگیریم (catch) و دوباره پرتاب (throw) می کنیم تا حتی کوچکترین احتمالی هم از نمایان شدن اعتبارات ما برای کسی وجود نداشته باشد.

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

تا به اینجای کار یک DSN ساختیم. پس از اینکه تمام این موارد را انجام دادیم، برای اتصال به پایگاه داده، باید از کلاس PDO یک شیء یا نمونه ایجاد می کردیم. برای ساخت این شیء به چهار پارامتر نیاز داشتیم که DSN پارامتر اول آن بود. پارامتر های بعدی user$ و pass$ و options$ بودند که در مثال بالا تعریف شدند.

ما برای ساخت این شیء از روش همیشگی و ساده ی ساخت اشیا با کلید new استفاده نکردیم و دلیل آن را در قسمت مدیریت خطاها (Handling errors) توضیح دادیم. بنابراین برای ساخت این شیء، آن را درون یک ساختار try..catch قرار دادیم:

try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

نباید ها

ما کارهایی که باید انجام دهیم را ذکر کردیم، اما کار هایی نیز وجود دارند که هیچ گاه نباید انجام شوند:

  • PDO::ATTR_PERSISTENT : متاسفانه این آپشن به صورت کیلویی در آموزش های آنلاین استفاده می شود! اما این گزینه نه تنها مزیتی برای وب سایت های کوچک و عادی ندارد، بلکه معایب بسیاری را شامل می شود (توضیح این معایب از موضوع این جلسه خارج است). تنها زمانی از این گزینه استفاده کنید که تحقیقات بسیاری روی آن انجام داده اید و آن را برای کار خود مناسب دیده اید.
  • استفاده از ()die و echo، یا هر نوع از اپراتور های خروجی، برای گرفتن exception ها: هیچ گاه پیام های خطا را بدون شرط به نمایش در نیاورید. همیشه از handler عمومی سایت استفاده کنید.


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

امیدواریم آموزش اتصال به پایگاه داده – connection options قسمت ۳ نیز برای شما مفید واقع شده باشد و ادامه سری آموزش اتصال شیء گرا به پایگاه داده ( PDO ) را دنبال کنید . برای مطالعه پست‌ها بیشتر ، ما را در مدرسه کدنویسی تلگرام  و یا در تی جوان اینستاگرام دنبال کنید.

نظراتتون رو زیر همین پست با ما به اشتراک بگذارید.
ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

×

سلام کاربر عزیز

هر سوالی دارید در این بخش هستیم تا شما رو راهنمائی کنیم

روی لوگومون کلیک کنید

× چطور میتونم کمکتون کنم؟