переменная сеанса php потеряна - PullRequest
2 голосов
/ 12 октября 2011

Я работаю с php5 и apache2 на моей машине для разработки.Рабочий сервер, по-видимому, аналогичен.

У меня есть скрипт set_language.php, который создает переменную сеанса в соответствии с выбранным языком:

<?php
session_start();
$back = $_SERVER['HTTP_REFERER'];

    if (isset($_GET['lang'])) {
            if ($_GET['lang'] == 'fr')
            $_SESSION['lang'] = 'fr';
        else if ($_GET['lang'] == 'en')
            $_SESSION['lang'] = 'en';
    }
    header( "Location: $back" ) ;
    exit();
?>

Затем я включаю код ниже на всех страницах:

session_start();
if(isset($_SESSION['lang']) && $_SESSION['lang'] == 'en') {
    require('lang_en.php');
}
else if(isset($_SESSION['lang']) && $_SESSION['lang'] == 'fr') {
require('lang_fr.php');
}

Чем можно получить зависящие от языка переменные с помощью:

echo $lang[sometexttotranslate];

На сервере разработки все работает как положено.Я нажимаю на ссылку, чтобы установить язык, и мои переменные сеанса содержат lang = en или fr

На рабочем сервере:

$ _ SESSION ['lang'] = dn или dr (должен быть en или fr)

echo $ lang [sometexttotranslate] = d (должен быть переведенным текстом)

Любойидея, откуда взялась буква "d"?

Это не проблема перенаправления / header / session_start ().


print_r ($ _ SESSION) при первой загрузке:

Array ([lang] => fr)

print_r ($ _ SESSION) после нажатия на английскую ссылку (set_lang.php выше):

Array ([lang] => dn)

print_r ($ _ SESSION) после нажатия на французскую ссылку (set_lang.php выше):

Array([lang] => dr)

print_r ($ _ SESSION) после входа в систему:

Array ([lang] => dr [valid] => 1 [pseudo]] => GYC [uid] => 3)

1 Ответ

5 голосов
/ 12 октября 2011

Теперь это что-то,

print_r($_SESSION) after a click on the english link (set_lang.php above):

Array ( [lang] => dn )

Ваша проблема начинается здесь в set_lang.php. Возможно, сессия запускается из включенного файла, и этого не должно происходить!

Если set_lang не включен, убедитесь, что там есть start_session, также поместите туда print_r, вы можете даже сравнить идентификаторы сессии:

скажем, это index.php

<?php
session_start();  
?>
<a href='set_lang.php?sess=<?PHP echo session_id();?>'>lang</a>

и этот set_lang.php

<?PHP  
session_start(); 
echo 'this is session id from index.php: ',$_GET['sess'],
'and this is session id in set_lang.php:',session_id(),
'and this is the print_r:<br><pre>';
print_r($_SESSION);
?>

вы должны увидеть тот же идентификатор сессии.

Но хотя все это может вам помочь, я сделаю еще один шаг, используйте одну точку входа, не вызывайте php-скрипт напрямую, как это

<a href=somescript.php>link</a>

(если вы не делаете ajax), вместо этого вы всегда вызываете некоторый php-скрипт через index.php, например:

<a href=index.php?target=somescript.php>link</a>

Таким образом, вы можете начать сеанс только один раз в index.php, проверку входа можно также выполнить в index.php.

======================= Редактировать больше информации добавлено ==================== ===================== Быстрый поиск в Google .. нашел этот небольшой однократный учебник http://www.renownedmedia.com/blog/php-navigation-system-using-single-entry-point/ там могут быть лучшие.

Еще лучше было бы переключиться на инфраструктуру MVC (которая включает в себя философию единой точки входа), но поскольку кривая обучения более крута, по крайней мере, начните с одной точки входа. ============ Снова добавьте больше информации ============================= ============ Тогда хорошим вариантом будет повторить эту проблему снова, но вне контекста проекта, взять как можно меньше кода из проекта в новых созданных файлах и попытаться снова создать проблему. сделайте это как можно проще, просто попробуйте снова создать ошибку

...