Переменные сеанса PHP изменяются с включением файла - PullRequest
0 голосов
/ 13 октября 2011

Этот вопрос основан на предыдущем вопросе, который я задал , но он запутался в изменениях, поскольку я не был уверен, откуда возникла проблема. (Пожалуйста, сообщите, если этот вопрос необходимо закрыть)

Я разрабатываю с PHP 5.3.3 в среде разработки + Apache 2 (мой код работает там) Рабочий сервер имеет PHP 5.2.6 и тот же сервер (здесь не работает тот же код)

Благодаря Мелси по другому вопросу мне удалось сузить проблему до нескольких строк кода.

Проблема: во включаемом файле я запускаю сеанс и проверяю переменную. В зависимости от этой переменной сеанса я включаю языковой файл.

Структура выглядит так:

-index.php
INCLUDE
    -menus.php
    -lang_fr.php
    -lang_en.php

Файлы выглядят следующим образом:

index.php

<?php
    //SET LANGUAGE
    if (isset($_GET['lang']) && $_GET['lang'] == 'fr') {
        $_SESSION['lang'] = 'fr';
    }
    else if (isset($_GET['lang']) && $_GET['lang'] == 'en') {
        $_SESSION['lang'] = 'en';
    }
    else {
        $_SESSION['lang'] = 'en';
    }
    include_once 'include/menus.php';
?>

<html>
<head>
    <title>building...</title>
</head>
<body>

    <?php
            echo($links);
    ?>

<br><br>

print_r($_SESSION);

<br><br>

    <?php
            print_r($_SESSION);
    ?>

</body>
</html>

MENUS.PHP

<?php
    session_start();
    if(isset($_SESSION['lang']) && $_SESSION['lang'] == 'en') {
        include_once('lang_en.php');
    }
    else if(isset($_SESSION['lang']) && $_SESSION['lang'] == 'fr') {
        include_once('lang_fr.php');
    }
    else {
        $_SESSION['lang'] = 'fr';
        include_once('lang_fr.php');
    }
    $links = <<<EOT
    <a href="/index.php?lang=en">English</a>&nbsp;&nbsp;
    <a href="/index.php?lang=fr">French</a>
EOT;

?>

LAN_EN и FR.PHP

<?php

$lang['test'] = "Test";

?>

Это на моем локальном сервере работает и отображает правильные переменные сеанса, когда я нажимаю на ссылки.

На рабочем сервере я получаю:

-Первая загрузка: Массив ([lang] => fr) (по умолчанию, правильный)

- Нажмите на английскую ссылку: Массив ([lang] => Tn)

- Нажмите на французскую ссылку: Array ([lang] => Tr)

Если я изменю в языковом файле «Тест» на «Пешт», приведенные выше результаты будут «Pn» и «Pr»

Я хотел бы знать, если что-то не так с кодом или с сервером конфигурации (в соответствии с их поддержкой, в этом нет ничего плохого), и если да, в чем может быть проблема.

Примечание. Проблема исчезает при удалении включений из menus.php

.

Ответы [ 2 ]

3 голосов
/ 13 октября 2011

Проблема в вашем коде заключается в том, что вы устанавливаете переменные Setting и в Index.php, а запускаете сеанс в файле Menu.php. Пожалуйста, измените вещь на:

Index.php

<?php
    ob_start();
    session_start();

    //SET LANGUAGE
    if (isset($_GET['lang']) && $_GET['lang'] == 'fr') {
        $_SESSION['lang'] = 'fr';
    }
    else if (isset($_GET['lang']) && $_GET['lang'] == 'en') {
        $_SESSION['lang'] = 'en';
    }
    else {
        $_SESSION['lang'] = 'en';
    }
    include_once 'include/menus.php';
?>

<html>
<head>
    <title>building...</title>
</head>
<body>

    <?php
            echo($links);
    ?>

<br><br>

print_r($_SESSION);

<br><br>

    <?php
            print_r($_SESSION);
    ?>

</body>
</html>

MENUS.PHP

<?php
    if(isset($_SESSION['lang']) && $_SESSION['lang'] == 'en') {
        include_once('lang_en.php');
    }
    else if(isset($_SESSION['lang']) && $_SESSION['lang'] == 'fr') {
        include_once('lang_fr.php');
    }
    else {
        $_SESSION['lang'] = 'fr';
        include_once('lang_fr.php');
    }
    $links = <<<EOT
    <a href="/index.php?lang=en">English</a>&nbsp;&nbsp;
    <a href="/index.php?lang=fr">French</a>
EOT;

?>

Думаю, это решит вашу проблему

2 голосов
/ 13 октября 2011

Если вы внимательно посмотрите на мой ответ в вашем предыдущем вопросе, самое первое упомянутое (выделено жирным шрифтом) было именно так:

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

Вайн прав, и я расширю его право, отвечу чуть больше!

Когда вы включаете файл child.php в Father.php, вы должны думать о коде, найденном в child.php, как о компоненте Father.php. Одна из первых вещей, которую вы делаете в скрипте Father.php (например, index). .php) - начало сессии. Вы не запускаете сеанс во включенном скрипте, потому что это может создать конфликт, так как другой сеанс уже может быть запущен.

А если у вас много файлов, (что еще хуже, если некоторые из них включены или выполняются напрямую, без единой точки входа), тогда как легко управлять всем этим ?!

Вы сказали это:

Спасибо, но проблема не в структуре моего сайта

Ну, это может быть не совсем так! Дело в том, что написание старого школьного кода (без mvc, без единой точки входа, на самом деле не объектно-ориентированного) имеет преимущество, заключающееся в очень легкой кривой обучения. ОДНАКО хотя такой код легко написать, дело в том, что такой код требует больше навыков, чтобы избежать ошибок!

С другой стороны, объектно-ориентированному подходу сложнее приступить к работе, потому что есть много вещей, которые нужно изучить (объекты, прототипы, интерфейс, релятивность (принадлежность, часть) и т. Д.) И требует другого поведения. ОДНАКО Вы определенно выиграете больше!

И последнее! Хорошо хорошо структурированный сайт заставляет сеанс управлять несколькими строками, написанными только один раз в самом начале, и это все.

Я рад, что вы двое, решая свою проблему!

...