در مطلب برنامه نویسی پایگاه داده در PHP با PDO – بخش نخست تلاش کردیم نشان دهیم که درک و شناسایی سیستم در برنامه نویسی تحت وب (با هر زبانی) به اندازه خود برنامه نویسی اهمیت دارد و زمانی که شما سیستم و موجدیت ها و روابط میان آنها را بشناسید و به روی زبان SQL نیز آشنا باشید، دیگر نیمی از راه را رفته اید. پی اچ پی از پایگاه داده های رابطه ای متفاوتی مانند ‌MySQL و PostgreSQL و Oracle و SQL Server پشتیبانی می کند.  همچنین کتابخانه های متفاوتی مانند MySQL و MySqli و PDO برای ارتباط به پایگاه داده و دریافت پاسخ از پایگاه داده وجود دارند. MySql مبتنی بر تابع ها (غیر شی گرا) بود و دیگر توسط گروه توسعه دهندگان پی اچ پی پشتیبانی نمی شود.

با MySqli می توانیم به صورت تابع یا شی گرایی برنامه نویسی دسترسی وب داشته باشیم. مشکل مهم با MySqli این است که از آن تنها می توانیم برای دسترسی به پایگاه داده MySQL استفاده کنیم. استفاده از پی اچ پی در کنار MySQL بسیار رایج است و هاست های اشتراکی که همراه با سی پنل (یا هر پنل دیگری) خریداری می کنید، از پایگاه داده MySQL استفاده می کند.

بنابراین در این صورت برای استفاده از MySqli مشکلی ندارید. ولی فرض کنید که برنامه را برای MySQL نوشتید و حال لازم است که از MySQL به Oracel یا SQL Server مهاجرت کنید، پس دیگر کدهای مربوط به ارتباط با پایگاه داده قابل اجرا شدن نیستند، زیرا کدها را با MySqli نوشتیم که قابل استفاده شدن با Oracle نیست. راهکار اول نصب درایور پایگاه داده اوراکل برای پی اچ پی روی سرور است و سپس باید تمامی کدهای مربوط به تعامل با پایگاه داده را تغییر دهیم.

توسعه دهندگان پی اچ پی راهکار دیگری را به نام PDO (کوتاه شده ) فراهم کرده اند که با ویژگی های شی گرایی اجازه می دهد شما کدهای تعامل با پایگاه داده را یک بار نوشته ولی بتوانید کدها برای بیشتر پایگاه داده های قابل پشتیبانی توسط PDO اجرا کنید. در اینجا می توانید فهرست تمامی پایگاه داده های قابل پشتیبانی را بخوانید. همچنین می توانید از اینجا در مورد درایورهای پی اچ پی برای MySQL و از اینجا برای تمامی پایگاه داده های قابل پشتیبانی بخوانید.

برنامه نویسی با PDO بسیار ساده است و تنها باید با زبان SQL آشنایی داشته باشید تا بتوانید از جدول های درون پایگاه داده داده ها را واکشی یا داده ها را درون آن ذخیره کنید. بنابراین پیشنهاد می کنیم اگر با برنامه نویسی SQL آشنایی ندارید، پیش از هر چیز آن را یاد بگیرید. برای این منظور می توانید از دوره برنامه نویسی SQL در سایت استفاده کنید. در ادامه چگونگی اتصال به پایگاه داده توسط PDO را آموزش داده ایم. در این دوره ما از MySQL استفاده می کنیم ولی شما می توانید از هر پایگاه داده دیگری نیز استفاده کنید. در مطلب های پیش رو چگونگی اجرای کوئری ها را آموزش داده و در ادامه با نوشتن برنامه ساده، چهار عمل اصلی CRUD (یا Create – Read – Update – Delete) را آموزش داده ایم.

ایجاد رشته اتصال برای ارتباط به پایگاه داده

نخستین گام برای ارتباط با پایگاه داده، تعیین رشته اتصال (Connection String) است که پارامترهای متفاوت برای اتصال را مشخص می کند. یکی از پارامترها، آدرس IP یا نام دامنه ای است که سرور پایگاه داده روی آن اجرا می شود. در MySQL معمولا آدرس را localhost تعیین می کنند زیرا سرور MySQL در همان سروری اجرا می شود که پی اچ پی و اسکریپت های آن در همان ماشین قرار دارند. پارامتر دیگری که باید تعیین شود ولی تعیین آن اختیاری است، شماره پورتی است که MySQL درون سرور به آن گوش می دهد. شماره پورت پیش فرض MySQL عدد 3306 است. توجه کنید اگر سرور شما روی همین شماره به درخواست های MySQL گوش می دهد، نیازی به نوشتن و تعیین آن در رشته اتصال ندارید ولی اگر شماره پورت متفاوت است، حتما و حتما لازم است که درون رشته اتصال نوشته شود.

