Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

RewriteOptions: MaxRedirects option has been removed in favor of the global LimitIn..

714
18 июня 2011 года
clgs
226 / / 29.10.2008
Всем привет.
Вот тут сталкнулся с такой проблемой:
RewriteOptions: MaxRedirects option has been removed in favor of the global LimitInternalRecursion directive and will be ignored. (из логов апача)

вызвана промлема следующим кодом
file.php
 
Код:
...
return $array; // array(2) { ["list_cnt"]=> string(1) "4" ["list_res"]=> object(mysqli_result)#7 (0) { } }


file2.php
 
Код:
$name='qwerty';
$$name=(array)include 'file.php';


Собственно пустая страница, а в логах то что привел выше.
Если сделать
file2.php
 
Код:
$name=(array)include 'file.php';

то всё гуд. но мне надо именно $$name. И еще, если из массива в файле file.php убрать объект, то всё гуд.

Есть идеи? В рунете не нашел ответа, а в буржунете что-то не то, или я не понял.
714
18 июня 2011 года
clgs
226 / / 29.10.2008
 
Код:
$t=(array)include 'file.php';
var_dump($t); // array(2) { ["list_cnt"]=> string(1) "4" ["list_res"]=> object(mysqli_result)#7 (0) { } }
$$p=array();
$$p[$p]=$t;
var_dump($$p); // array(0) { }


Мистика) Или я что-то не до понимаю?
13
18 июня 2011 года
RussianSpy
3.0K / / 04.07.2006
Поясните для каких целей создана подобная порнография?
714
18 июня 2011 года
clgs
226 / / 29.10.2008
Цитата: RussianSpy
Поясните для каких целей создана подобная порнография?


=)
Не знаю как лучше назвать, скажем : блоки данных. Создаются динамически, а на странице использую в определенных местах. Это если ты про первый пост. А второй это уже просто эксперименты и естественно на практике не используется.

13
18 июня 2011 года
RussianSpy
3.0K / / 04.07.2006
А вы не пробовали использовать более цивилизованные средства вроде JSON или XML?
278
18 июня 2011 года
Alexander92
1.1K / / 04.08.2008
Ну вообще-то, динамические "блоки данных" - это прямой выход на шаблоны. Али я неправ? :)
13
18 июня 2011 года
RussianSpy
3.0K / / 04.07.2006
Это не шаблоны а говнокод.
В 99 случаев из 100 eval и переменные переменных являются индикаторами наличия говнокода.
278
18 июня 2011 года
Alexander92
1.1K / / 04.08.2008
RussianSpy, я ж не говорю, что ТС написал шаблоны. Я говорю, что та задача, которую он сформулировал, должна решаться средствами шаблонизации.
13
18 июня 2011 года
RussianSpy
3.0K / / 04.07.2006
Из того что написал ТС вообще непонятно зачем это он использует. На мой взгляд что-то вроде кэширования или сериализации.
714
18 июня 2011 года
clgs
226 / / 29.10.2008
2RussianSpy, со всем уважением к Вам, но Вы сэр, хамите. Тем более, Вы начали обсуждать мой "говнокод", не разобравшись в сути проблемы! Если Вы внимательно посмотрите первый пост, и посмотрите повнимательнее какой массив возвращается, то уведите что там возвращается объект! Или Вы научились объект mysqli перевести в xml или json? Вопрос был почему именно так происходит, я вижу что Вы просто не компетентны в этом вопросе и любите пообсерать людей.
13
18 июня 2011 года
RussianSpy
3.0K / / 04.07.2006
Нужно внятно формулировать вопрос, мой говнокодерский друг. Переменные переменных - это говнокод.
Насчет разобраться - как можно разобраться если вы не предоставили достаточное количество кода. Например откуда берется переменная $p ? Она просто тупо появляется в выражении $$p=array(); и чему она равна и где объявляется неизвестно.

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

Хотите получить ответ - внятно сформулируйте вопрос, приведите код, опишите детали проблемы, а не выдранные откуда-то три строчки и собственные несвязные фразы
714
18 июня 2011 года
clgs
226 / / 29.10.2008
Цитата: RussianSpy
Нужно внятно формулировать вопрос, [..]

Если Вам вопрос не был понятен, зечем писать? Вы сэр, офтопер)))

Сочувствую Вам. По Вашим словам, можно сделать вывод, что люди писавшие php быдло кодеры, огорчу Вас, они будут по умнее Вас и меня вместе взятых.

$p эта таже $name из примера выше. По коду это вполне понятно.


P.S. Спасибо за репутацию. Не любите правду читать? ;)

13
18 июня 2011 года
RussianSpy
3.0K / / 04.07.2006
Я не говорил про РНР ничего. Язык ни при чем - язык это лишь инструмент. А инструментом могут пользоваться как профессионалы, так и идиоты.
Укажите место где появляется переменная $p. Вы либо что-то забыли показать, либо не знаете что такое переменные переменных.
13
18 июня 2011 года
RussianSpy
3.0K / / 04.07.2006
Откройте документацию и еще раз прочитайте что такое Variable variables и как ими пользоваться. Я даже вам ссылочку дам, а то вдруг вас забанили в гугле.
http://www.php.net/manual/en/language.variables.variable.php
714
18 июня 2011 года
clgs
226 / / 29.10.2008
Ну давайте еще раз)

