|
Непонятки с сессиями в php | ☑ | ||
---|---|---|---|---|
0
Fragster
гуру
26.02.15
✎
18:46
|
Казалось бы - чего тут сложного, но все же не пойму никак:
<?php var_dump($_SESSION['errors']); if (count($_SESSION['errors']) != 0) { foreach($_SESSION['errors'] as $error) { ?> <p> <?=$error?> <?php } //$_SESSION['errors'] = array(); } ?> если раскомментить закомменченую строку, то ничего не выводит и дампит пустой массив, немсотря на то, что обнуление происходит после вывода :( |
|||
1
Fragster
гуру
26.02.15
✎
18:49
|
условие для воспроизведения - переменная должна быть установлена в предыдущем выполнении скрипта (ну, или в другом скрипте).
|
|||
2
Asmody
26.02.15
✎
18:54
|
Где session_start()?
|
|||
3
Fragster
гуру
26.02.15
✎
19:08
|
(2) выше, чем кусок (0)
|
|||
4
Fragster
гуру
26.02.15
✎
19:08
|
я ж говорю - если раскомментить //$_SESSION['errors'] = array(); , то все работает. Только мне надо один раз сообщение об ошибке показывать.
|
|||
5
Fragster
гуру
26.02.15
✎
19:25
|
вот полный текст для воспроизведения ошибки:
<?php session_start(); if (!isset($_SESSION['errors'])) { $_SESSION['errors'] = array(); } if (isset($_REQUEST['action'])) { $_SESSION['errors'][] = 'Ошибка!!'; header('Location: ?'); } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="?action=test" method="POST"> <input type="text" value="12"/><input type="submit" value="hello"/> </form> <?php echo('<p>+'.count($_SESSION['errors'])); if (count($_SESSION['errors']) != 0) { echo('<p>-'.count($_SESSION['errors'])); //$_SESSION['errors'] = array(); } ?> </body> </html> |
|||
6
Fragster
гуру
27.02.15
✎
09:20
|
никто не знает, почему, или ни у кого не воспроизводитс?
|
|||
7
Fragster
гуру
27.02.15
✎
09:21
|
может быть кто-нибудь знает, как правильно?
|
|||
8
raykom
27.02.15
✎
09:31
|
Да ты убери пока переменные из эха, поставь любой текст в эхо и отследи просто событие - есть или нет. Может и впрямь пусто. Уж потом катай с переменными.
|
|||
9
Fragster
гуру
27.02.15
✎
09:34
|
(8) если внутри условия обнулять, то условие не выполняется
|
|||
10
raykom
27.02.15
✎
09:39
|
Дак убедись пошагово, что каждое условие истина или ложь.
Пойми, хотя бы, что отрабатывает - ошибка или действие. Вариантов то всего 2. Спровоцируй стопудовую ошибку и катай сначала if (!isset($_SESSION['errors'])) А то когда ваианты - не поймешь, что и отрабатывает. А то, может у тебя if (isset($_REQUEST['action'])) отрабатывает, а ты дамп мучаешь от условия if (!isset($_SESSION['errors'])) |
|||
11
raykom
27.02.15
✎
09:44
|
+(10)
>echo('<p>+'.count($_SESSION['errors'])); if (count($_SESSION['errors']) != 0) { echo('<p>-'.count($_SESSION['errors'])); //$_SESSION['errors'] = array(); А это то уже вывод отработки условий. Надо смотреть как учлись каждые события по счетчику, как в массив завернулись. Но это потом. Ты еще не знаешь, какое условие состоялось. Или я тихо понимаю ? |
|||
12
Fragster
гуру
27.02.15
✎
10:22
|
(10)(11) в исходнике (5) если строку оставить закомменченую - то с каждым сабмитом количество count($_SESSION['errors'] увеличивается.
Если раскомментить строку, которая _внутри условия_ по count (причем сначала вывели количество, потом обнулили массив), то оно даже в это условие не будет заходить |
|||
13
raykom
27.02.15
✎
10:32
|
А array() как организована ?
|
|||
14
Fragster
гуру
27.02.15
✎
10:40
|
(13) это пустой массив просто.
|
|||
15
raykom
27.02.15
✎
10:52
|
Я потерялся.
(0)>если раскомментить закомменченую строку, то ничего не выводит и дампит пустой массив (4)Юя ж говорю - если раскомментить //$_SESSION['errors'] = array(); , то все работает Т.е. работает - это дампит пустой массив ? Ну так с учетом (13) - это логично. Или я мало налил ? |
|||
16
Fragster
гуру
27.02.15
✎
11:00
|
(15) мало налил.
если оставить строку закомменченой - то оно выводит с каждым нажатием на кнопку все увеличивающееся значение. Пока все логично. если раскомментить строку, которая находится _внутри_ проверки условия на количество элементов - у меня все время выводится 0, хотя по логике - должно выводиться 1 (мы же с каждым нажатием на кнопку добавляем элемент в массив, а если там 0, то мы не должны попадать вообще внутрь условия и обнулять массив). |
|||
17
raykom
27.02.15
✎
11:28
|
(16)>мы же с каждым нажатием на кнопку добавляем элемент в массив
Ну так и возвращаемся к вопросу в (13) Запись в массив то как то происходит же ? Функция то как организовано ? Криво пишешь массив, вот он и пусто й получается. |
|||
18
raykom
27.02.15
✎
11:33
|
Судя по тому, как я одиноко моршу лоб в этой ветке - на форуме ясамый умный в ПХП.
Хотя подсознание подсказывает, что это не так ))) |
|||
20
Fragster
гуру
27.02.15
✎
11:42
|
(17) смотри. вот псевдокод спорного куска на 1с:
Если Массив = Ноепределено Тогда Массив = Новый Массив; КонецЕсли; Массив.Добавить("Ошибка"); ... тут непереводимая с php перезагрузка страницы ... Сообщить("+" + Массив.Количество()); Если Массив.Количество() <> 0 Тогда Сообщить("-" + Массив.Количество()); //Массив = Новый Массив; // вот тут если расскомментить, то почему-то даже в условие не заходит КонецЕсли |
|||
21
raykom
27.02.15
✎
12:05
|
ТАк переопределяешь $_SESSION на пустой массив, следующий раз и не сабатывает.
Вот хороший примерчик для тебя. http://www.softtime.ru/bookphp/gl8_1.php |
|||
22
Fragster
гуру
27.02.15
✎
12:35
|
вот так работает http://pastebin.com/Tue5c9Mr
|
|||
23
eRik
27.02.15
✎
12:49
|
т.е. проблема была в exit после location :)
само по себе отсыл header не прекращает работу скрипта, и после установки errors при раскомментированной строке дальше идет сброс массива. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |