با سلام، در قسمت قبل در رابطه با مباحث اولیه ی اتصال با 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()); }
در جلسه ی قبل در مورد credentials توضیحاتی ارائه دادیم و تک تک موارد را کامل کردیم. در این قسمت به سراغ connection options می رویم.
در قسمت بعد از 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) تحویل می دهند.تا اینجا قسمت 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) می کنیم تا حتی کوچکترین احتمالی هم از نمایان شدن اعتبارات ما برای کسی وجود نداشته باشد.
تا به اینجای کار یک 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
: متاسفانه این آپشن به صورت کیلویی در آموزش های آنلاین استفاده می شود! اما این گزینه نه تنها مزیتی برای وب سایت های کوچک و عادی ندارد، بلکه معایب بسیاری را شامل می شود (توضیح این معایب از موضوع این جلسه خارج است). تنها زمانی از این گزینه استفاده کنید که تحقیقات بسیاری روی آن انجام داده اید و آن را برای کار خود مناسب دیده اید.با جمع زدن مطالب این جلسه و جلسه ی قبل، می توانیم یک اتصال خوب و فنی به پایگاه داده داشته باشیم. موارد کیفی و امنیتی در این اتصال نیز ذکر شد و امیدواریم از آن استفاده ی کافی برده باشید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.