Суть проблемы:
Белый экран при следующем коде и запись в лог апача записи
Цитата:
RewriteOptions: MaxRedirects option has been removed in favor of the global LimitInternalRecursion directive and will be ignored



file.php - файл который инклудится

 
Код:
// в качестве примера, в реале массив генерируется
$array=array(
  'list_cnt'=>4,
  'list_res'=>$mysqli->query(...)
);
return $array; // array(2) { ["list_cnt"]=> string(1) "4" ["list_res"]=> object(mysqli_result)#7 (0) { } }


file2.php - основной файл
 
Код:
// имя переменной указано в качестве примера
$name='qwerty';
// создаём переменную с именем указанным в $name
$$name=(array)include 'file.php';

Этот простой код создаёт ошибку с полным отказом на выполнения php скрипта.

Что сделать чтобы это заработало (это не пошаговая инструкция, это или):
1. В файле file.php из возвращаемого массива убрать объект
2. В файле file2.php сделать переменную не динамическую а статическую, т.е.
 
Код:
$tmp=(array)include 'file.php';


Еще интересно:
Если написать следующее
file2.php
 
Код:
// имя переменной указано в качестве примера
$name='qwerty';
// Записываем во временную переменную возвращаемый массив
$tmp=(array)include 'file.php';
var_dump($tmp);
$$name=$tmp;
var_dump($$name);

получается та-же самая картина, т.е. белый экран и запись в лог апача. А если написать так
file2.php
 
Код:
// Записываем во временную переменную возвращаемый массив
$tmp=(array)include 'file.php';
var_dump($tmp);

то всё работает (из второго пункта).

[COLOR="silver"]Ну и просто развлечение)
file2.php
 
Код:
// имя переменной указано в качестве примера
$name='qwerty';
// Записываем во временную переменную возвращаемый массив
$tmp=(array)include 'file.php';
var_dump($tmp); // array(2) { ["list_cnt"]=> string(1) "4" ["list_res"]=> object(mysqli_result)#7 (0) { } }
$$name=array();
$$name[$name]=$tmp;
var_dump($$name); // array(0) { }

Получается очень интересная картина)[/COLOR]
P.S. то что серым, мой касяк.
714
18 июня 2011 года
clgs
226 / / 29.10.2008
Цитата: RussianSpy
Откройте документацию и еще раз прочитайте что такое Variable variables и как ими пользоваться. Я даже вам ссылочку дам, а то вдруг вас забанили в гугле.
http://www.php.net/manual/en/language.variables.variable.php


Спасибо за ссылку, хоть гугл и не забанил. Но это и ёжику понятно) Мне как раз это и надо (не про ёжика).

13
18 июня 2011 года
RussianSpy
3.0K / / 04.07.2006
Мне не удалось выловить такую же ошибку - у меня все отрабатывает. Правда вместо mysqli я использовал результат выборки из MySQL и PostgreSQL. Могу поделиться лишь теориями:
1) Попробовать убрать приведение к массиву (array). Вообще не очень понятно зачем так сделано
2) Просто инлюдить файл без использования return в нем - переменные точно так же будут доступны
3) Обновить версию РНР если возможно (у меня установлена 5.3.6)
4) Еще меня смущает вот эта строка $$name=$tmp; она эквивалентна строке $qwerty = $tmp;. Попробовать определить переменную $qwerty раньше вызова этой странной строки
714
18 июня 2011 года
clgs
226 / / 29.10.2008
2RussianSpy, спасибо за ответ и потраченное на меня время. Я собствено сделал немного иначе, я записываю возвращаемый массив так
 
Код:
$this->name[$name]=(array)include 'file.php';


Ну и по пунктам.
1. приведение нужно к тому что может вернуться что-то отличное от массива, и чтоб не было из-за этого дальше ошибок. Хотя я еще раз об этом подумаю. Но всё равно и с ним и без него тоже самое.
2. Не получится, т.к. я не вижу смысла файлу передавать данные по каторым он должен сформировать массив, т.е. имя массива.
3. У меня 5.2.4 и стыдно сказать, на денвере)
4. Без ответ.

[COLOR="red"]О как. Только что проверил на Win 7 Max 32b все действительно работает (денвер той-же сборки), а на рабочей машине (на той которая на работе) Win XP 32b не работало. Блин.[/COLOR]

Вопрос снят. Сорри.
278
18 июня 2011 года
Alexander92
1.1K / / 04.08.2008
file.php:
 
Код:
<?php
 class A {
   private $a;
   function __construct() {
     $this->a = 5;
   }
 };
 $array = array('list_cnt' => 4, 'list_res' => new A());
 return $array;
?>


file2.php:
 
Код:
<?php
 $name = 'qwerty';
 $$name = (array)include 'file.php';
 var_dump($qwerty);
?>


Чистый лог. Абсолютно ожидаемый результат:
 
Код:
array(2) { ["list_cnt"]=> int(4) ["list_res"]=> object(A)#1 (1) { ["a:private"]=> int(5) } }

Так что проверяйте конфиги вашего сервера и сайта в частности.

P.S. Опоздал чуток...
13
18 июня 2011 года
RussianSpy
3.0K / / 04.07.2006
Вместо принудительного приведения к массиву лучше проверять тип переменной is_array(). Сдается мне что не всегда это приведение может корректно срабатывать.
А вместо денвера лучше использовать что-нибудь другое - собственноручно собранный сервер или тот же XAMPP - работать будет стабильнее.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог