session bitrix присваивание ссылка

valters

Новичок
session bitrix присваивание ссылка

имеется следующий код:
PHP:
<?
session_start();


$str ='квадрат малевича';
$_SESSION['str']=$str;

echo '<pre>';
print_r($_SESSION);
echo '</pre>';
          if (!empty ($str)){
               $str = explode(" ", $str);
          }
echo '<pre>';
print_r($_SESSION);
echo '</pre>';
?>
У меня он возвращает:
PHP:
Array
(
    [str] => квадрат малевича
)

Array
(
    [str] => квадрат малевича
)
Все правильно, так и должно быть.
Но стоит запустить такой код на CMS bitrix, то в первый раз он возвращает:
PHP:
Array
(
    ...
    [str] => квадрат малевича
)

Array
(
    ...
    [str] => квадрат малевича
)
А после вторичного обращения к странице:
PHP:
Array
(
    ...
    [str] => квадрат малевича
)

Array
(
    ...
    [str] => Array
        (
            [0] => квадрат
            [1] => малевича
        )

)
Вопрос к знатокам. Почему в сессию производится занесение ссылки на $str, иначе как объяснить изменение значения хранящегося в сессии, если это значение не меняли.
Есть предположение что происходит присваивание ссылки на переменную, вместо самого значения...
Кто что думает?

-~{}~ 08.11.07 12:32:

Попробовал так:
PHP:
<?
session_start();


$str ='квадрат малевича';
$_SESSION['str']=$str;

echo '<pre>';
print_r($_SESSION);
echo '</pre>';
$str='Другое значение';
/*		if (!empty ($str)){
			$str = explode(" ", $str);
		}
*/
echo '<pre>';
print_r($_SESSION);
echo '</pre>';
?>
Выдал:
PHP:
Array
(
    ...
    [str] => квадрат малевича
)

