PHP, хранящий данные $ _SESSION в переменной, неизменно вызывает ссылку на объект сеанса - PullRequest
0 голосов
/ 05 ноября 2019

Мне просто нужно было отладить проблему на рабочем сайте php. Это демонстрация того, что оригинальный разработчик предполагал, что $ cust_id = $ _SESSION ['cust_id'];был передан по значению, но каким-то образом это была ссылка на объект сеанса!

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

Код:

<?php

        session_start();

        $_SESSION['cust_id'] = 1;           // sets $_SESSION['cust_id'] 1 = all good

        echo $_SESSION['cust_id'] . "<br>";    // returns 1 = all good

        $cust_id = $_SESSION['cust_id'];      // sets $cust_id 1 = all good     //note this is not =&

        echo $cust_id . "<br>";               // returns 1 = all good

        echo $_SESSION['cust_id'] . "<br>";    // returns 1 = all good

        $cust_id = 5;                          // He is going to use this variable for something else for a little bit. should be ok.

        echo $cust_id . "<br>";               // returns 5 = all good

        echo $_SESSION['cust_id'] . "<br>";    // He expected this to still hold 1, because he haden't changed the session variable at all
                                               // returns 5!!!  what the...  $cust_id wasn't a reference to the session object surely? the original developer didn't expect that.

        echo "phpversion: " . phpversion() . "<br>";

        echo "ini_get('register_globals'): " . ini_get('register_globals') . "<br>";

Выход:

1
1
1
5
5
phpversion: 5.3.29
ini_get('register_globals'): 1

1 Ответ

0 голосов
/ 05 ноября 2019

Решено:

На некоторых веб-хостах php включен параметр REGISTER_GLOBALS (в php.ini)

, что приводит к тому, что $ _SESSION ['cust_id'] также создаетвнутренняя переменная с именем $ cust_id

, если бы разработчик использовал имя переменной, отличное от имени сеанса, проблема не возникла бы. Я просмотрел весь код и переименовал все имена переменных, чтобы они отличались от имен сессий, и теперь код совместим со всеми различными серверами php с или без этой настройки.

$ cust_id_another_name = $ _SESSION ['cust_id '];

Я ясно вижу из этого примера, почему REGISTER_GLOBALS OFF - гораздо лучшая идея для сокращения инцидентов. Вот почему в PHP 5.4 теперь он выключен по умолчанию, и вы не можете его изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...