Переход с PHP4 на PHP5

Статус
В этой теме нельзя размещать новые ответы.

karapet

Постоялец
Регистрация
9 Сен 2008
Сообщения
169
Реакции
105
Вообщем есть движок один, писал знакомый давненько.. Думаю его под сателиты попробовать доделать, но вот встала проблема в том что он писался на PHP4 и теперь на денвере с PHP5 отказывается работать.. Я уже почти докатился до прописывания в начале типа:

Код:
$content = $_POST['content'];
$title = $_GET['title'];
$id_news = ($_POST['id_news']?$_POST['id_news']:$_GET['id_news']);
$edit_news = ($_GET['edit_news']?$_POST['edit_news']:$_GET['edit_news']);
и т.д...

но головой понимаю что должно быть какоето простое решение нежели переименовывать во всем скрипте все переменные или как я... гдето встречался пример перехода, но гугль щас чето отказывается мне показывать(((
 
если хочеш что бы работал можно сделать в конфиге php
register_globals = on
но это не есть гуд, так что лучше перепиши код, ИМХО. :)
 
Не в конфиге, который недоступен обычно, а в .htaccess
php_value register_globals on

вместо
$id_news = ($_POST['id_news']?$_POST['id_news']:$_GET['id_news']);
удобнее
$id_news = $_REQUEST['id_news'];

ну и на крайний случай, если регистер_глобалс не врубается (такое видел тоже), то как очень плохой, но быстрый костыль
extract ($_REQUEST);
 
Не в конфиге, который недоступен обычно, а в .htaccess
php_value register_globals on
Что приведёт к 500 ошибке при установке PHP как *CGI.
Не стоит отвечать столь категорично.
Да и речь в топике о денвере, а не хостинге.

По сабжу - потратить один или два или 3 дня и добавить везде где надо $_GET|POST.
Или же воспользоваться советом из поста #2 (для денвера это не критично).
 
Что приведёт к 500 ошибке при установке PHP как *CGI.
На такой случай советуют, как вариант, такое.
php_admin_flag register_globals on

я не пробовал. регистер_глобалс мне нафиг не нужно

Не стоит отвечать столь категорично.
Да и речь в топике о денвере, а не хостинге.
Речь идет о движке, который приспосабливают под саттелиты. Из этого делаем вывод, что движок будет движком саттелита и на денвере только напильником дорабатывается. А саттелиты на денвере никому не нужны.

И не всегда можно потратить 2-3 дня на ручную доработку. Писал не он, а раньше как писали (и я в том числе) - не обозначиваю переменные, которые приходят мне, а использую их там, где мне надо. И чтобы найти их надо шерстить хмтл, либо обмен с сервером. Либо логить ошибки, но в старых скриптах варнингов и нотисов столько, что закачаешься. Я вот вчера модуль к форуму IPB включил вывод ошибок и там количество ошибок на 3 раза прокрутить страницу, прежде чем вывод нормальный пойдет.
 
На такой случай советуют, как вариант, такое.
php_admin_flag register_globals on
Какой такой случай?
При установке PHP как CGI, любая дирректива php_* в htaccess приведёт к Internal Server Error.

И не всегда можно потратить 2-3 дня на ручную доработку. Писал не он, а раньше как писали (и я в том числе) - не обозначиваю переменные, которые приходят мне, а использую их там, где мне надо.
Ух ты :)
А прописывание
$id_news = ($_POST['id_news']?$_POST['id_news']:$_GET['id_news']);
займёт много меньше времени? Разговор о целесообразности проверки как пришла переменная вообще опустим.
 
......
Вот eval() и поможет нам объявить все переменные из массива $_REQUEST. Выглядит это совсем коротко:
foreach($_REQUEST as $k=>$v)
{
eval("\$$k='$v';");
}

Вставьте этот цикл в самом начале вашего скрипта; он переберет массив глобальных переменных и объявит их не хуже register_globals. А может быть даже и лучше, т.к. глобальных массивов много, а вытаскивать переменные не обязательно из всех. Как правило, данных из массива $_REQUEST - вполне достаточно.

Однако, не стоит забывать и о безопасности вашего кода. Обратите внимание на специфику работы функции eval() - она обработает весь код, переданный ей в качестве параметра. Будьте осторожны, примите меры безопастности, чтобы злоумышленник не подсунул в качестве названия или содержимого переменной кусок своего php-кода или просто неверные данные, способные вызвать ошибку (например, имя переменной, начинающее с цифры или другого неразрешенного символа).
09.02.2003

P.S. После опубликования этой заметки, на форуме не один раз высказывались мысли о том, что вариант с eval() - не самый лучший. Лично я предпочитаю оставлять для себя "путь к отступлению", и eval() как раз привлекателен тем, что позволяет полностью контролировать процесс, добавляя необходимые проверки и ограничения в процедуру или наоборот - расширяя возможности кода. Например, можно добавить логирование регистрации отдельных переменных, чтобы знать - кто, куда, откуда, зачем, или четко запретить к регистрации определенные имена переменных или другие данные.

Впрочем, у каждого метода есть свои плюсы и свои минусы - думайте сами, решайте сами - как поется в известной песне.

Метод "переменные переменных".
foreach($_REQUEST as $k=>$v)
{
$$k=$v;
}

Как видите, тоже простой метод, основанный на том, что значение переменной $k используется в качестве имени новой переменной. Удобно. Отличается автоматической регистрацией не только переменных, но и массивов. В случае с методом eval() придется проверять каждую переменную на is_array() и разворачивать (регистрировать) ее дополнительно, если такой массив вам нужен.

И самый простой метод - extract().

Весь код нашего примера будет выглядеть так:
extract($_REQUEST);

Это самый "тупой" метод, "разворачивающий" в переменные все, что содержится в массиве $_REQUEST. Нет абсолютно никакой гибкости в этом подходе - повлиять на регистрацию переменных или ввести какой-либо контроль вы не сможете, но выглядит очень лаконично.

И, наконец, не забывайте о том, что register_globals можно активировать не только в конфигурационном файле Apache, но и в файле .htaccess вашего сайта.


решил остановиться на:

Код:
foreach($_REQUEST as $k=>$v)
{
 $$k=$v;
}

как ни странно, все вроде нормально работает :) только вот какие минусы у данного решения и насколько оно безопасно? при условии что сам по себе код тоже был безопасен на PHP4 :)
 