Array
(
    ...
    [str] => Другое значение
)
Безобразие :(
 

dimagolov

Новичок
это случайно не register_globals on вызывает отображение $str в $_SESSION['str'] и наоборот? если переменную назвать не $str а $str1 и выводить $_SESSION['str'] и $_SESSION['str1'] что будет?
 

Nogrogomed

Новичок
именно это я и ляпнул...
Регистер глобалс регистрирует: Environment, GET, POST, Cookie, Server. Сессий там нет. только вот заметил, что
[str] => Array
(
[0] => квадрат
[1] => малевича
)

Выводится если прописать
$_SESSION['str']=&$str;
 

valters

Новичок
Автор оригинала: Nogrogomed
только вот заметил, что
[str] => Array
(
[0] => квадрат
[1] => малевича
)

Выводится если прописать
$_SESSION['str']=&$str;
У меня в коде происходит присваивание значения:
$_SESSION['str']=$str;
Так что я не понимаю как может там оказаться ссылка...

Запустил phpinfo(), в разделе про сессии:

session

Session Support enabled
Registered save handlers files user

Directive Local Value Master Value
session.auto_start Off Off
session.bug_compat_42 On On
session.bug_compat_warn On On
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_divisor 100 100
session.gc_maxlifetime 1440 1440
session.gc_probability 0 0
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path /var/lib/php4 /var/lib/php4
session.serialize_handler php php
session.use_cookies On On
session.use_only_cookies Off Off
session.use_trans_sid Off Off


Может там что то не так?
 

valters

Новичок
Автор оригинала: cDLEON
Какое другое?
Код приведен как есть. То есть он выглядит так как я написал. После того как присвоили:

$_SESSION['str']=$str;

И вывели:

echo '<pre>';
print_r($_SESSION);
echo '</pre>';

в переменную записываем абсолютно любое значение, или любым образом изменяем, например:

$str='Другое значение';

И чудесным способом меняется значение в $_SESSION['str'].
 

Nogrogomed

Новичок
мне кажется копать надо в сторону ошибки... Фактически - по скрипту - он думает, что $str - пустая. А почему она пустая? Выведи ее перед условием.

Сэмулировать такое поведение не смог...
 

Nelius

кипарис во дворе
Как вариант можно попробовать так:

$str ='квадрат малевича';
$_SESSION['not_same_name']=$str;
 

valters

Новичок
Да, этот вариант работает.
Но все таки хочется разобраться что происходит...
Сейчас код совсем маленький:
PHP:
<?
session_start();
$str ='квадрат малевича';
$_SESSION['str']=$str;
echo '<pre>';
print_r($_SESSION);
echo '</pre>';
$str='Другое значение';
echo '<pre>';
print_r($_SESSION);
echo '</pre>';
?>
При первом заходе на страницу, с чистой сессией выводит все правильно:
PHP:
Array
(
    [str] => квадрат малевича
)

Array
(
    [str] => Другое значение
)
А при повторном заходе выводит странно:
PHP:
Array
(
    [str] => квадрат малевича
)

Array
(
    [str] => Другое значение
)
Повторить подобное не удается на локальном сервере даже с теми же директивами что на сервере где хостится скрипт:
PHP:
<?
ini_set('session.gc_probability', 0);
ini_set('session.use_trans_sid', 'off');
ini_set('session.bug_compat_42', 'on');
ini_set('session.use_trans_sid', 'Off');
session_start();


$str ='квадрат малевича';
$_SESSION['str']=$str;
$_SESSION['ssilka_str']=&$str;
echo '<pre>';
print_r($_SESSION);
echo '</pre>';
$str='Другое значение';
/*		if (!empty ($str)){
			$str = explode(" ", $str);
		}
*/
echo '<pre>';
print_r($_SESSION);
echo '</pre>';
phpinfo();
?>
Какая же особенность сервера может так искажать работу интерпретатора при работе с сессиями?
 

Nelius

кипарис во дворе
CMS Bitrix писал видимо кто-то ... ну не будем о грустном...
Я просто предположил что они(программеры битрикса) где-нить у себя в движке могут что-то творить с сессиями и одноименными переменными... о господи, я не думал что такое абсурдное предположение может оказаться реальностью...
Так что настройки сервака ни при чем...
 

dimagolov

Новичок
valters, если намеков не понимаешь, скажу прямо. перестань страдать ссылками и прочим, а просто разведи (сделай разными) в своем примере имя переменной и индекс сессии (т.е. имя сессионной переменной), как писал я в первом же содержательном ответе, как повторил Nelius. отчитайся о результатах.

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

bkonst

.. хочется странного?...
Автор оригинала: Nogrogomed
именно это я и ляпнул...
Регистер глобалс регистрирует: Environment, GET, POST, Cookie, Server. Сессий там нет. только вот заметил, что
Вы ошибаетесь; register_globals регистрирует переменные из сессии, что и приводит к описанной проблеме.
Не всегда стоит доверять официальной документации, тем более что в документации по сессиям написано:
If register_globals is enabled, then the global variables and the $_SESSION entries will automatically reference the same values which were registered in the prior session instance.
Простейший код для проверки:
PHP:
<?php

session_start();
var_dump($test);
$_SESSION['test'] = "XXXX";

?>
 

valters

Новичок
Всем большое спасибо.
Действительно такой эффект от register_globals.
bitrix не причем.

На локальном сервере удалось повторить этот эффект, введя register_globals = on
 

Nelius

кипарис во дворе
Хех я даже рад что ошибся!) Всегда знал что register_globals - ЗЛО! Всегда в начале кода у меня ini_set('register_globals','Off');
Спасибо, про сессии полезный опыт, не предпологал честно говоря.
 

Nelius

кипарис во дворе
Автор оригинала: *****
И что - сильно помогает?
Хз, ни разу не юзал хостинг с включенным register_globals, да и у меня на серваке всегда выключено по умолчанию) :D
 
Сверху