آموزش کوکی در PHP و کار با Cookieها

کوکی‌ها در PHP برای نگهداری اطلاعات متنی در مرورگر کاربر استفاده می‌شود. به لطف وجود کوکی‌هاست که پس از یک بار ورود به حساب ایمیل خود، دیگر نیازی به وارد کردن نام کاربری و رمز عبور در مراجعات بعدی نیست. در این مقاله نحوه کار Cookie در PHP را فهمیده و خواهیم توانست به طور حرفه‌ای از کوکی در PHP استفاده کنیم.

مطمئناً تا به حال وارد سایتی شده و تنظیماتی مخصوص خودتان را روی آن اعمال کرده‌اید. پس از مدتی که دوباره به آن سایت مراجعه می‌کنید، می‌بینید که تمام تنظیمات شما همچنان وجود دارد.

علاوه بر مثال ورود به ایمیل که در ابتدا گفتم، با زدن تیک «مرا به خاطر بسپار» در سایت‌های مختلف، در مراجعات بعدی، سایت شما را شناخته و دیگر نیازی به وارد کردن نام کاربری و رمز عبور نیست.

همان‌طور که می‌دانید پروتکل‌های تحت وب (نظیر HTTP)، پروتکل‌های بدون وضعیت (یا Stateless) هستند. یعنی این پروتکل‌ها وضعیت ارتباط را ذخیره نکرده و درخواست‌های کاربران را از هم تفکیک نمی‌کنند. سرور سایتی که در حال دریافت خدمات از آن هستید، بین شما و سایر کاربران هیچ تفاوتی قائل نمی‌شود!

برای اینکه بتوان وضعیت کاربران را بین یک سایت و کاربر رد و بدل کرد، باید از ویژگی‌های جانبی استفاده کنیم. برای این کار، همواره در هنگام ارسال درخواست‌ها از مرورگر به سایت مورد نظر، اطلاعاتی که لازم است تا ما شناسایی شویم را هم ارسال خواهیم کرد.

کوکی در PHP چیست ؟

احتمالاً تا به حال نام کوکی (Cookie) را شنیده‌اید! کجا ؟ بله دقیقاً! کلوچه‌هایی خوشمزه به نام کوکی! کلوچه‌های کوچک و شیرینی که معمولاً حاوی تکه‌های کاکائو و شکلات است! 🙂

کوکی در سایت و کامپیوتر

کوکی در سایت و کامپیوتر

کوکی‌ها در فضای وب و کامپیوتر هم می‌توانند به همین خوشمزگی باشند! کوکی در اصل یک فایل یا رشته متنی است. این متن نشان‌دهنده اطلاعاتی است که به وسیله‌ی آن وضعیت کاربر توسط سرور شناسایی می‌شود.

در اولین ارتباط سرور با کاربر، این اطلاعات توسط سرور ایجاد شده و برای مرورگر ارسال می‌شود. مرورگر آن‌ها را در کامپیوتر ذخیره می‌کند.

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

در مقاله‌ای در مورد نشست در PHP صحبت کردیم. در سشن‌ها اطلاعات را سمت سرور نگهداری می‌کردیم و با بسته شدن آخرین صفحه از سایت توسط کاربر، تمام اطلاعات از بین می‌رفت.

اما در کوکی‌ها، اطلاعات را سمت کاربر نگه می‌داریم. در نتیجه این اطلاعات تا زمانی منقضی شده یا توسط کاربر حذف شوند، باقی خواهند ماند.

نشست یا session در PHP

نشست یا session در PHP

 

با Cookie در PHP چه اطلاعاتی را می‌توان ذخیره کرد ؟

داده‌هایی که درون کوکی‌ها ذخیره می‌شوند به صورت رشته‌های متنی هستند. در نتیجه هر اطلاعاتی را که بتوان در قالب رشته نگهداری کرد، می‌توانیم به کمک کوکی‌ها در مرورگر کاربر نگه داریم.

 

ایجاد کوکی در PHP

برای ایجاد کوکی در زبان PHP از تابع setcookie() استفاده می‌شود. این تابع در تمام نسخه‌های PHP وجود داشته و می‌توان از آن به راحتی استفاده کرد.

setcookie( $name, $value, $expires, $path, $domain, $secure, $httponly );

این تابع 7 ورودی می‌گیرد که فقط آرگومان اول آن اجباری و بقیه اختیاری است. معمولاً برای ایجاد یک کوکی ساده، از سه آرگومان اول آن استفاده می‌شود اما با توجه به مورد کاربرد، می‌توان از سایر آرگومان‌ها نیز استفاده کرد.

