2014-12-24 3 views
0

Это был еще один из тех моментов, которые тянутся волосы, и мне было интересно, может ли кто-нибудь пролить свет на этот вопрос, который у меня есть.Невозможно установить переменные сеанса на странице, обрабатывающей session.upload_progress.name

Мне удалось воспроизвести проблему с помощью двух простых страниц php.

Page1 (test.php)

Это только простая форма загрузки файла, который также использует скрытое поле session.upload_progress.name. Затем он выводит $_SESSION массив:

<form name="fileupload" action="test2.php" method="POST" enctype="multipart/form-data"> 
    <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123"> 
    <input type="file" name="newfile"> 
    <input type="submit" name="submit" value="Submit"> 
</form> 
<?php 
    if(!isset($_SESSION)) { 
     session_start(); 
    } 
    print_r($_SESSION); 
?> 

Page 2 (test2.php) Эта страница просто добавляет переменную сеанса, и выводит $_SESSION массив. Она также включает в себя ссылку, чтобы вернуться к test.php:

<?php 
    if(!isset($_SESSION)) { 
     session_start(); 
    } 
    $_SESSION['new']='Im a new value that will disappear'; 
    print_r($_SESSION); 
?> 
<a href="test.php">Go back</a> 

Теперь, если вы загрузите test1.php, он будет:

{ The form } 
Array() 

Нажмите представить, и это приведет вас к test2.php и выход:

Array 
(
    [upload_progress_123] => Array 
     (
      [start_time] => 1419385365 
      etc etc ... 
     ) 

    ) 

    [new] => Im a new value that will disappear 
) 

Теперь нажмите кнопку 'назад', и это будет только выход:

{ the form } 
Array 
(
    [upload_progress_123] => Array 
     (
      [start_time] => 1419385365 
      etc etc ... 
     ) 

    ) 
) 

(Обратите внимание, как [new] нет)

Есть ли веские основания для того, почему это происходит?

В этом примере у меня установлен session.upload_progress.cleanup для отладки. Но поведение нового сеанса одинаково, когда оно установлено на.

+0

Похоже, я Гунн должен придерживаться баунти на него ... Просто из любопытства, кто-нибудь скопировал мой код и получил тот же результат? –

ответ

2

Проблема заключается в том, что вы проверяете активный сеанс перед его запуском. session_start() следует вызывать на каждой странице, чтобы вам не нужны эти if(!isset($_SESSION)), если вы удалите их, страница должна работать правильно.

Но если по какой-то причине вы должны проверить, если был запущен сеанс, правильный способ сделать это в соответствии с this answer бы:

if (session_status() == PHP_SESSION_NONE) { 
    session_start(); 
} 
+0

Это не объясняет, почему новая сессия исчезает. Если я введу ваши изменения в код, то будут достигнуты те же результаты. –

+0

Странно, я скопировал ваш код и воспроизвел проблему. Изменил его, и он работал правильно. Какую версию PHP вы используете? –

+0

v5.5 на Ubuntu Trusty ... Когда вы скопировали мой код, удалось ли вам реплицировать проблему? –