אתה נמצא כאן יסודות השפה  >>  העברת נתונים ל-PHP  >>  שימוש בעוגיות

שימוש בעוגיות

PHP תומכת בעוגיות (cookies) בצורה פשוטה וטובה. עוגיות נועדו בדר"כ לשמור מידע על מחשב הלקוח לפעם הבאה שהלקוח ייכנס שוב לאותו הדף. כדי לשמור עוגיה משתמשים בפונקציה setcookie(). יש להשתמש בפונקציה זו לפני שנשלחים ה-header-ים (ו/או לפני שמדפיסים פלט לדף), אחרת הפונקציה לא תעבוד ותוציא הודעת שגיאה.

<?php
  setcookie
/*הפונקציה היוצרת את העוגיה.*/
($cookie_name
/*המחרוזת שמכילה את שם העוגיה.*/
,$value
/*הערך שאותו אנו שומרים.*/
,$expire_time
/*הזמן שבו העוגיה יוצאת מתוקף.
(בפורמט של UNIX).
*/
);
?>

העוגיה נטענת לתוכנית ה-PHP באופן אוטומטי כאשר היא בתוקף, ונשמרת כמשתנה ששמו הוא שם העוגיה ($cookie_name) ובתוכו נשמר הערך של העוגיה ($value). כך זה בדר"כ כי זה תלוי בקונפיגורציה (בכניסה register_globals). אבל העוגיה תמיד תשמר במערך הגלובלי $_COOKIE, כך שהמפתחות שלו מגדירים את שמות העוגיות וערכיו הם הערכים של העוגיות.

כדי למחוק עוגיה יש להשתמש באותו השם ולכתוב זמן יציאת תוקף ($expire_time) שכבר עבר.

<?php
  if (!$_COOKIE["cookie"])
/*אם משתנה העוגיה לא מוגדר,
אז זה אומר כי לא קיימת עוגיה
תקפה בשם cookie.
*/

  {
     setcookie("cookie","I am a cookie.",time()+600);
/*יוצרים עוגיה בשם cookie
עם הערך "I am a cookie.".
שתוקפה פג אחרי 600 שניות (10 דקות).
*/

     echo "No cookie was found. Created a cookie of name 'cookie'.";
/*הדפסה לפלט מכריחה את PHP
לשלוח את ה-header-ים.
לכן קודם כל יצרנו את העוגיה
ורק אחרי זה הדפסנו לפלט.
*/

  }
  else //if the cookie exists
  
{
     setcookie("cookie",NULL,time()-1);
/*מוחקים את העוגיה ע"י שימוש בשם
העוגיה וזמן יציאת תוקף שכבר עבר.
*/

     echo "You've already been in this page. Deleted the cookie (its value was: <B>".$_COOKIE["cookie"]
/*ערך העוגיה נשמר בתוכנית
גם אחרי שמחקנו אותה.
*/
."</B>).";
  }
?>

לאחר יצירת העוגיה, משתנה העוגיה לא יהיה מוגדר בתוכנית. כאשר מעלים את הדף מחדש העוגיה נטענת באופן אוטומטי (במידה והיא תקפה), ומשתנה העוגיה יהיה מוגדר בתוכנית גם לאחר שמוחקים את העוגיה. זאת הסיבה שיכולנו להדפיס את הערך של העוגיה cookie גם לאחר שמחקנו אותה.

כשם של עוגיה ניתן לכתוב גם משתנים מסוג של מערך, למשל לתת את השמות "cookie[0]" ו-"cookie[1]" שיצרו מערך ב-$_COOKIE["cookie"].


תגובות בנושא

מה זה headers? 03-12-02 21:01
 גיל בר-טור
#94

אני מנסה לכתוב קוד ולהשתמש בעוגיות..
ולא הבנתי מה הכונה להשתמש בהם לפני שנשלחים ה-headers?
וזו הבעיה העיקרית שנוצרת לי, אני בונה טופס שמקבל 3 פרטים מהמשתמש, ויוצר 3 עוגיות, כל עוגיה מכילה פרט אחד! הפרטים נשלחים ע"י טופס לדף שיוצר את העוגיות ומדפיס לאחר מכן
מהם ההדרים?

