как выключить register_globals?

Alexey

Новичок
как выключить register_globals?

Ситуация:
Удалённый сервер. По всей видимости для того чтобы не возникало проблем с ранее написанными скриптами у хостера с давних времён стоит register_globals=on.
Раньше PHP стоял как модуль Apache и я обходился файлом .htaccess в котором было прописано php_flag register_globals 0.
Теперь PHP обновили (5.0.1) и поставили через CGI. register_globals попрежднему "on". htaccess не работает.

Вопрос:
Возможно ли что-нибудь придумать чтобы отключить глобальные переменные?
(переписывать скрипты почему-то нехочется...)
 

SiMM

Новичок
Re: как выключить register_globals?

Автор оригинала: Alexey
По всей видимости для того чтобы не возникало проблем с ранее написанными скриптами у хостера с давних времён стоит register_globals=on.
Раньше PHP стоял как модуль Apache и я обходился файлом .htaccess в котором было прописано php_flag register_globals 0.
А зачем что-то переделывать, если скрипты работали под register_globals Off?
 

Фанат

oncle terrible
Команда форума
в каком смысле - не хочется?
они не работают, что ли?
 

Alexey

Новичок
в каком смысле - не хочется?
они не работают, что ли?
К счастью, по большей части работают, но не везде корректно...

$_SESSION['var'] = "variable";
$var = "переменная";
а теперь и $_SESSION['var'] = "переменная";

Вот такая проблема меня беспокоит.
(Сразу соглашусь, что не правильно было с моей стороны использовать переменные с одинаковыми именами. Но вот так уж получилось!)
 

neko

tеam neko
что в этом некорректного
проблема с глобалс единственная в том, чтобы установить вообще все в начальные значения -- что само по себе п роблемой быть не должно
 

Фанат

oncle terrible
Команда форума
Alexey
тот код, который ты привел, никогда не работает так, как ты написал.
все переменные остаются при своих значениях.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Автор оригинала: Фанат
Alexey
тот код, который ты привел, никогда не работает так, как ты написал.
когда мой код, написанный под register_globals=off перенесли на "on" - тоже были описанные проблемы

все переменные остаются при своих значениях.
не все

для решения я просто изменил свой класс, в котором запускаются сесии, добавив
PHP:
foreach($_SESSION as $key=>$val){
    unset ($_GLOBALS[$key]);
}
конечно, сессии гораздо удобнее запускать из класса, чем просто
session_start();
 

neko

tеam neko
бред какой-то

-~{}~ 14.12.04 18:18:

если забыть про очень старые версии php
что делает регистер глобас с точки зрения программиста:
вытаскивает из cookie, post, get ключи и значения и создает соответствующие переменные, до того как запускается скрипт
рассматривать проще всего именно так

сами cookie, post, get от этого не меняются
перменные которые определяет пользователь тоже не меняются
"глобализация" происходит ДО выполнения скрипта
что непонятно?
 

Фанат

oncle terrible
Команда форума
grigori
описанные тобой проблемы не имеют смысла.
ты можешь сам попробовать взять тот код, который "описал", и запустать.
ничего там не меняется.

я вполне допускаю, что проблемы могут быть.
но тогда и надо именно на форуме приводить именно проблемнывй код.
 

Gas

может по одной?
PHP:
<?php

 session_start();
 $_SESSION['var'] = 'value';
 header('location: /test/sess2.php?'.session_name().'='.session_id());

?>
Файл sess2.php
PHP:
<?php

 session_start();
 echo $_SESSION['var'].'<br>';
 $var = 'new value';
 echo $_SESSION['var'];

?>
Результат:
value
new value


Тестировалось на PHP 4.3.6 при register_globals = on
 

MiRacLe

просто Чудо
Автор оригинала: Фанат
Alexey
тот код, который ты привел, никогда не работает так, как ты написал.
все переменные остаются при своих значениях.
Вышеприведённый пример от Gas

при register_globals on на версиях от 4.3.4 до 4.3.10RC2 выдаёт вышеописанный результат
 

Alexey

Новичок
Спасибо, Gas, ты правильно сформулировал проблему.
Осталось найти решение...
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
что делает регистер глобас с точки зрения программиста:
вытаскивает из cookie, post, get ключи и значения и создает соответствующие переменные, до того как запускается скрипт
к сожалению, не совсем
создаются глобальные переменные со ссылками на массив $_SESSION
в результате теряется значение или глобальной переменной или переменной в сессии

Фанат> ты прав, но не успел - код уже приведен другим человеком
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Автор оригинала: Alexey
Осталось найти решение...
IMHO, если админы хостинг-провайдера не позволяют писать .htaccess - такой хостинг легче поменять, чем побороть
потому как подобных проблем будет много

впрочем, можно просто в начале работы unset-ить переменные из сессии, чтобы разорвать ссылки
 

Alexey

Новичок
Ok, всем спасибо!
Остановился на варианте
foreach($_SESSION as $key=>$val) { unset ($$key); }

Скажите, а если для всего сервера globals on, можно просить хостера, чтобы он для моего сайта сделал off? Такое возможно?
 

SiMM

Новичок
Можно. А ещё можно послать хостера лесом и взять нормальный хостинг, где можно всё настроить хотя бы .htaccess'ом.
 

jrip

Новичок
neko Здравствуй, молчаливый учитель :) Я уже дня два думаю. http://ru2.php.net/manual/ru/function.ini-set.php Тем же есть "register_globals". Почему нельзя?
 
Сверху