PHP: unset($_SESSION);
петък, 14 юли 2006 г.
20:04
5 коментара
Какво ми се случи, Професионални
Ако след като съм стартирал сесия в PHP4 напиша това: unset($_SESSION); би трябвало да изчисти масива с данни от сесията - нали така? Да, ама не… ако не си напишеш session_destroy(); няма никакъв ефект…
Възмутен съм, защото дебъгвам един скрипт вече пети ден, докато разбера кой ми презаписва данни в сесията…
След малко по-задълбочен анализ (разбирайте четене на юзърски коментари) на сайта php.net установих, че unset() работи само с променливите от масива $_SESSION, но не и с целия масив. Освен това unset-ната променлива не се изтрива от session файла на сървъра, а просто се добавя ! пред името й във файла, което водело до увеличаване на размера на файла…
Това е втория случай, в който заради дребно недоглеждане се налага да дебъгвам по няколко дни.
Така и не ги запомних тия ми ти масивни операции. Що не ползваш някоя добра абстракция връз сесията?
Интересно, как ти хрумна да правиш unset на целия session масив?
Логично е да унищожиш сесията със session_destroy, разликата между това, което си се опитал да направиш е, че с ънсет си очаквал да запазиш сесията, но да унищожиш сесийните променливи
(което btw можеш да постигнеш със $_SESSION = array();)
Твоят случай подсказва работа с по-голямо количество сесийни променливи, може би даже неясно количество, за да ги махаш така централно. Това ме озадачава, защото практиката ми не показва нуждата от такова нещо. Може би съхраняваш в сесия някакви юзърски настройки?
Ми пазим бая неща в сесията, защото това са едни online тестове и всъщност в сесията се пази кои въпроси си минал, кои остават да минеш, колко време си мислил по всеки въпрос, на кои си отговорил правилно, на кои не си отговорил правилно и т.н. + данни за логването на потребителя: userid, тип на потребителя, права за достъп и т.н. С две думи бая масив се получава $_SESSION.
А навсичкото отгоре трябва да можеш да се връщаш след време и да променяш отговорите на някои въпроси преди да си приключил целия тест.
И понеже исках да изчистя сесията, без да я разрушавам, за да позная на следващия въпрос кой е потребителят, ползвах unset(); и след това наново сетвах сесийната променлива с userid-то. Е сега destroy на сесията, старт нова сесия и междувременно в една $tmp променлива му пазя userid-то и пак го връщам в сесията. Вече работи.
А предното недоглеждане беше пак свързано със сесии и между другото беше в същия проект, но го излових още на етап разработка и го отстраних. За да позная дали сега започваш теста или отговаряш на въпрос, проверявам дължината на $_POST масива и ако е нулева (т.е. няма POST заявка) рестартирам сесията. Но дизайнера ми спретнал изненада: сложил място за банер в дизайна, но понеже още нямало банер, написал на IMG тага src=”#” И тъй като картинката е в същия прозорец, в който е страницата, праща и получава същите кукита, както старницата, само дето картинката не праща POST заявка, а само GET, позная какво се случваше - на третото зареждане сесията мистериозно изчезваше
И дебъга беше голям зор, защото системата работеше преди да я сложа в дизайна, а в дизайна няма PHP. Докато открия как може plain/html да ми влияе на сесията!
На твое място бих записвал междинните резултати в таблица в базата и бих съхранявал в сесията единствено user id-то и евентуално юзърнейм-а
Zdraveite!Imam edna strani4ka s poleta za vuvejdane na danni.Vsqko pole si ima ime.Imam napraveni validacii za nqkolko poleta kato napr:username,password,firstname,lastname,city,country.Zada4ata mi e da populnq tezi poleta i pri gre6ka ,koqto se ostanovqva 4rez validaciite,koito sum napravil za da se vru6tam i da si popravqm gre6nite poleta,no vqrno populnite poleta da ne se iztrivat.Tova trqbva da go napravq s pomo6ta na $_session,no ne znam kak :s.Mno 6te sum blagodaren na koi ao mi pomogne :):):).Email-monkaka@abv.bg