برای اتصال به پایگاه داده باید نام کاربری و گذرواژه ای (پسورد) را درون رشته اتصال تعیین کنیم که این حساب کاربری مجوزهای لازم برای اجرای کوئری ها را بر روی جدول ها و دیگر اشیا درون پایگاه داده داشته باشد. در کنار تعیین حساب کاربری، باید نام پایگاه داده ای را تعیین کنیم که داده ها در آن ذخیره شده اند و حساب کاربری نیز مجوزهای لازم برای اجرای کوئری را بر روی آن دارد.

در کدهای زیر ابتدا دو متغیر به نام های user$ و pass$ ایجاد کرده ایم که هر دو مقدار رشته ای را نگه می دارند که به ترتیب به نام کاربری و گذرواژه آن اشاره دارند. در اینجا از حساب مدیر MySQL، یعنی کاربر root استفاده شده است که اکیدا توصیه می شود در پنل هاست خود از تعیین کاربر root خود داری کنید. (توجه کنید که در ابتدای نام متغیرها و آرایه ها یا اشیا کلاس های متفاوت، کاراکتر $ باید نوشته شود)

در کد بالا به تابع سازنده کلاس PDO سه پارامتر فرستاده شده است که پارامترهای دوم و سوم به ترتیب همان نام کاربری و گذرواژه هستند. پارامتر اول نیز یک رشته است که از چندین بخش  به صورت parameter=value تشکیل شده است و هر بخش با یک کاراکتر سمی مالن از دیگری جدا شده است. ولی اگر دقت کنید، در ابتدا mysql نوشته شده و سپس کاراکتر : آورده شده است. در واقع در ابتدای رشته نام درایور (پایگاه داده ای که می خواهیم به وصل شویم) نوشته می شود که در کد بالا برای اتصال به MySQL عبارت mysql نوشته شده است.

سپس پارامتر host با مقدار localhost نوشته شده است که آدرس سرور را مشخص می کند. توجه کنید چون MySQL درون همین ماشین (Localhost) بر روی پورت پیش فرض در حال اجرا است، پس شماره پورت نوشته نشده است ولی مطابق الگوی زیر می توانید شماره پورت را پس از نام دامنه یا آدرس سرور بنویسد. در نهایت پس از پارامتر dbname نام پایگاه داده تعیین شده است. کد زیر الگوی پارامتر اول را نشان می دهد که اصطلاحا به این پارامتر (و الگوی زیر) DSN (کوتاه شده Database Source Name) گفته می شود.

PDO بیشتر پایگاه داده های رابطه ای را پشتیبانی می کند که می توانید از اینجا در مورد آن بخوانید. به طور نمونه برای اتصال به پایگاه داده PostgreSQL باید نام درایور برابر pgsql باشد، برای اتصال به پایگاه داده SQLite نام درایور باید برابر با sqlite باشد. در مطلب بعدی در مورد چگونگی راه اندازی PDO بیشتر صحبت شده است. بنابراین می توانیم کد بالا را به صورت خوانا تر زیر نیز بنویسیم که در آن رشته DSN درون یک متغیر جدا نگه داشته می شود. با اجرای کد زیر، متغیر (یا شی) dbh$، نمونه ای از کلاس PDO است، پس می توانیم به تمامی خصوصیت ها و متدهای کلاس PDO دسترسی داشته باشیم.

فهرست درایورهای فعال و نصب شده

PDO به صورت پیش فرض همراه پی اچ پی نصب خواهد شد و نیازی نیست که شما بخواهید آنرا نصب کنید ولی چیزی که می ماند، اینکه آیا درایور مورد نظر شما نصب و فعال شده است. در PDO به صورت پیش فرض باید درایورها، برای پایگاه داده های MySQL و SQLite فعال شده باشد ولی برای دیگر پایگاه داده ها باید آنها را از رهنمای مربوطه فعال کنید. به طور مثال از اینجا می توانید در مورد درایور sqlsrv برای پایگاه داده SQL Server مایکروسافت بخوانید.

در کلاس PDO از متد ()getAvailableDrivers و به صورت کد زیر می توانید فهرست درایورهای فعال کنونی را پیدا کنید. خروجی متد یک آرایه است که نام درایورهای فعال را نشان می دهد. در شکل زیر می بینید که در سیستم من، سه درایور mysql و pgsql و sqlite فعال هستند. در کد زیر از ()PDO::getAvailableDerivers  برای دسترسی به متد ()getAvailableDerivers استفاده شده است. دلیل استفاده از عملگر :: این است که می خواهیم بدون ایجاد یک شی یا نمونه از کلاس PDO، به یکی از عضوهای کلاس (خصوصیت یا متد) دسترسی داشته باشیم.