שאלה בנושא עוגיות.

madg

New member
שאלה בנושא עוגיות.

ב ASP הייתי רגיל לשלוח עוגיות מתי שצריך והמערכת דואגת להכל. לפי ה HELPים של PHP אני רואה שחייבים לשלוח את העוגיות לפני ה HEADERים. יש לי שאלה של הגיון, אם אני רוצה לייצר עוגיה רק אחרי שקרה משהו וקיבלתי קלט מהמשתמש, אז איך אני יכול לשלוח עוגיה לפני הHEADER ? שהרי הHEADER מגיע ראשון ?! אז מה עם כל הטקסטים היפים והתמונות ששולחים למשתמש ? תודה.
 

Megapuzik

New member
אין אפשרות גם לא בASP

לשלוח עוגיות לפני כותרים, זה כבר לא קשור לשפה אלה קשור לדפדפן, ככה זה עובד. בכל מקרה, אם אתה ממש רוצה אתה יכול לעבוד כך : לאסוף את כל המידע שאתה צריך לשלוח את כל המידע בGET לאותו עמוד בראש העמוד לפני הדפסת פלט, תאסוף את המידע שקיבלת בGET למשל
<? if($_GET[´send´] == 1){ /* שלח את העוגיות לפי פרטים שקיבלת ב GET */ } #code #code...... ?>​
 

madg

New member
לאחר עיון נוסף

בקודים ישנים שלי ... אין מילים, אתה צודק. כלומר אם אני רוצה לבנות משהו שכולו יעבוד מתוך קובץ אחד גדול, אין לי מנוס מלעבור לקובץ אחר ( login.php ) נגיד שיבנה עוגיה ויחזיר אותי לקובץ הראשי הגדול ? גיא.
 

madg

New member
טוב , זה לא הולך ... עוד שאלה.

יש לי את אותו קובץ גדול ובקובץ יש כמה טפסים. כשאני ממלא טופס אחד ושולח אותו אמור לקרות משהו שישנה את העמוד בפעם הבאה שהוא מגיע לדפדפן. אני בודק את השדות של הטפסים ישר בהתחלת הקובץ לפני ה HEADERים כדי שאם הטופס מולא ומולא נכון אני אוכל לבנות עוגיה. אבל זה לא פועל
מישהו ? מה אני לא עושה נכון ? (בטח הכל) תודה. גיא.
 

shanor

New member
מממ...

בוא רגע נבהיר משהו... אתה יכול לבדוק כמה שאתה רוצה ולכתוב כל מה שאתה רוצה כל עוד אתה לא שולח שום דבר לדפדפן, וזה כולל גם רווחים (רווחים לבנים)!!! ברגע שאתה שולח משהו לדפדפן, אתה גם שולח איתו HEADER. המלצה, תריץ משהו פשוט יותר רק בשביל שתוכל להבין איך העסק עובד. אני אתן לך את הרעיון ואת התיאוריה. ?> תבדוק האם קוקי קיים. אם כן תציג את הערך שלו על המסך אם לא תיצור קוקי. תכניס את הערך החדש של [´TEMP´]_$ לקוקי. <? תציג דף HTML כולל טופס כל שהוא שישלח את הנתון TEMP לעצמו. זהו בגדול. תראה אם אתה מסתדר עם זה. אחרי תראה שזה מסתדר לך, לעשות את מה שאתה רוצה זה כבר הרבה יותר פשוט. קח את התנאים בקטע של ה-PHP, ותשנה את זה למה שאתה צריך. רק מספר הערות: מצטער על הסימנים הפוכים <? ?>. מקווה שהייתי ברור מספיק, ונתתי כאן דרך כל שהיא להבין את הדברים. בהצלחה ותגיד אם אתה נתקע איפשהו. שנאור.
 

shanor

New member
אה עוד משהו.

רציתי לכתוב ושכחתי, אם אתה לא רוצה להשתמש בקוקי, אז תוותר על הקטע של קוקי, ופשוט תשווה את הערך של המשתנה שלך TEMP במקרה שנתתי כאן. פשוט תבדוק האם [´TEMP´]_$, שווה למשהו... זו דרך אחת או דרך אחרת בעזרת פקודת ה- SWITCH CASE.... זהו בהצלחה שנאור.
 

madg

New member
לא הולך .... ../images/Emo10.gif

<?php if (isset("cookie") echo $_COOKIE["cookie"]; else setcookie ("cookie", "foo"); ?>​
דבר כזה אמור לעבוד ????
 

shanor

New member
מממ...

אוקיי. הנה סקריפטון קטן רק כדי להבין את העיקרון.... תעקוב אחרי התנאי, שאצלך הוא לא נכון ובגלל זה מתחילה הבעיה.
<? if (isset($_COOKIE[´testing123´])) { echo ´cookie exists. testing123 value is ´.$_COOKIE[´testing123´]; } else { setcookie(´testing123´, ´hello world´); echo ´no cookie in the house....creating one...reload the page...´; } ?>​
בגדול על פי הקוד שלי, תנסה אותו, הוא הולך ככה: 1. בודק האם קיים משתנה בשם testing123 בתוך הקוקי. 2.1 אם קיים תציג הודעה עם הערך שלו. 2.2 אם לא קיים שלח לדפדפן בקשה ליצירת קוקי, ותציג הודעה (הסדר חשוב, קודם לשלוח את SETCOOKIE ואחר כך את הטקטס!!!). 3. תעשה RELOAD לדף, ואז כאשר הוא יטען מחדש הקוקי כבר תהיה בתוך הדפדפן, וסקריפטון יציג לך את הערך על המסך (שורה 2.1). דיי פשוט לא? זהו בהצלחה. שנאור.
 

madg

New member
תודה ... אבל !

הבנתי את הבעיה שלי ( השאלה והתנאי .. ( אבל לקחתי את זה מה HELP אז זה פאק שלהם ! )) בכל מקרה, גם שלך לא עובד. ולפני שתגיד, אז בדקתי את ההגדרות של העוגיות והם תקינות וכמו כן יש לי עוגיות מאתרים שונים ... כמו כן יש לי עוגיות גם מאתר שאני שיחקתי איתו אז ככה שלא פה התקלה. ... עוד רעיונות ?
 

shanor

New member
מממ....

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

madg

New member
ובכן ...

זה חלונות XP ( תחנת עבודה ) אני כותב ומריץ לוקאלי http://127.0.0.1/myurl/index.php והתקנתי את ה PHP לפי ההכוונה של HOWTO שהגיע עם התכנה. האם לא ניתן להניח שזה עובד טוב אם זה מפענח את שאר הקוד של PHP כמו שצריך ?
 

madg

New member
לדוגמה, זה פועל ...

<% dim CookieName CookieName = CStr("mycookie") if request.cookies(CookieName)("cook1") <> "" then response.write request.cookies(CookieNAme)("cook1") else response.cookies(CookieName)("cook1") = "ok" end if %>​
 

madg

New member
ועוד אגב אחד קטן ... ../images/Emo13.gif

; Output buffering allows you to send header lines (including cookies) even ; after you send body content, at the price of slowing PHP´s output layer a ; bit. You can enable output buffering during runtime by calling the output ; buffering functions. You can also enable output buffering for all files by ; setting this directive to On. If you wish to limit the size of the buffer ; to a certain size - you can use a maximum number of bytes instead of ´On´, as ; a value for this directive (e.g., output_buffering=4096). ;output_buffering=Off​
זה ציטוט מתוך php.ini שלי .... זה אומר לעניות דעתי שכן אפשר לשלוח עוגיות גם אחרי שיש כבר פלט לדפדפן ... אבל זה לא העניין עכשיו
.
 

shanor

New member
mmmm....

טוב, ראשית כל מה זאת אומרת לא עשיתי כלום???? אצלי גם על השרת וגם על ה-LOCALHOST, הכל עובד כמו שצריך כולל העובדה שהוא שותל את הקוקי אצלי על המחשב וקורא אותה אחר כך!!! שנית, שימוש בבפר, אפשרי אבל לא נכון!!! מה הכוונה לא נכון, זה לא שאסור להשתמש בבאפר, מותר ובשביל זה בדיוק עשו את זה כי יש מצבים שאתה לא יודע מה אתה צריך לעשות אלא רק אחרי שכבר התחלת להוציא מידע החוצה ללקוח... אבל על פי סדר הדברים זה לא נכון. HEADERS כשמם כן הם באים ראשונים ולא משנה מה. האפשרות של הבאפרים היא להאט את הפלט, כי במקום שיישלח פלט באותו הרגע שהוא נוצר ב- PHP הוא מחכה עד שכל הסקריפט יסתיים ואז שולח את הכל ביחד ללקוח. אבל שוב אין כאן עיניין של PHP אלא עיניין של שליחת נתונים בין שרת לדפדפן, וכמובן עיניין של פרוטוקול ה- HTTP. למה ה- ASP עובד וה- PHP לא... אין לי מושג היות ואני לא מכיר את הפונקציות של ASP, ולא את הצורה שבה השרת עובד... היות ואתה עובד עם ASP על 127.0.0.1 משמע על LOCALHOST, זה אומר שאתה לא מריץ APACHE...אלא שרת אחר, שוב גם כאן אין לי כל כך מושג כי אני עובד על APACHE... אם הסקריפט שנתתי לך לא מוציא לך את הקוקי בפעם השניה (אחרי REFRESH, שאתה עושה) אז הבעיה היא לא בסקריפט אלא בהגדרות השרת שלך או בעבודה שלו מול מנוע ה-PHP (כמובן גם תלוי איך אתה מריץ אותו בתור CGI או בתור ISAPI...). דיי קשה לי לעזור ככה בצורה של פורום מבלי להכיר את המערכת שעליה אתה עובד ומבלי לדעת מה הקונפיגורציה המתאימה של אותה מערכת. בכל אופן, כמו שאמרתי, אם הסקריפטים לא עובדים... גם על פי הדוגמאות של PHP HELP גם על פי טוטוריאלים שונים וגם הסקריפט שאני נתתי, יש משהו שלא עובד וזה לא הסקריפט. מצטער שלא יכול לעזור יותר מכך. בברכת הצלחה שנאור.
 

madg

New member
תודה רבה.

מסתבר ( לאחר שביליתי את רוב הבוקר בקריאת טוטוראלים ) שבאמת הכל בסדר ואין שום בעיה
רק שהקוקיס לא ניכתבות ... לא נורא. זה בסך הכל תמריץ לשבת ולהתקין משהו אחר מה חלומות XP עם IIS 5 ( פסגת הטכנולוגיה המייקרוסופיט ) .. אז זה יאיט אותנו טיפה אבל לא נישבר ! ולגבי ה"לא עשית כלום" ... זאת אמורה להיות שורת החתימה .. אני אשנה את זה .. זה לא מדבר אליך אלא עלי. תודה בכל מקרה עד כאן הועלת רבות ! גיא.
 

orenphp

New member
ברור שאפשר! ככה....

מה שעלייך לעשות זה לפתוח buffer אשר יצבור את כל הפלט למסך...
<? ob_start(); echo "very simple"; setcookie("name","value", time()+3600); //this won´t work without the output buffering! $txt = ob_get_contents(); ob_end_clean(); //clean the buffer echo $txt; //will print: very simple ?>​
כפי שניתן לראות, אני קולט את הכל במשתנה $txt, ולמרות שכביכול נעשית הדפסה למסך, אני עדיין יכול לשמור את הקוקיז ובו בזמן לשמור את המידע שנשלח למסך. בהצלחה ומקווה שזה עזר
 

orenphp

New member
בקשר לתגובה של שנאור....

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

shanor

New member
איפה נזעמת??

אני מקווה ששני סימני שאלה זה לא יותר מידי אורן. התגובה היא לא נזעמת, ולא היתה שום כוונה שתהיה כזו. נכון שאפשרויות כיווץ אפשריות אבל כמה באמת משתמשים בהם? אם יש לך גודל דף סביר לשלוח למשתמש שלך, אין טעם לכווץ משום שבעצם הדחיסה של טקסט קטן על פי אלגורתמם הדחיסה בצורה פרדוקסלית משהו יגרום להגדלה של כמות המידע הנשלחת. הדבר טוב בכמויות גדולות של מידע ולא בכמויות קטנות. תשאל מה זה קטן ומה זה גדול, לא אני ולא אף אחד לא יוכל להגיד כי אין הגדרה אחת. הכל תלוי במה שאתה שולח. בנוסף אמרתי שבאפרים זה דבר אפשרי אבל על פי ה- W3C, ארגון התקנים לאינטרנט, לא יעזור ולא כלום, HEADERS צריך להשלח ראשון (תבדוק בעצמכם הנה ה- RFC: ftp://ftp.isi.edu/in-notes/rfc2774.txt מעודכן נכון לפברואר 2000. בנוסף אפשר להסתכל כאן גם: http://www.w3c.org/Protocols/rfc2616/rfc2616.txt וכאן: ftp://ftp.isi.edu/in-notes/rfc2617.txt) עכשיו בקשר לטענה שבעצם העובדה שמכניסים את הכל לבאפר ושולחים ביחד... נו הבא נבדוק את זה, למרות שאף פעם לא בדקתי את זה אישית אצלי על המחשב והאמת גם לא על שרת כל שהוא שיושב אי שם ברחבי האינטרנט בוא נראה מה אומרים על זה באתר של PHP: אוקי אז פרט לעובדה שיש בעיות עם IE5 SP2, ופרט לעובדה שאם הבאפר שלך עובר את מכסת הזיכרון המוקצבת לך על השרת, תקבל הודעות שגיאה, בוא נראה מה בנוגע להאטה, הנה קטע מתוך קובץ ה- INI של ה- PHP:
; Output buffering allows you to send header lines (including cookies) even ; after you send body content, at the price of slowing PHP´s output layer a ; bit. You can enable output buffering during runtime by calling the output ; buffering functions. You can also enable output buffering for all files by ; setting this directive to On. If you wish to limit the size of the buffer ; to a certain size - you can use a maximum number of bytes instead of ´On´, as ; a value for this directive (e.g., output_buffering=4096). output_buffering = Off​
אם הם אומרים את זה מי אני שאגיד שהם טועים? כנראה שהם לא כל כך טועים. בכל אופן, אורן, אני אשמח אם תוכל לצטט את המקומות שבהם לפי טענתך "תגובה...לא נכונה בעיקרה". כדי שגם אני שלא יודע הכל, מודה, אוכל ללמוד עוד. בברכה שנאור.
 

madg

New member
טוב, זה מוגזם !!!!

משהו פה לא בסדר ! התקנתי מנדרייק 9 עם אפצ´י עם mysql ועוגיות ... אין ! מה יהיה ?? רעיונות ! תודה.
 
למעלה