RewriteOptions: MaxRedirects option has been removed in favor of the global LimitIn..
Вот тут сталкнулся с такой проблемой:
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) { } }
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';
$$name=(array)include 'file.php';
Собственно пустая страница, а в логах то что привел выше.
Если сделать
file2.php
Код:
$name=(array)include 'file.php';
то всё гуд. но мне надо именно $$name. И еще, если из массива в файле file.php убрать объект, то всё гуд.
Есть идеи? В рунете не нашел ответа, а в буржунете что-то не то, или я не понял.
Код:
$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) { }
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) { }
Мистика) Или я что-то не до понимаю?
Поясните для каких целей создана подобная порнография?
Цитата: RussianSpy
Поясните для каких целей создана подобная порнография?
=)
Не знаю как лучше назвать, скажем : блоки данных. Создаются динамически, а на странице использую в определенных местах. Это если ты про первый пост. А второй это уже просто эксперименты и естественно на практике не используется.
А вы не пробовали использовать более цивилизованные средства вроде JSON или XML?
Ну вообще-то, динамические "блоки данных" - это прямой выход на шаблоны. Али я неправ? :)
В 99 случаев из 100 eval и переменные переменных являются индикаторами наличия говнокода.
RussianSpy, я ж не говорю, что ТС написал шаблоны. Я говорю, что та задача, которую он сформулировал, должна решаться средствами шаблонизации.
Из того что написал ТС вообще непонятно зачем это он использует. На мой взгляд что-то вроде кэширования или сериализации.
2RussianSpy, со всем уважением к Вам, но Вы сэр, хамите. Тем более, Вы начали обсуждать мой "говнокод", не разобравшись в сути проблемы! Если Вы внимательно посмотрите первый пост, и посмотрите повнимательнее какой массив возвращается, то уведите что там возвращается объект! Или Вы научились объект mysqli перевести в xml или json? Вопрос был почему именно так происходит, я вижу что Вы просто не компетентны в этом вопросе и любите пообсерать людей.
Насчет разобраться - как можно разобраться если вы не предоставили достаточное количество кода. Например откуда берется переменная $p ? Она просто тупо появляется в выражении $$p=array(); и чему она равна и где объявляется неизвестно.
В любом случае срать я люблю только на ламеров и говнокодеров, которые пытаясь скрыть свою лень и бездарность, начинают обвинять всех окружающих в некомпетентности. Если это вы - то я вам сочувствую.
Хотите получить ответ - внятно сформулируйте вопрос, приведите код, опишите детали проблемы, а не выдранные откуда-то три строчки и собственные несвязные фразы
Цитата: RussianSpy
Нужно внятно формулировать вопрос, [..]
Если Вам вопрос не был понятен, зечем писать? Вы сэр, офтопер)))
Сочувствую Вам. По Вашим словам, можно сделать вывод, что люди писавшие php быдло кодеры, огорчу Вас, они будут по умнее Вас и меня вместе взятых.
$p эта таже $name из примера выше. По коду это вполне понятно.
P.S. Спасибо за репутацию. Не любите правду читать? ;)
Укажите место где появляется переменная $p. Вы либо что-то забыли показать, либо не знаете что такое переменные переменных.
Откройте документацию и еще раз прочитайте что такое Variable variables и как ими пользоваться. Я даже вам ссылочку дам, а то вдруг вас забанили в гугле.
Суть проблемы:
Белый экран при следующем коде и запись в лог апача записи
Цитата:
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) { } }
$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';
$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);
$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);
$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) { }
$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. то что серым, мой касяк.
Цитата: RussianSpy
Откройте документацию и еще раз прочитайте что такое Variable variables и как ими пользоваться. Я даже вам ссылочку дам, а то вдруг вас забанили в гугле.
http://www.php.net/manual/en/language.variables.variable.php
http://www.php.net/manual/en/language.variables.variable.php
Спасибо за ссылку, хоть гугл и не забанил. Но это и ёжику понятно) Мне как раз это и надо (не про ёжика).
1) Попробовать убрать приведение к массиву (array). Вообще не очень понятно зачем так сделано
2) Просто инлюдить файл без использования return в нем - переменные точно так же будут доступны
3) Обновить версию РНР если возможно (у меня установлена 5.3.6)
4) Еще меня смущает вот эта строка $$name=$tmp; она эквивалентна строке $qwerty = $tmp;. Попробовать определить переменную $qwerty раньше вызова этой странной строки
Код:
$this->name[$name]=(array)include 'file.php';
Ну и по пунктам.
1. приведение нужно к тому что может вернуться что-то отличное от массива, и чтоб не было из-за этого дальше ошибок. Хотя я еще раз об этом подумаю. Но всё равно и с ним и без него тоже самое.
2. Не получится, т.к. я не вижу смысла файлу передавать данные по каторым он должен сформировать массив, т.е. имя массива.
3. У меня 5.2.4 и стыдно сказать, на денвере)
4. Без ответ.
[COLOR="red"]О как. Только что проверил на Win 7 Max 32b все действительно работает (денвер той-же сборки), а на рабочей машине (на той которая на работе) Win XP 32b не работало. Блин.[/COLOR]
Вопрос снят. Сорри.
Код:
<?php
class A {
private $a;
function __construct() {
$this->a = 5;
}
};
$array = array('list_cnt' => 4, 'list_res' => new A());
return $array;
?>
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);
?>
$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. Опоздал чуток...
А вместо денвера лучше использовать что-нибудь другое - собственноручно собранный сервер или тот же XAMPP - работать будет стабильнее.