آرگومان‌های تابع تعریف کوکی

  • نام ($name) : این آرگومان اجباری بوده و نام کوکی مورد نظرمان را مشخص می‌کند. در ادامه به وسیله همین ویژگی، کوکی را بررسی کرده و محتویات آن را می‌خوانیم.
  • مقدار ($value) : دومین آرگومان مشخص‌کننده مقدار مورد نظر ما برای ذخیره در کوکی می‌باشد. وارد کردن آن اختیاری است؛ اما اکثراً نیاز داریم که برای کوکی خود مقداری در نظر بگیریم.
  • انقضا ($expires): این ورودی از نوع int بوده و یک عدد است. مشخص کننده زمان انقضای کوکی‌ها در مرورگر کاربر است. پس از منقضی شدن کوکی در PHP، مرورگر آن را از روی کامپیوتر حذف کرده و دیگر آن را به سمت سرور ارسال نخواهد کرد.
  • مسیر ($path) : مشخص‌کننده مسیری از سایت است که کوکی در آن معتبر بوده و باید ارسال شود. اگر بخواهیم این کوکی در تمام سایت معتبر باشد، از علامت / استفاده کرده یا اصلاً آن را تعریف نمی‌کنیم.
  • دامنه ($domain) : دامنه سایتی که کوکی برای آن اعتبار دارد را مشخص می‌کند. اگر این آرگومان تعریف نشود، دامنه سایت ما (سایتی که برنامه PHP روی آن در حال اجراست) برای کوکی در نظر گرفته می‌شود.
  • امنیت ($secure) : این ورودی از نوع صفر و یک یا TRUE و FALSE است. اگر مقدار آن برابر TRUE باشد، کوکی‌ها فقط در ارتباطات https برای سایت ارسال می‌شوند.
  • فقط پروتکل HTTP ($httponly) : این ورودی هم از نوع درست یا غلط است و اگر فعال باشد کوکی مورد نظر فقط در ارتباط HTTP ارسال می‌شود و در سایر ارتباطات که توسط جاوا اسکریپت یا سایر پروتکل‌ها برقرار می‌شوند تبادل نخواهد شد.

 

ایجاد Cookie در PHP

تابع زیر را در ابتدا برنامه خود اجرا می‌کنیم.

setcookie( "email", "user@gmail.com", time() + 86400 );

پس از اجرای این یک خط، یک کوکی به نام email در مرورگر کاربر ذخیره می‌شود که مقدار user@gmail.com را دارا بوده و تا 24 ساعت اعتبار دارد.

معمولاً در مشخص کردن تاریخ انقضای کوکی از توابع کار با زمان در PHP استفاده می‌کنند. تابع time() زمان فعلی سیستم را به ثانیه نشان می‌دهد. ما مقدار آن را با 86400 ثانیه (معادل یک روز) جمع کرده و به عنوان زمان انقضای کوکی تعریف کرده‌ایم.

بیایید از آرگومان‌های بیشتری برای تعریف کوکی در PHP استفاده کنیم.

setcookie( "email", "user@gmail.com", time() + 86400 , "/accounts", "https://sabzdanesh.com" );

کوکی حاصل از این قطعه کد، فقط در مسیر /accounts سایت سبز دانش معتبر بوده و در دیگر مسیرها برای سرور ارسال نمی‌شود. مثلاً اگر کاربر در همین صفحه حضور داشته باشد، ما به کوکی email او دسترسی نخواهیم داشت، چون چیزی برای سایت ارسال نشده است.

 

کار با زمان در PHP

کار با زمان در PHP

 

تابع setcookie() باید قبل از ارسال اولین کاراکترها از سمت سرور برای کاربر صدا زده شود. در نتیجه از این تابع می‌بایست در ابتدای فایل و قبل از تگ <html> استفاده کرد.

 

استفاده از کوکی‌ها

در زبان برنامه نویسی PHP، کوکی‌ها در متغیر سراسری $_COOKIE نگه داشته می‌شوند. در هر کجای برنامه که بخواهیم به یک کوکی دسترسی داشته باشیم، می‌توان از این متغیر سراسری مثل یک آرایه در PHP استفاده کرد.

echo $_COOKIE[ $cookie_name ];

ورودی این متغیر دقیقاً همان نامی است که در هنگام ایجاد کردن کوکی با تابع setcookie() تعریف کرده‌ایم.

اگر کوکی با نامی که به دنبال آن می‌گردیم وجود نداشته باشد، اجرای خط بالا با خطا مواجه خواهد شد!

برای جلوگیری از بروز خطا در هنگام صدا زدن کوکی‌ها، بهتر است ابتدا وجود آن‌ها را بررسی کنیم. این کار را با استفاده از تابع isset() انجام می‌دهیم.

کوکی مورد نظرمان را به عنوان ورودی به این تابع می‌دهیم، اگر خروجی TRUE بود، کوکی وجود داشته و از طرف کاربر برایمان ارسال شده است.

if( isset( $_COOKIE[$cookie_name] ) ) {
    echo $_COOKIE[ $cookie_name ];
}

 

ترفند: دسترسی به کوکی در PHP

برای حرفه‌ای‌تر شدن برنامه‌ای که می‌نویسیم، بهتر است در هنگام ایجاد یک کوکی در PHP، ابتدا وجود داشتن آن را بررسی کنیم تا اگر قبلاً کوکی را تنظیم کرده بودیم، کار اضافه انجام ندهیم.

if( ! isset( $_COOKIE['email'] ) ) {
    setcookie( "email", "user@gmail.com", time() + 86400 );
}

همان‌طور که می‌دانید از علامت تعجب (!) برای منفی کردن نتیجه استفاده کرده‌ام.

برای دسترسی به کوکی در PHP می‌توان از متغیر سراسری $_REQUEST نیز استفاده کرد. این تابع تمام اطلاعات ارسال از سمت کاربر را در خود ذخیره می‌کند. برای مطالعه بیشتر در این مورد می‌توانید به مستندات انگلیسی آن مراجعه کنید.

 

تغییر کوکی‌های برنامه

گاهی اوقات نیاز داریم تا پس از ایجاد کوکی در PHP، مقدار آن‌ها را تغییر دهیم. برای این کار، به همان روش ایجاد کوکی اقدام می‌کنیم. با این تفاوت که مقدار جدید را به عنوان ورودی دوم تابع setcookie() می‌دهیم.

setcookie( "name", "sara", time() + 86400 );
// Changing the PHP Cookie
setcookie( "name", "omid" );

در این کد، من فقط مقدار کوکی را تغییر دادم. شما می‌توانید به دلخواه، زمان انقضا یا سیار ویژگی‌ها را نیز مجدداً تعریف کنید.

 

حذف کوکی PHP

در زبان PHP تابعی برای حذف مستقیم کوکی‌ها وجود ندارد! با استفاده از تابع setcookie() و تعریف ویژگی‌های خاص برای کوکی، می‌توانیم آن‌ها را حذف کنیم.

دو انتخاب برای حذف کوکی در PHP داریم:

  • مقدار کوکی مورد نظر را نامعتبر کنیم. این کار با جایگزینی یک مقدار نامعتبر یا خالی به جای مقدار فعلی آن انجام می‌شود.
  • زمان انقضای کوکی را زمانی در گذشته انتخاب کنیم؛ با این کار، کوکی بلافاصله پس از تغییر یافتن، حذف خواهد شد.

برای مثال، دو کوکی به نام‌های $name و $login_id به صورت زیر تعریف می‌کنیم تا بتوانیم نام کاربر و شناسه ورود او را تشخیص دهیم.

setcookie( "name"    , "omid",            time() + (86400 * 7) );
setcookie( "login_id", "5Sd12s6et9%8bsq", time() + (86400 * 7) );

حال اگر کاربر از برنامه ما خارج شود، بهتر است شناسه ورود (کوکی login_id) را نیز حذف کنیم.

در کد زیر مشابه روش اول (نامعتبر کردن مقدار کوکی) عمل کرده و مقدار شناسه را برابر یک رشته خالی قرار می‌دهیم.

setcookie( "login_id", "" );

اما اکثراً بهتر است که از روش دوم استفاده کرده و زمان انقضای کوکی را تغییر دهیم.

در قطعه کد زیر، هر دو روش را به صورت ادغامی انجام داده‌ام. این‌گونه از حذف شدن کوکی‌ها در کامپیوتر کاربر مطمئن‌تر خواهیم بود.

setcookie( "login_id", "" , time()-60 );

این جا، زمان منقضی شدن (Expire) کوکی را یک دقیقه قبل تنظیم کردیم. این زمان را می‌توانید به دلخواه، یک ساعت، یک روز یا حتی یک سال قبل هم تعیین کنید!

 

جمع‌بندی: کوکی در PHP

در این مقاله به هر آنچه در مورد کوکی‌های PHP باید می‌دانستید پرداختیم! از کوکی در PHP برای نگهداری اطلاعات در سمت کاربر استفاده می‌شود. به کمک cookieها می‌توانیم کاربران را تشخیص داده و یا اطلاعاتی نظیر شناسه ورود یا نام کاربری آن‌ها را تشخیص دهیم.

کوکی‌ها در مرورگر و سیستم کاربر ذخیره می‌شوند، در نتیجه قابل تغییر توسط کاربر یا به سرقت رفتن هستند. باید در هنگام کار با cookie در PHP نهایت دقت را به کار برد. مراقب باشید که داده‌های مهم و حیاتی (مانند رمز عبور کاربر) را در کوکی ذخیره نکنید.

اگر نیاز شد داده‌های مهم را در کوکی ذخیره کنید، بهتر است ابتدا آن‌ها را رمزنگاری کرده یا به شیوه‌ای درهم‌ریزی کرده و سپس از آن‌ها استفاده کنید.

از تابع setcookie() برای ایجاد کوکی، تغییر کوکی و حذف آن استفاده کردیم. همان‌طور که دیدیم، این تابع 7 ورودی دارد اما معمولاً به جز سه ورودی اول، از سایر آرگومان‌ها کمتر استفاده می‌شود.

کل تابع setcookie() همین است! به همین سادگی، و به همین خوشمزگی!