در PDO برای اجرای یک کوئری می توانیم از متد ()PDO::query استفاده کنیم که یک رشته کوئری یا متغیری که رشته کوئری را در خود دارد را به عنوان ورودی دریافت می کند و سپس کوئری را اجرا و شی از نوع کلاس PDOStatement را برگشت می دهد. در کدهای زیر نخست فایل connection.php توسط تابع ()require_once به درون اسکریپت کنونی ضمیمه شده است. سپس یک متغیر به نام sql$ تعریف شده است که شامل رشته کوئری است که  ۱۰ سطر نخست جدول employees را واکشی می کند.

سپس متغیر sql$ به متد ()query فرستاده شده است تا کوئری اجرا شود. توجه کنید که توسط شی pdo$ که در مطلب برنامه نویسی پایگاه داده در PHP با PDO –  بخش چهارم و در فایل connection.php ایجاد کرده بودیم به متد ()query دسترسی پیدا کردیم زیرا متد ()query عضوی از کلاس PDO است. همچنین توجه کنید که شی result$ از نوع کلاس PDOStatement است.

سپس درون یک حلقه تکرار foreach و تا زمانی که رکوردی (سطری) درون متغیر (شی) result$ وجود دارد، هر سطر را می خوانیم و سپس درون متغیر row$ ذخیره می کنیم. در هر تکرار متغیر row$ به صورت یک آرایه انجمنی است که هر کلید آن نام یکی از ستون های جدول employees است. توجه کنید چون در کوئری از کاراکتر * استفاده شده است، پس خروجی شامل تمامی ستون ها است ولی اگر در کوئری نام ستون ها را دستی تعیین کنید، پس تنها همان ستون ها در هر تکرار درون متغیر آرایه انجمنی row$ ذخیره خواهند شد. در خط ۱۱ از کد بالا می بینید که توسط تابع ()sprint رشته خروجی در هر تکرار را آماده می کنیم در نهایت توسط تابع ()print هر رشته فرمت شده که در هر گام درون متغیر emp$ ذخیره می شود را چاپ می کنیم.

توجه کنید که دو تابع ()print و echo برای نمایش خروجی بر روی صفحه استفاده می شوند ولی تابع ()sprint برای فرمت کردن یا آماده سازی یک رشته استفاده می شود که درون رشته شامل مقدار یک تا چندین متغیر می شود که پس از آرگومان نخست فهرست می شوند. ترتیب جایگذاری مقدار متغیرها به جای کاراکترهای فرمت s% یا d% از سمت چپ به راست است و تعداد کاراکترهای فرمت با تعداد متغیرهای بعد رشته باید یکسان باشد.

توجه کنید رفتار پیش فرض متد ()query برگشت دادن آرایه انجمنی است به طوری که در مطلب آرایه نیز گفتیم هر اندیس هر عنصر درون آرایه انجمنی می تواند غیر عددی باشد که در این مطلب هر کلید نام ستون جدول است. اما می توانیم به عنوان پارامتر دوم متد ()query رفتار آنرا تعیین کنیم. در کدهای زیر روش تعیین دو گونه رفتار نشان داده شده است. حالت اول چون مقدار PDO::FETCH_ASSOC فرستاده شده است، پس برگشتی به صورت آرایه انجمنی است ولی در حالت دوم چون مقدار PDO::FETCH_OBJ فرستاده شده است، پس برای دسترسی به هر ستون و توسط نام ستون باید به روش دسترسی به عضوهای کلاس از طریق عملگر -> استفاده کنیم که در ادامه توضیح داده ایم.

همچنین توجه کنید که نام ستون ها به بزرگی و کوچکی حروف حساس است و بازهم تاکید می کنیم بسته به کوئری SELECT شما است که تعیین می کند آیا تمامی ستون در خروجی وجود دارند یا اینکه تنها برخی از ستون ها را در خروجی خواهید داشت. در کدهای زیر روش دیگری را نیز معرفی کرده ایم که از حلقه while استفاده شده است. شرط حلقه while که میان پرانتزها نوشته شده است، به این صورت است، تا مادامی که سطری از درون شی result$ و توسط متد ()fetch از کلاس PDOStatement قابل واکشی شدن (Fetch) است، آنرا درون متغیر row$ ذخیره می کند.

توجه کنید که بازهم در اینجا چون پارامتر دوم متد ()query را برابر با PDO::FETCH_OBJ تعیین کردیم، پس این بار از روش دسترسی به اعضای کلاس از طریق نام شی آن کلاس و عملگر <- استفاده شده است. در این حالت و با توجه به نام متغیر که row$ تعیین کرده ایم، باید از الگوی row->column_name$ استفاده شود.

متد ()fetch مربوط به کلاس PDOStatement است و تنها یک تک سطر را از درون متغیر result$ واکشی می کند. به عبارت دیگر در حلقه while و تا زمانی که سطری وجود داشته باشد، متد ()fetch می تواند یک به یک سطرها را خواندن و درون متغیر row$ قرار دهد که در هر گام متغیر row$ به صورت یک آرایه از ستون ها و مقدار آنها به ازای هر سطر خروجی است.

در کد زیر می خواهیم داده های یک تک سطر، که شامل کارمندی با شناسه کارمندی emp_no=10010 می شود را بدست آوریم. چون خروجی یک تک سطر است، پس نیازی به نمایش محتوای آرایه درون حلقه نیست و تنها تک سطر را توسط متد ()fetch واکشی کرده و سپس درون متغیر row$ ذخیره می کنیم در پایان آنرا نمایش می دهیم. توجه کنید که تنها سه ستون first_name و last_name و hire_date (تاریخ استخدام) را می خواهیم.

در کد بالا رشته کوئری درون متغیر sql$ را توسط عملگر =. به دو خط شکسته ایم تا نشان دهیم بهتر است برای کوئری های پیچیده تر از این که شامل الحاق (Join) جدول ها یا SELECT های تو در تو می شوند، بهتر است کوئری را به چندین خط بشکنیم ولی باید چندین مورد زیر را را رعایت کنید.

۱ – بهتر است رشته کوئری ها میان جفت کارکترهای Double Quote (یا کارکتر ” “) قرار بگیرند، زیرا در کوئری ها باید مقدار شرط را حتما میان جفت کارکترهای Single Quote ( کاراکترهای ‘ ‘) قرار دهید.

۲ – اگر می خواهید کوئری را به چندین خط بشکنید، حتما فاصله های لازم برای رعایت نحو (Syntax) کوئری های SQL را رعایت کنید. به پایان رشته خط ۵ نگاه کنید، می بینید که یک فاصله پس از نام جدول employees وجود دارد زیرا اصل کوئری به صورت کد زیر بوده است. به عبارت دیگر میان نام جدول و عبارت WHERE فاصله است و شما باید در اسکریپت پی اچ پی آنرا رعایت کنید زیرا عدم رعایت برای پی اچ پی مهم نیست ولی زمانی که کوئری به پایگاه داده فرستاده می شود، به جای پاسخ مناسب، خطا برگشت داده خواهد شد.

۳ – عملگر =. برای اتصال یک رشته به انتهای یک متغیر است، توجه کنید چون می خواهیم کوئری بنویسیم، پس باید رشته جدید را به انتهای همان متغیر sql$ اضافه کنیم. همچنین عملگر نقطه برای اتصال دو رشته به هم استفاده می شود.

گاهی مواقع باید درون برنامه خود تعداد رکوردهای برگشت داده شده را بررسی کنید تا خروجی مناسب را به کاربر نمایش دهید. در این چنین مواردی باید از متد ()rowCount از کلاس PDOStatement همانند کد زیر استفاده کنید. در کد زیر اگر یک یا چندین سطر برگشت داده شود، اول تعداد سطرهای برگشتی و سپس خود سطرها نشان داده می شوند که توسط تابع ()sprint فرمت شده اند.

توجه کنید متد ()query عضو کلاس PDO است و از طریق شی pdo$ که نمونه ای از کلاس PDO است به آن دسترسی پیدا کرده ایم. خروجی ()query از نوع کلاس PDOStatement است، پس شی result$ که خروجی ()query در آن نگه داشته می شود از نوع کلاس PDOStatement خواهد بود و از طریق آن می توانیم به عضو های کلاس PDOStatement مانند متدهای ()fetch و ()rowCount و همچنین متد دیگری به نام ()fetchAll دسترسی داشته باشیم.

در کد بالا از متد ()fetchAll استفاده شده است تا یکباره تمامی سطرهای برگشتی را درون متغیری به نام rows$ ذخیره کنیم و سپس درون یک حلقه foreach و تا مادامی که به سطر پایانی نرسیده باشد، در هر گام یک رشته از ستون های first_name و last_name و hire_date فرمت شده و به کار نمایش داده می شود. همچنین اگر هیچ سطری برگشت داده نشود، به این معنی که پایگاه داده بر اساس کوئری ورودی و شرط های آن سطری را پیدا نکرده باشد، پس خروجی متد ()rowCount صفر بوده وپیام Employees not found نشان داده می شود.