Безопасно оно ровно на столько, насколько было безопасно на PHP4.
Минусы - накладные расходы на эмуляцию register_globals.
 
class Foo {
function Foo($class)
{
$this = new $class;
}
}
class Bar {
}
$foobar = new Foo('Bar');
// Fatal error: Cannot re-assign $this

подскажите как лучше такую проблему решить, я с С++ знаком, но не припомню там подобных конструкций, а к ООП в интерпретаторах отношусь не очень, т.к. накладные рассходы, посему не знаю с какой стороны подойти…

PS
register_globals = on но это не есть гуд
само по себе это не дырка, я всегда поражался тому, что это например, в неткате было условием работы движка, а сам неткат по взлому, очень и очень безопасен
 
само по себе это не дырка, я всегда поражался тому, что это например, в неткате было условием работы движка, а сам неткат по взлому, очень и очень безопасен
Так оно и есть. Если руки растут из правильного места, то опасности в них никакой. А если не из правильного, то и суперглобальные массивы не помогут.

подскажите как лучше такую проблему решить
PHP:
class Foo {
	public $inst;

	function __construct($class) {
		$this->inst = new $class;
	}
}

class Bar {
}
$foobar = new Foo('Bar');
Ну и доступ через $this->inst. $this является указателем на инстанс класса Foo и переопределить его нельзя.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху