מה זה סשן ואיך משתמשים בו?
-
קראתי בפורום והבנתי שיש כזה דבר סשן ששם אפשר לשמור את כל הנתונים של הדו שיח בין השרת למשתמש בכל אורך ההלוך ושוב - גם ב PHP ששם כל קריאה מתחילה מחדש, נכון?
אשמח להבין איך זה עובד, ואיך עובדים עם זה- איך מכניסים לו מידע חדש, וכן איך קוראים מזה את המידע,
וכן איך אפשר לפי זה לדעת בקוד איפה אני אוחז כדי שלא יעשו את אותה פעולה פעמייםתודה רבה לכל מי שיעזור לי!
@לעזור-לכולם @amp-Software-0 -
-
@שמואל-ש
האובייקט$_SESSION
ב PHP הוא אובייקט שמקושר לסשן החיבור שמבצע משתמש כל שהוא לשרת, והוא מתנהג כאובייקט json לכל דבר, ניתן לאחסן בו נתונים, לקרוא ממנו, וגם להסיר נתונים.
זה לא מאפשר לדעת 'איפה אני אוחז', כיון שPHP היא שפה אסינכורנית, אבל זה כן מקל על כל התהליך של התקשורת מול המאזין בשימוש בשפת PHP במודול API, ובעיקר, מאפשר גם להסיר את ההקשות הקודמות של המשתמש, כך שאפשר לבצע את אותה פעולה כמה פעמים והמערכת לא 'תזכור' את הבחירה הקודמת.להלן הסבר כללי על האובייקט, עם דגש על השימוש במודול API:
בכל דף שרוצים להשתמש ולאחזר את נתוני הסשן צריך לקרוא תחילה לפוקנציה שנקראתsession_start()
, בנוסף, מכיון שהקריאות של ימות המשיח יוצרות כל פעם סשן חדש, יש להגדיר מזהה ייחודי לסשן באמצעות פונקצייתsession_id()
, כדי שכל פעם תתייחס לסשן הספציפי הזה. כיון שאנחנו מקבלים בימות את הCallId
רצוי להגדיר את מזהה הסשן למזהה השיחה.
אם כן, ההגדרות הראשוניות לשימוש בסשן הם כדלהלן.$CallId = $_GET['ApiCallId']; session_id($CallId); session_start();
לאחר מכן ניתן להתחיל להשתמש באובייקט
$_SESSION
, כאמור, הוא אובייקט מסוג json ולכן הקריאה והכתיבה אליו היא כמו כל אובייקט json אחר
כתיבה$_SESSION['amount'] = 300;
קריאה
$amount = $_SESSION['amount'];
החידוש הגדול הוא, שבשונה מ
$_GET
הנפוץ, שאפשר להסיר ממנו פריטים על ידי פונקצייתunset
הסרהunset($_SESSION['amount']);
כדי להשמיש את האובייקט במודול API של ימות יש צורך לקלוט את כל הפרמטרים שנשלחים על ידי ימות לתוך אובייקט הסשן. לאחר מכן עבור כל פרמטר יש לבדוק האם הפרמטר מופיע באובייקט הסשן, ואם לא - לקבל אותו.
אני בניתי בשביל זה מיני מחלקה שמפשטת את כל העסק, כשאני משתמש בה אני מרגיש כמו שפה סינכורנית, להלן דוגמית:<?php // מאתחל את הסשן ומקבל את ערכי הפרמטרים initialization_session(); // מקבל פרמטר כמות, אם לא קיים - מבקש, אם קיים - מחזיר את הערך // מקבל כפרמטר את רוב האופציות של read $amount = read('t-אנא הקש כמות', 'amount'); // מבצע בדיקה של הפרמטר ובמידה ואינו מאושר מסיר את קליטת הפרמטר ומפעיל את השלוחה מחדש if ($amount > 100) reload_module('t-לא ניתן להקיש כמות מעל 100', 'amount'); //בדיקת הפרמטר על ידי פרמטר נוסף $approval_amount = read("t-הכמות שהתקבלה היא.n-$amount.t-לאישור הקש 1 לביטול הקש 2", 'amount,approval_amount', '12'); if ($approval_amount == 2) reload_module(null, 'amount,approval_amount'); go_to_folder('/', 't-הנתונים התקבלו בהצלחה'); #################################################### function read($voice, $param, $keys = '', $max_taps = 1, $min_taps = 1, $sulamit = null, $cochavit = true, $read_as = 'No') { if (!isset($_SESSION[$param])) { echo "read=$voice=$param,,$max_taps,$min_taps,,$read_as,,,,$keys"; if ($cochavit && $keys != '') echo '*'; if ($sulamit) echo ",,Ok,$sulamit"; exit(); } return $_SESSION[$param]; } function initialization_session() { $CallId = $_GET['ApiCallId']; session_id($CallId); session_start(); $QUERY_STRING = $_SERVER['QUERY_STRING']; $last_param = substr($QUERY_STRING, strrpos($QUERY_STRING, '&') + 1); $param = explode('=', $last_param); $_SESSION[$param[0]] = $_GET[$param[0]]; } function unset_session_values($keys) { $keys = explode(',', $keys); foreach ($keys as $key) { $key = explode(":", $key); unset($_SESSION[$key[0]]); } } function reload_module($voice = null, $unset = null) { if ($voice) echo "id_list_message=$voice&"; if ($unset) unset_session_values($unset); echo 'go_to_folder=/' . $_GET['ApiExtension']; exit(); } function go_to_folder($folder = '/', $voice = null) { if ($voice) echo "id_list_message=$voice&"; echo "go_to_folder=$folder"; exit(); }
קרדיט ל @לעזור-לכולם שכיוון אותי לשימוש יעיל בזה
-
@amp-Software-0 קודם כל תודה רבה על התשובה המפורטת!
שאלתי את GPT והוא ענה לי די מפורט אבל אתה הסברת לי הרבה יותר טוב וברור!
אבל בעצם כדי לדעת איפה אני בקוד אז אותו דבר אפשר לבדוק על המשתנה שאני רוצה לקבל ב read האם הוא מאותחל או שיש פה מעלה נוספת יותר ממה שהבנתי? -
@שמואל-ש כתב במה זה סשן ואיך משתמשים בו?:
@amp-Software-0 קודם כל תודה רבה על התשובה המפורטת!
שאלתי את GPT והוא ענה לי די מפורט אבל אתה הסברת לי הרבה יותר טוב וברור!
אבל בעצם כדי לדעת איפה אני בקוד אז אותו דבר אפשר לבדוק על המשתנה שאני רוצה לקבל ב read האם הוא מאותחל או שיש פה מעלה נוספת יותר ממה שהבנתי?@amp-Software-0 כתב במה זה סשן ואיך משתמשים בו?:
ובעיקר, מאפשר גם להסיר את ההקשות הקודמות של המשתמש, כך שאפשר לבצע את אותה פעולה כמה פעמים והמערכת לא 'תזכור' את הבחירה הקודמת.
-
@לעזור-לכולם אוקיי, ומה לגבי זכירת המיקום, זה עוזר במשהו? זה משהו יותר טוב מבדיקה אם משתנה לא מאותחל או אולי יותר קל?
-
@amp-Software-0 כתב במה זה סשן ואיך משתמשים בו?:
זה לא מאפשר לדעת 'איפה אני אוחז', כיון שPHP היא שפה אסינכורנית,
אם אתה מחפש שפה שתוכל לדעת איפה אתה אוחז תעבור ל NodeJS, זה שפה סינכורנית
אבל אני חושב שעם המודולים שהבאתי החוייה היא אותו דבר, הקוד נכתב באותו פורמט כמו ב JS
אם בכל אופן אתה מתמודד עם בעיות יתכן שאתה לא מתכנן \ כותב את הקוד בצורה נכונה ופונקציונלית -
@amp-Software-0 כתב במה זה סשן ואיך משתמשים בו?:
אבל אני חושב שעם המודולים שהבאתי החוייה היא אותו דבר, הקוד נכתב באותו פורמט כמו ב JS
איך? עם הוספת כל משתנה לסשן ובדיקת בכל קטע האם המשתנה כבר קיים? או שיש דרך יותר קלה?
ואגב, אפשר להוסיף לסשן גם מערך JSON?
-
@שמואל-ש כתב במה זה סשן ואיך משתמשים בו?:
איך? עם הוספת כל משתנה לסשן ובדיקת בכל קטע האם המשתנה כבר קיים? או שיש דרך יותר קלה?
עם פונקציית read שכתבתי אתה לא מתעסק עם הבדיקות, אלא מקבל את זה כמשתנה לכל דבר, תסתכל בדוגמת הקוד שהבאת אני לא בודק שום דבר פשוט הקוד רץ (אצלי הפונקציות נמצאות בכלל בדפים אחוריים שמשמשים כמחלקות כך שהסקריפט בפועל הוא נקי ופשוט)
@שמואל-ש כתב במה זה סשן ואיך משתמשים בו?:
ואגב, אפשר להוסיף לסשן גם מערך JSON?
בהחלט
-
@amp-Software-0 הבעיה היא שאני משתמש בזה לא רק ל read אלא גם לקטעי קוד שאני לא רוצה שיבוצעו פעמיים כך שלענ"ד הקוד שלך לא יעזור לי פה
או שאני טועה? -
@amp-Software-0 לא הבנתי, בכל פעם - אם אני מנסה מהדפדפן שאני קורא מחדש ל URL של הקוד אני כותב את המשתנה שממנו הסשן לקח ובתוך המשתנה ההוא אני כותב את אותו ערך שהיה בפעם הראשונה שקראתי ל URL בסיבוב הנוכחי וככה הוא זוכר את כל מה שכבר קיים בסשן?
ואם אני משנה את הערך במשתנה של הסשן אז הכל מתחיל מחדש?
או משהו אחר?
@לעזור-לכולם -
@amp-Software-0 @לעזור-לכולם סליחה על ההקפצה - אבל זה באותו נושא...
אני רוצה להשתמש בזה לאותו שימוש ש @amp-Software-0 היה צריך - למחוק הקשות
עכשיו אני מבין שפשוט אפשר לעשות את כל הבדיקות וכן את כל הפעולות ע"פ הפרמטרים של הסשן ולא של ה GET
אבל אני לא מבין - הרי איך ההקשות ייכנסו לסשן? ע"י איתחול של$_SESSION["aaa] = $_GET['aaa'];
כדי לקבל את ההקשה שהמשתמש הקיש, אז אם כן גם אחרי מחיקת פרמטר מהסשן הוא יחזור כי אנחנו מאתחלים אותו בחזרה עם ה GET, לא?
או שפספסתי משהו? -
@שמואל-ש
הרעיון הוא שבכל פעם מכניסים לסשן רק את הפרמטר האחרון שנשלח ב GET (מומלץ להשתמש עם QUERY_STRING ולא עם אובייקט GET), ככה שאם מחקת ערך מהסשן, הוא לא יכנס בשליחות הבאותתראה דוגמא:
$last_param = substr($QUERY_STRING, strrpos($QUERY_STRING, '&') + 1); $param = explode('=', $last_param); $_SESSION[$param[0]] = $_GET[$param[0]];
יכול להיות שיש שיטות אחרות (אפשר גם לרשום באובייקט סשן איזה ערך אתה מצפה לקבל, ולקבל רק אותו], ככה אני נוהג לעשות
-
@amp-Software-0 לא הבנתי
אני למשל מדבר עכשיו על הערך id
קיבלתי מהמשתמש כבר שזה 147258
עכשיו אני רוצה להכניס את זה לסשן אז אני עושה$_SESSION['id'] = $_GET['id'];
אח"כ אני רוצה למחוק את הפרמטר, אז אני עושה
unset($_SESSION['id']);
אז בריצה הבאה הערך של GET לא מוכנס שוב לסשן עם השורה למעלה?
-
@שמואל-ש
לא, אתה לא מכניס את הסשן בצורה כזאת$_SESSION['id'] = $_GET['id'];
אלא בצורה שציינתי, שבכל כניסה לדף הוא מכניס את הפרמטר האחרון
להלן דוגמא מלאה:session_id($_GET['ApiCallId']); session_start(); $last_param = substr($QUERY_STRING, strrpos($QUERY_STRING, '&') + 1); $param = explode('=', $last_param); $_SESSION[$param[0]] = $_GET[$param[0]]; if (!isset($_SESSION['param1'])){ echo 'read=t-הקלד פרמטר ראשון=param1'; exit(); } $param1 = $_SESSION['param1']; if (!isset($_SESSION['param2'])){ echo "read=t-הקשת $param1 לאישור הקש 1 להקשה מחודשת הקש 2=param2"; exit(); } $param2 = $_SESSION['param2']; if ($param2 == '2'){ unset($_SESSION['param1']); echo 'go_to_folder=' . $_GET['ApiExtension']; exit(); }
כמובן אפשר לקצר תהליכים ולעשות את זה בפונקציות ומחלקות מסודרות, להלן דוגמא חלקית:
<?php session_id($_GET['ApiCallId']); session_start(); $last_param = substr($QUERY_STRING, strrpos($QUERY_STRING, '&') + 1); $param = explode('=', $last_param); $_SESSION[$param[0]] = $_GET[$param[0]]; $param1 = read("param1", "t-הקלד פרמטר ראשון"); $param2 = read("param2", "t-הקלדת $param1 , לאישור הקש 1, להקשה מחודשת הקש 2"); if ($param2 == 2) { unset_session_value("param2"); reload(); } function read($param, $voice) { if (!isset($_SESSION['param2'])) { echo "read=$voice=$param"; exit(); } return $_SESSION[$param]; } function unset_session_value($param) { unset($_SESSION[$param]); } function reload() { echo 'go_to_folder=' . $_GET['ApiExtension']; exit(); }
-
@amp-Software-0 תודה רבה!!!
-
@amp-Software-0 אולי תפרסם את החבילה שלך באמצעות מנהל החבילות של PHP (Composer?) או לפחות בצורה מסודרת בגיטאהב?
יהיה אפשר לעשות פוסט של "ספריות למודול API" (יש כבר בnodejs, C#, PHP) ולנעוץ אותו -
-