headers 03-12-02 21:01
 אלי חן (מנהל)
#96

headers הם פריטי מידע שנשלחים בין הדפדפן לשרת ומגדירים כיצד יש להשתמש בדף שנשלח.

ה-headers, כשמם כן הם, נשלחים בראש - לפני שתוכן הדף נשלח. לאחר שתוכן הדף מתחיל להישלח, אז לא ניתן לשלוח יותר headers (אפילו לא באמצע שליחת התוכן).

העוגיות הם סוג של headers, ולכן חייבים להישלח עם ה-headers לפני ששולחים את תוכן הדף. אם מנסים לשלוח header או לשמור עוגיה באמצע הפלט, אז מקבלים שגיאה - דאג לשלוח את ה-headers והעוגיות לפני תחילת הפלט.

אז מה הבעיה בקוד הבא? 03-12-02 21:01
 גיל בר-טור
#97

ישלי את הקוד דף הבא...
מה שגוי בו?
<html>
<head>
<title> hi </title>
</head>
<body>

<?php

setcookie("was_here","true",time()+60);
setcookie("name",$fullname,time()+60);
setcookie("e-mail",$email,time()+60);

if(!$_COOKIE["was_here"])
{
echo "Your name is: ".$_POST["user"]['f_name']." ".$_POST["user"]['l_name']." !<BR> ";
echo "Your Email is ".$_POST["user"]['e-mail']."<BR>";
}
?>

</body>
</html>

הבעיה: שליחת עוגיות לאחר שליחת הפלט 03-12-02 21:01
 אלי חן (מנהל)
#98

הבעיה בקוד שלך היא שאתה מנסה לשלוח עוגיות לאחר שהפלט נשלח. הפלט נשלח ברגע שאתה מדפיס משהו לפלט מ-PHP או כשמגיעים לקוד HTML.

במקרה שלך, הפלט התחיל מהשורה הראשונה: <html>
לפני שליחת הפלט, ה-headers כבר נשלחו, ולכן שליחת העוגיות במקרה שלך היא באמצע שליחת התוכן וזה יוצר שגיאה.

כדי לפתור את הבעיה העבר את 3 השורות של setcookie לבלוק PHP נפרד ב-*ראש* הדף, לפני קוד HTML כלשהו.

עוגיות 05-12-02 06:01
 עפרי מרקוס
#156

ההוראות שרשמתם לא עובדות לי.
הבעיה שלי היא שאכן ה-php מתרגם לי את פקודת setcookie ל-html, אבל כאשר אני מנסה לגשת לדף בעזרת ה-browser, לא נשלחת שום עוגיה אל המחשב שלי. ובמקום זאת מופיעה שורת הפקודה ב-html בראש העמוד.
מה עושים?

תגובה: עוגיות 05-12-02 08:00
 אלי חן (מנהל)
#160

מה זאת אומרת "מתרגמת לי את פקודת setcookie ל-html"??
הפקודה setcookie לא אמורה להוציא פלט html, אלא היא שולחת header נוסף לדפדפן בו היא מורה לו ליצור עוגיה.
אם אתה רואה את הפקודה setcookie בדף כפי שרשומה ב-PHP אז כנראה ש-PHP לא מותקן אצלך, או סיומת הסקריפט שלך לא 'php.'
אם אתה מקבל הודעת שגיאה בה רשום "headers already sent by..." אז אתה מנסה ליצור עוגיה לאחר שהפלט שלך כבר נשלח - ראה את התגובות הקודמות בדף זה.

בעיות בעוגיות (תענו על זה בבקשה) 05-12-02 10:02
 איתי
#168

<?php
if (!$_COOKIE["animescoil"])
{
setcookie("animescoil","entered.",time()+60);
$file = fopen("count2.txt","r+");
$counter2 = fread($file, filesize("count2.txt"));
fclose($file);
$counter2 +=1;
$file = fopen("count2.txt","w+");
fputs($file, $counter2);
fclose($file);
}
?>
עשיתי כאילו שכל דקה ימחק הקובץ עוגיה, אבל זה אפילו לא יוצר אותו
זה גם לא עובד אלכם באתר בדוגמא זה לא כותב... אבל קוקיס בכללי זה כותב... מה לעשותת?

