کوکیها در PHP برای نگهداری اطلاعات متنی در مرورگر کاربر استفاده میشود. به لطف وجود کوکیهاست که پس از یک بار ورود به حساب ایمیل خود، دیگر نیازی به وارد کردن نام کاربری و رمز عبور در مراجعات بعدی نداریم. در این مقاله نحوه کار Cookie در PHP را فهمیده و ترفندهای استفاده از کوکی در PHP را یاد میگیریم.
مطمئناً تا به حال وارد سایتی شده و تنظیماتی مخصوص خودتان را روی آن اعمال کردهاید. پس از مدتی که دوباره به آن سایت مراجعه میکنید، میبینید که تمام تنظیمات شما همچنان وجود دارد.
علاوه بر مثال ورود به ایمیل که در ابتدا گفتم، با زدن تیک «مرا به خاطر بسپار» در فرمهای PHP، در مراجعات بعدی، سایت شما را شناخته و دیگر نیازی به وارد کردن نام کاربری و رمز عبور نیست.
همانطور که میدانید پروتکلهای تحت وب (نظیر HTTP)، پروتکلهای بدون وضعیت (یا Stateless) هستند. یعنی این پروتکلها وضعیت ارتباط را ذخیره نکرده و درخواستهای کاربران را از هم تفکیک نمیکنند. سرور سایتی که در حال دریافت خدمات از آن هستید، بین شما و سایر کاربران هیچ تفاوتی قائل نمیشود!
برای اینکه بتوان وضعیت کاربران را بین یک سایت و کاربر رد و بدل کرد، باید از ویژگیهای جانبی استفاده کنیم. برای این کار، هنگام ارسال درخواستها از مرورگر به سایت مورد نظر، باید اطلاعات لازم برای شناسایی کاربر نیز ارسال شود.
فهرست محتوای آموزش
کوکی در PHP چیست ؟
احتمالاً تا به حال نام کوکی (Cookie) را شنیدهاید! کجا ؟ بله دقیقاً! کلوچههایی خوشمزه به نام کوکی! کلوچههای کوچک و شیرینی که معمولاً حاوی تکههای کاکائو و شکلات است! 🙂
کوکیها در فضای وب و کامپیوتر هم میتوانند به همین خوشمزگی باشند! کوکی در اصل یک فایل یا رشته متنی است. این متن نشاندهنده اطلاعاتی است که بهکمک آن وضعیت کاربر در سرور شناسایی میشود.
در اولین ارتباط سرور با کاربر، این اطلاعات توسط سرور ایجاد شده و برای مرورگر ارسال میشود. مرورگر آنها را در کامپیوتر ذخیره میکند.
پس از این اتفاق، هر بار که درخواست جدیدی از طرف کاربر برای سرور ارسال میشود، این اطلاعات (همان کوکیها) نیز به همراه درخواست، به سرور ارسال میشود.
اگر از قبل میدانید سشن در PHP چیست، میدانید که در سشنها اطلاعات را سمت سرور نگهداری میکنیم. با بسته شدن آخرین صفحه از سایت توسط کاربر، تمام اطلاعات از بین میرود.
اما در کوکیها، اطلاعات را سمت کاربر نگه میداریم. در نتیجه این اطلاعات تا زمان انقضا یا حذف توسط کاربر، باقی میمانند.
با Cookie در PHP چه اطلاعاتی را میتوان ذخیره کرد ؟
دادههایی که درون کوکیها ذخیره میشوند به صورت رشتههای متنی هستند. در نتیجه هر اطلاعاتی را که بتوان در قالب رشته نگهداری کرد، میتوانیم به کمک کوکیها در مرورگر کاربر نگه داریم.
ایجاد کوکی در PHP
برای ایجاد کوکی در زبان PHP از تابع setcookie()
استفاده میشود. این تابع در تمام نسخههای PHP وجود داشته و میتوان از آن به راحتی استفاده کرد. (اگر نمیدانید تابع چیست، آموزش تابع در 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 استفاده کنیم.
<?php
setcookie( "email", "user@gmail.com", time() + 86400 , "/college", "https://sabzdanesh.com" );
کوکی حاصل از این قطعه کد، فقط در مسیر /college
سایت سبز دانش معتبر بوده و در دیگر مسیرها برای سرور ارسال نمیشود. مثلاً اگر کاربر در همین صفحه حضور داشته باشد، ما به کوکی email او دسترسی نخواهیم داشت، چون چیزی برای سایت ارسال نشده است.
وقتی یک کوکی در PHP ایجاد میکنیم، محتوای آن هر چیزی میتواند باشد. یعنی حتماً نباید یک ایمیل در آن قرار دهیم، بلکه میتوان ترکیبی از چند دیتای مختلف که مورد نیازمان است را نیز ذخیره کنیم.
استفاده از کوکیها
در زبان برنامه نویسی PHP، کوکیها در متغیر سراسری $_COOKIE
نگه داشته میشوند. در هر کجای برنامه که بخواهیم به یک کوکی دسترسی داشته باشیم، میتوانیم از این متغیر مثل یک آرایه در PHP استفاده کنیم.
<?php
echo $_COOKIE[ $cookie_name ];
ورودی این متغیر دقیقاً همان نامی است که در هنگام ایجاد کردن کوکی با تابع setcookie()
تعریف کردهایم. اگر کوکی با نام مورد نظر وجود نداشته باشد، اجرای خط بالا با خطا مواجه خواهد شد!
برای جلوگیری از بروز خطا در هنگام صدا زدن کوکیها، بهتر است ابتدا وجود آنها را بررسی کنیم. این کار را با استفاده از تابع isset()
انجام میدهیم.
کوکی مورد نظرمان را به عنوان ورودی به این تابع میدهیم، اگر خروجی TRUE بود، یعنی کوکی وجود دارد و از طرف کاربر برایمان ارسال شده است.
<?php
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 صحبت کردهام.
تغییر کوکیهای برنامه
گاهی اوقات نیاز داریم تا پس از ایجاد کوکی در 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 ورودی دارد اما معمولاً به جز سه ورودی اول، از سایر آرگومانها کمتر استفاده میشود.
کل بحث کوکی همین است! به همین سادگی، به همین خوشمزگی! پیشنهاد میکنم برای خودتان چند نمونه از کارهایی که میتوانید با کوکیها انجام دهید را مثال بزنید. اگر ایدههایتون رو با سایر دوستانتون در بخش دیدگاهها اشتراک بذارید هم خیلی عالی میشه! 🙂
این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش PHP
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم
سلام
خدا قوت
خیلی ساده و روان و عالی توضیح دادین
خدا خیرتون بده
سلام
سلامت باشی دوست من. خوشحالم که براتون مفید بوده 🙂
سلام وقت بخیر
من تو یه مسیری (login/mobile) کوکی ساختم
بعد قراره این فایل بعد ثبت نام کاربر برگرده به صفحه اصلی سایت
و اونجا برسی کنه ببینه آیا کاربر ثبت نام کرده یا نه
اگه ثبت نام کرده بره به مسیر home و در غیر این صورت بره به مسیر ثبت نام
حالا طبیعتا باید کوکی ذخیره بشه و این کار به درستی انجام بشه
ولی این اتفاق رخ نمیده
من رفتم و کوکی ها رو برسی کردم و دیدم که کوکی ها توسط مرورگر (Chrome) داره مسدود میشه و این پیغام رو نمایش میده:
This cookie was blocked because it’s path was not an exact match for or a superdirectory of the request url path.
این مشکل رو چطوری حل کنم!؟
سلام
خطایی که فرستادید مربوط به اینه که احتمالاً آرگومان path رو یک مقدار غیر معتبر (غیر از domainـی که سایت از طریقش در حال ایجاد کوکی هست) وارد میکنید.
اگه محدودیت خاصی ندارید که این کوکی در تمام سایتتون در دسترس باشه، یا تعریفش نکنید یا از
/
استفاده کنید.سلام چطور متنی را در کوکی ذخیره کنیم ؟
سلام
کافیه بهعنوان value مقدار متن مورد نظرتون رو بذارید. همین!
بله درسته فقط چطور به صورت پیام رسان نمایش بدم بدون استفاده از دیتابیس ؟
منظورتون از پیام رسان نمایش یه notification روی صفحه است؟ اگه اره این مورد به front مرتبطه.
کامل و عالی بود دوست عزیز
ممنون بخاطر توضیحات خوبتون
لطفا برای رمزنگاری که اخرش گفتید هم مثال بزنید.
خوشحالیم که این آموزش رو کاربردی میدونید. یک مثال کوتاه میزنم اما در آموزشی جداگانه به طور کامل بهش میپردازم.
فرض کنیم به دلیلی نیازه نام کاربری یوزر رو در کوکی با PHP ذخیره کنیم. در اینصورت بهتره هش شده اون رو (مثلا با
md5()
) در کوکی ذخیره کنیم؛ اینطوری تغییر یوزر و جایگزین کردنش با یه نفر دیگه سخت و غیرممکن میشه.امیدوارم جوابتون رو با این مثال گرفته باشید.
خیلی روان توضیح دادین. ممنون
خوشحالم که برات مفید بوده محمد عزیز. مرسی که با پیامت بهمون انرژی میدید.