Я работаю с 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»?
Это не проблема redirection / header / session_start ().
print_r ($ _ SESSION) при первой загрузке:
Массив ([lang] => fr)
print_r ($ _ SESSION) после щелчка по английской ссылке (set_lang.php выше):
Массив ([lang] => dn)
print_r ($ _ SESSION) после щелчка по французской ссылке (set_lang.php выше):
Массив ([lang] => dr)
print_r ($ _ SESSION) после входа в систему:
Массив ([lang] => dr [valid] => 1 [pseudo] => GYC [uid] => 3)
Теперь это что-то,
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- точка с одним входом / могут быть лучшие.
Еще лучше было бы переключиться на структуру mvc (включая философию единой точки входа), но поскольку кривая обучения более крутая, по крайней мере, начинается с единственной точки входа.
============ ReEdit снова добавлена дополнительная информация ================================= ========= Хорошим вариантом было бы повторить эту проблему снова, но из контекста вашего проекта возьмите как можно меньше кода из вашего проекта в новых созданных файлах и попытайтесь снова создать проблему. держите его как можно проще, просто попробуйте снова создать ошибку