תגובה: בעיות בעוגיות 05-12-02 10:02
 אלי חן (מנהל)
#171

לא נראה לי שיש לך בעיה בסקריפט.
לפי דעתי הבעיה שהצגת עם העוגיות נובעת מהגדרות הדפדפן שלך.. תוכל לשנות את הגדרות הדפדפן שלך או להשתמש ב-netscape ששם ברירת המחדל לא מגבילה עוגיות. [מאותה הסיבה הדוגמא באתר לא עובדת. בדקתי ב-Netscape וזה כן עובד. יכול להיות ש-IE מזהה את העוגיה כאילו היא באה מגורם שלישי ולכן חוסמת אותה].

תגובה: cookies 06-12-02 00:02
 אלי חן (מנהל)
#209

הפונקציה setcookie לא מוציאה בכלל פלט של HTML! לכן אין לי מושג על מה אתה מדבר בכלל.. הפונקציה setcookie לא מוסיפה לך header בקוד ה-HTML אלא שולחת את ה-header בנפרד לפני שליחת קוד ה-HTML. ההתנהגות של הפונקציה שהזכרת לא מוכרת לי - מצטער..

תפוגה 06-12-02 20:01
 יובל
#274

כתוב: time()+600
600 מה?
כתוב ב alt שזה בשניות.
אז כדי לעשות תאריך תפוגה של שנה צריך לכתוב
60*60*24*31*12?
אין משהו יותר קצר?

תגובה: תפוגה 06-12-02 21:02
 אלי חן (מנהל)
#275

בשנה יש 365 ימים, ביום יש 24 שעות, בשעה יש 60 דקות, בדקה יש 60 שניות. אז ככה:
365*24*60*60

חוץ מזה, תמיד תוכל לחשב את זה ולכתוב ערך מספרי: 31536000 שניות בשנה.

יש אפשרות... 05-12-03 02:01
 Icel
#865

להכניס יותר מערך אחד לעוגיה?
אולי להשתמש במערך?

מערך בעוגייה 05-12-03 09:00
 אלי חן (מנהל)
#871

כן, אפשר להכניס מערך לעוגיה.
זאת עושים ע"י מתן שם לעוגיה בצורה של מערך, למשל:
setcookie("cookie_array[one]","value1");
setcookie("cookie_array[two]","value2");
end examples

עוגייה בלי תוקף?? 10-12-03 04:01
 תום
#1166

יש אפשרות לא לשים expiration date ואז העוגייה תשאר לזמן בלתי-מוגבל?
או שהדבר יגרום לשגיאה?
תודה מראש!

עוגיה בלי תוקף 31-10-03 17:01
 אלי חן (מנהל)
#1204

אם לא מציינים מה זמן התוקף של העוגיה, אז PHP תשמור את העוגיה, כך שתיעלם כאשר סוגרים את הדפדפן (כמו Session).

סתם שאלה 02-12-04 05:01
 גרגורי
#1422

האם יש אפשר לעשות כך שהעוגיות שאני מגדיר יווצרו על השרת עצמו ולא במחשב של המשתמש?

יש פיתרון 04-12-04 07:01
 טל חדד
#1537

וזה ה Session כתוב בעמודים הבאים על זה

שאלה... 08-12-04 08:01
 איתן בןאב
#1742

זה כל מה שאפשר לעשו עם Cookies ?
איך זה עוזר לי לשלוח נתונים לעוגיות ?
איך אני עושה אם זה עוד דברים ?

Notice: Undefined 09-12-09 11:01
 עידן ידגר
#2856

כתבתי את הקוד, הכל עבד כמו שצריך, אבל הוא נותן לי הערה:
Notice: Undefined index: cookie in C:wampwwwlphp.php on line 2
אבל משם הוא ממשיך רגיל, רושם "העוגיה קיימת/נמחקה" וכו'.
גם כשהעתקתי את הקוד מכאן, הייתה אותה שגיאה..
מה הבעיה?

לא משנה.. 09-12-09 11:01
 עידן ידגר
#2857

הסתדרתי.. צריך לשים isset.


לדף הקודםקבלת נתונים דרך טופס -הקודם
לתחילת הדףלתחילת הדף
הבא- שימוש ב-sessionלדף הבא