Имя: Пароль:
IT
Веб-мастеринг
Непонятки с сессиями в 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 при раскомментированной строке дальше идет сброс массива.