سلام استاد ممنون از اموزش خوبتون
استاد تفاوت fetch و fetchAll و اینکه چه موقع هایی از هرکدوم باید استفاده کرد رو میگین؟؟؟
با سلام و احترام.
زمانی که می خواهید یک رکورد رو دریافت کنید، از fetch استفاده کنید.
با هر بار اجرای fetch اون رکورد هایی رو که مد نظرتونه رو دونه دونه بهتون میده.
مثلا اگر لیست کاربران رو بخواهید، با هر بار اجرای fetch دونه دونه اطلاعات هر کاربر رو به ترتیب بهتون میده.
و در آخر اگر رکوردی برای نمایش باقی نمونده باشه بهتون null بر میگردونه (یا فکر کنم یک آبجکت یا آرایه خالی یادم نیست).
برای نمایش همه ی اطلاعات می تونید از حلقه while استفاده کنید.
$users = [];
while ($user = statement->fetch()) {
array_push($users, $user);
}
var_dump($users);
خط اول یک آرایه به نام users تعریف کردیم تا رکورد هارو داخلش قرار بدیم.
در خط دوم اطلاعات گرفته میشه و داخل متغیر user ریخته میشه.
یکی از قابلیت های خوب پی اچ پی اینه که در اکثر مواقع میاد به صورت خودکار داده هارو تبدیل می کنه.
برای اینکه بدنه حلقه اجرا شه باید بهش boolean بدید، اگر صحیح باشه اجرا میشه و اگر نباشه اجرا نمیشه.
وقتی بهش داده از نوع دیگری بدید سعی می کنه تبدیل کنه به boolean و بر اساس اون تصمیم بگیره.
پی اچ پی به داده نگاه می کنه و بسته به داده ای که دادید اون رو به true یا false تبدیل می کنه.
مثلا اگر عدد ۰ بدید به false تبدیل میشه.
در لینک زیر مستندات پی اچ پی بیشتر توضیح داده:
https://www.php.net/manual/en/language.types.boolean.php
به عنوان مثال فرض کنید ۲ کاربر دارید:
۱. رکورد اول رو دریافت می کنه و داخل متغیر user ریخته میشه.
و چون متغیر user داخلش محتوایی هست به true تبدیل میشه.
۲. بدنه شرط اجرا میشه و محتویات user به users افزوده میشه.
۳. رکورد دوم داخل متغیر user ریخته میشه.
۴. مانند مرحله دوم دوباره اطلاعات رو اضافه می کنه.
۵. دوباره fetch فراخوانی میشه اما چون ۲ کاربر بیشتر نداشتیم fetch مقدار خالی بر میگردونه و به false تبدیل میشه و دیگه شرط اجرا نمیشه.
۶. در آخر محتویات رو نمایش میده.
اگر چند تا رکورد دارید و می خواهید واکشی کنید، fetchAll کار شمارو راحت تر می کنه و نیازی نیست حلقه بزنید و خودش این کارو انجام میده و همه ی رکورد هارو بهتون تحویل میده.
البته اگر چند رکورد دارید، زمانی که دارید از foreach استفاده می کنید اگر قبلش fetchAll رو فراخوانی نکرده باشید و روی آبجکت PDOStatement حلقه بزنید خودش میاد براتون رکورد هارو دریافت می کنه و روی رکورد هاتون پیمایش میکنه پس اگر در این حالت بهتون ارور نمیده چیز عادی هستش.
نتیجه گیری:
یک رکورد -» fetch
چند رکورد -» fetchAll
موفق باشید.
ممنون از توضیح جامع شما
با سلام خدمت شما همراه عزیز
دوستمون درست فرمودن
موفق و سربلند باشید