Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > функция возвращает пустые значения


Автор: Gold Dragon 8.7.2008, 07:56
есть функция
Код

function sR1Start($info=array('error'=>'')){
    GLOBAL $gd_sess, $gd_site;
    $error = ($info['error']!='') ? '<div class="col1" align="center"><b>Внимание, ошибка!</b>'.$info['error'].'<br></div>' : '';
    $gd_sess = number_format ($gd_sess / 60, 0);
    return <<<EOF
<div>
<table>
    <tr>
        <td><img src="{$gd_site}/images/knop4.gif" width="77" height="85" alt="Внимание, обманули!" border="0"></td>
        <td><h1>Внимание, обманули!</h1></td>
    </tr>
</table>
<p class="txt2">В разделе представлены записи  граждан и юридических лиц, которые считают, что пострадали от действий определенных людей, поступки которых, по их мнению, соответствует статьям 159 «Мошенничество», 
160 «Присвоение, растрата» УК РФ. Вы можете проверить данные интересующего вас человека или сделать новую запись.
<p>Проверить на судимость можно <a class="txt2" href="{$gd_site}/index.php?pages=in10">здесь</a>
{$error}
<p>&nbsp;</p>
<form action="index.php?pages=r1&id=1" method="post">
<input name="vid" type="hidden" value="4">
<hr>
<p>Для входа введите имя и пароль
<p><a class="txt2" href="http://befocus.qqq/index.php?pages=in06">Информация о получении пароля пользователя</a>
<table cellspacing="0" cellpadding="5" border="0" width="100%">
<tr class="txt1">
    <td align="right">Имя пользователя:</td>
    <td><input name="login" type="text" maxlength="20"></td>
</tr>
<tr class="txt1">
    <td align="right">Пароль:</td>
    <td ><input name="pasw1" type="password" maxlength="3" size="2">&nbsp;-&nbsp;<input
         name="pasw2" type="password" maxlength="3" size="2">&nbsp;-&nbsp;<input
         name="pasw3" type="password" maxlength="3" size="2">
    </td>
</tr>
<tr class="txt1">
    <td>&nbsp;</td>
    <td><input type="submit" value="Вход" name="id1"></td>
</tr>
</table>
</form>
<hr>
<span class="txt5">* если пользователь не произвел никаких активных действий в течение {$gd_sess} минут, он  автоматически выходит из регистрации</span><br><br>

</div>
EOF;
}

не могу понять ошибку. переменная $gd_sess и $error просто нулевые. Уже всю голову сломал и не знаю почему так. До return все переменные имеют значения, проверял

Помогите разобраться

Автор: Feldmarschall 8.7.2008, 08:07
С какой стати ты решил, что эта функция должна что-то возвращать, кроме кучи хтмл-а?
Где проверочный код, чтобы мы тоже могли увидеть, что "все пустое", а это тебе не померещилось?

Вообще, конечно, мешанина чудовищная. какие-то сессии вперемешку с HTML, все это засунуто в функцию...

Автор: Gold Dragon 8.7.2008, 08:17
эта функция и должна вернуть чистый html

вот временно кинул на рабочий сервер
http://befocus.ru/index.php?pages=r1&id=1

перед return поставил print_r($error);

Добавлено через 57 секунд
Цитата(Feldmarschall @  8.7.2008,  09:07 Найти цитируемый пост)
Вообще, конечно, мешанина чудовищная. какие-то сессии вперемешку с HTML, все это засунуто в функцию...
всё там нормально smile это часть шаблона

Автор: MoLeX 8.7.2008, 08:19
Gold Dragon, 
return возращает в твой основной скрипт ответ в виде хтмл кода (в твоем случае). как понял ты хочешь чтобы он еще и возратил значение переменных $gd_sess и $error. для этого надо так
Код

function sR1Start($info=array('error'=>''))
{
.....
return array($text, $gd_sess, $error)
}

//а на выходе можно воспользоваться list для получения отдельных переменных из массива
list($text, $gd_sess, $error) = sR1Start();

$text, //действие
$gd_sess, //действие
$error, //действие

Автор: Feldmarschall 8.7.2008, 08:28
Цитата(Gold Dragon @  8.7.2008,  08:17 Найти цитируемый пост)
эта функция и должна вернуть чистый html

а что ж ты тогда нам голову морочишь, что она не возвращает тебе $error?

Цитата(Gold Dragon @  8.7.2008,  08:17 Найти цитируемый пост)
всё там нормально smile это часть шаблона

Это НЕНОРМАЛЬНО. Когда частью шаблона являются функции и сессии.


Автор: Gold Dragon 8.7.2008, 08:38
да нет там сессий! Там переменные. И шаблон у меня постоен по этому принципу

конструкция типа
Код

$a = 'что-то';
$b = <<<EOF
строка - {$a}
EOF;

отлично работает с переменными. Вот во всём сайте всё отлично, а тут не хочет

вот зайдите сюда
http://befocus.qqq/index.php?pages=r2

там внизу есть ".... 15 минут...." А эти модули практически одинаковые...

Автор: Feldmarschall 8.7.2008, 08:43
Ты сам пробовал читать, что пишешь?
Ладно, оставим в стороне твою кашу, речь не о ней.
Что у тебя твоя функция не возвращает, и почему должна? 

Автор: MoLeX 8.7.2008, 08:54
Код

<?php
    $gd_sess = "1200";
    $gd_site = "http://site";
    echo sR1Start("werwerwe");

function sR1Start($info = array("error" => ""))
{
    GLOBAL $gd_sess, $gd_site;
    $error = ($info["error"] != "")?"<div class=\"col1\" align=\"center\"><b>Внимание, ошибка!</b> ".$info."<br></div>":"";
    $gd_sess = number_format ($gd_sess / 60, 0);
    return <<<EOF
<div>
<table>
    <tr>
        <td><img src="{$gd_site}/images/knop4.gif" width="77" height="85" alt="Внимание, обманули!" border="0"></td>
        <td><h1>Внимание, обманули!</h1></td>
    </tr>
</table>
<p class="txt2">В разделе представлены записи  граждан и юридических лиц, которые считают, что пострадали от действий определенных людей, поступки которых, по их мнению, соответствует статьям 159 «Мошенничество», 
160 «Присвоение, растрата» УК РФ. Вы можете проверить данные интересующего вас человека или сделать новую запись.
<p>Проверить на судимость можно <a class="txt2" href="{$gd_site}/index.php?pages=in10">здесь</a>
{$error}
<p>&nbsp;</p>
<form action="index.php?pages=r1&id=1" method="post">
<input name="vid" type="hidden" value="4">
<hr>
<p>Для входа введите имя и пароль
<p><a class="txt2" href="http://befocus.qqq/index.php?pages=in06">Информация о получении пароля пользователя</a>
<table cellspacing="0" cellpadding="5" border="0" width="100%">
<tr class="txt1">
    <td align="right">Имя пользователя:</td>
    <td><input name="login" type="text" maxlength="20"></td>
</tr>
<tr class="txt1">
    <td align="right">Пароль:</td>
    <td ><input name="pasw1" type="password" maxlength="3" size="2">&nbsp;-&nbsp;<input
         name="pasw2" type="password" maxlength="3" size="2">&nbsp;-&nbsp;<input
         name="pasw3" type="password" maxlength="3" size="2">
    </td>
</tr>
<tr class="txt1">
    <td>&nbsp;</td>
    <td><input type="submit" value="Вход" name="id1"></td>
</tr>
</table>
</form>
<hr>
<span class="txt5">* если пользователь не произвел никаких активных действий в течение {$gd_sess} минут, он  автоматически выходит из регистрации</span><br><br>
</div>
EOF;
}
?>


 smile работает)))

Автор: Gold Dragon 8.7.2008, 08:56
Feldmarschall, а может попроще с наездами?


а теперь по сути...

часть функций это часть шаблона. Функция возвращает HTML-код. При этом получает несколько переменных. В данном случае при начальной загрузке станицы ошибки ($info['error']) нет. Если отправить форму без каких-то данных. то  переменная вернётся с описанием ошибки и эта переменная вставляется в код.

Проблема в том что я не понимаю почему переменная до оператора return существует, а возвращается нулевая.

Я дал ссылку на аналогичную страницу.. там это (как на всём сайте) работает


ps
что касается чудовещной мешанины. Это один вариантов шаблонов. Если мне не изменяет память то все скины этого форума постоены именно по этому принципу

Добавлено через 1 минуту и 57 секунд
MoLeX, я знаю что она работает, но именно на этой странице нет.. Вот и хочу понять что может быть

Автор: Feldmarschall 8.7.2008, 09:03
Цитата(Gold Dragon @  8.7.2008,  08:56 Найти цитируемый пост)
Если отправить форму без каких-то данных. то  переменная вернётся с описанием ошибки и эта переменная вставляется в код.

в приведенном коде нет и следа обработки форм. к чему это предложение?

Цитата(Gold Dragon @  8.7.2008,  08:56 Найти цитируемый пост)
Проблема в том что я не понимаю почему переменная до оператора return существует, а возвращается нулевая.

За 10 сообщений ты так ни разу и не написал, что имеется в виду под "возвращает"

Цитата(Gold Dragon @  8.7.2008,  08:38 Найти цитируемый пост)
отлично работает с переменными. 

это заметно, что отлично. по этому топику особенно =)

Автор: Gold Dragon 8.7.2008, 09:11
Цитата(Feldmarschall @  8.7.2008,  10:03 Найти цитируемый пост)
в приведенном коде нет и следа обработки форм. к чему это предложение?
 вообще-то MoLeX, показал как она выводится (возвращается). А если быть более точным, то из таких блоков (функций) складывается вся страница. Например, так
Код

$page['headCenter'] = sIndexHeadCenter();
$page['title'] = 'Добро пожаловать на главную страницу - beFocus.ru';
$page['content'] = sIndexMain();
$result  = sIndexHead($page['title']);
$result .= sIndexBody($page);

echo $result


Цитата(Feldmarschall @  8.7.2008,  10:03 Найти цитируемый пост)
это заметно, что отлично. по этому топику особенно =)
поэтому и спрашиваю.

Автор: Feldmarschall 8.7.2008, 09:21
У тебя кривая и неочевидная система шаблонизации. 
И все проблемы - из-за неё.

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

Автор: Mal Hack 8.7.2008, 09:31
Gold Dragon, привет Тамбову =)
Скажи, какие условия обеспечивают: 
Цитата(Gold Dragon @  8.7.2008,  08:38 Найти цитируемый пост)
Вот во всём сайте всё отлично, а тут не хочет

т.е. в чем выражается это "тут"?

Автор: Gold Dragon 8.7.2008, 09:35
ну значит у нас подмена понятий и различия в терминологи.  smile 

хорошо, попробую ещё раз повторить
Цитата(Feldmarschall @  8.7.2008,  09:43 Найти цитируемый пост)
Что у тебя твоя функция не возвращает, и почему должна? 

эта функция возвращает какой-то HTML-код. Не возвращает переменные которые я ей передаю. 
А именно $error = '', а $gd_sess = 0. Первая переменная передаётся этой функции, вторая берётся из конфигурации, т.е. простая глобальная переменная. 

Почему должна возвращать?.. Потому что
- возвращается весь код
- правильно вставляются, а следственно возвращаются другие переменные ($gd_site)
- в самой функции переменные существуют (ссылку на пример я дал. Если нажать на "ВХОД", то можно увидеть что переменная в функции существует.

Цитата(Feldmarschall @  8.7.2008,  10:21 Найти цитируемый пост)
У тебя кривая и неочевидная система шаблонизации. 
вся система постоена по принципу
Код

...
<<<EOF
....
<p>структура документа</p>
{какая_то_переменная}
<p>структура документа</p>
....
EOF;

потом из этих скинов составляется весь документ. Как я уже упоминал, форум IPB постоен именно по такому принципу, только с использованием классов. А у меня всё попроще и использую только функции. Может ты просто с такой не сталкивался? Но по мне очень удобная и гибкая система

Добавлено через 5 минут и 9 секунд
Mal Hack, и тебе привет.. всё некогда было smile

смотри две станицы
http://befocus.ru/index.php?pages=r1
и
http://befocus.ru/index.php?pages=r2

нажми на "ВХОД"
на первой странице переменная почему-то нулевая (её содержимое можешь увидеть в верху страницы, я в функции поставил print_r($errror) )
на второй странице всё работает..

Просто даже не знаю где копать.. Ведь в этой функции используется три переменные, а две нулевые

Автор: Mal Hack 8.7.2008, 09:49
Тебе надо копать там, где у тебя эта функция вызывается, т.к. там содержимое $_POST теряется или переопределяется.

Автор: Feldmarschall 8.7.2008, 09:53
Я прекрасно знаю, что такое хередок, можно мне не объяснять =)
Форум IPB давно от такой системы отказался. Поскольку это не шаблон, а винегрет в своем худшем виде.
Вместо простого и наглядного файла шаблона мы имеем пхп код, в котором лежат функции, в которых лежит хередок. Игла в яйце, яйцо в утке, утка в зайце, заяц в офиге...
А теперь мы попробуем со всей этой фигней взлететь, ага.

По поводу твоего кода.
Я написал, в самом начале:
Цитата(Feldmarschall @  8.7.2008,  08:07 Найти цитируемый пост)
Где проверочный код, чтобы мы тоже могли увидеть, что "все пустое", а это тебе не померещилось?

Не "можно кнопку нажать". Не "не возвращаются" (я, наконец-то, понял, что ты имеешь в виду, постоянно повторяя это слово).
А код.
Простой код, который иллюстрирует твою проблему. И который можно воспроизвести.
Почему бы не сократить HTML до одной строчки? Кто тебе мешает это сделать? Почему нельзя последовательно упрощать код, чтобы в конечном итоге добраться до источника проблем, как это делают все программисты, в процессе отладки?

Где, в конце, концов, вывод этого print_r($error)?
и почему она должна что-то содержать?

Автор: Gold Dragon 8.7.2008, 10:01
уже говорил smile Вот 
Код

function sR1Start($info=array('error'=>'')){
    GLOBAL $gd_sess, $gd_site;

// обе переменные существуют и содержат данные

    $error = ($info['error']!='') ? '<div class="col1" align="center"><b>Внимание, ошибка!</b>'.$info['error'].'<br></div>' : '';

// переменная существет и содержит данные (впри нажатии на "ВХОД"

    $gd_sess = number_format ($gd_sess / 60, 0);

// переменная существует

    return <<<EOF

// переменные уже не существуют 

<div>
<table>
    <tr>
......
EOF;


Добавлено через 4 минуты и 46 секунд
Feldmarschall, да ёмоё.. ну ты читай что ли....  smile  Оказивается не только я не вижу попросов. но и ты ответы smile 

Цитата(Gold Dragon @  8.7.2008,  09:17 Найти цитируемый пост)
перед return поставил print_r($error);


Цитата(Gold Dragon @  8.7.2008,  09:38 Найти цитируемый пост)
вот зайдите сюдаhttp://befocus.qqq/index.php?pages=r2там внизу есть ".... 15 минут...." А эти модули практически одинаковые...


Цитата(Gold Dragon @  8.7.2008,  10:35 Найти цитируемый пост)
смотри две станицыhttp://befocus.ru/index.php?pages=r1иhttp://befocus.ru/index.php?pages=r2нажми на "ВХОД"на первой странице переменная почему-то нулевая (её содержимое можешь увидеть в верху страницы, я в функции поставил print_r($errror) )на второй странице всё работает..


Автор: Mal Hack 8.7.2008, 10:10
global маленькими напиши.

Добавлено через 38 секунд
Но с точки зрения технологии это не совсем верно...

Автор: Gold Dragon 8.7.2008, 10:12
вот что на странице сейчас. Бумаю видно что и где должно выводиться и проверяться на наличие

Код

function sR1Start($info=array('error'=>'')){
    GLOBAL $gd_sess, $gd_site;
    $error = ($info['error']!='') ? '<div class="col1" align="center"><b>Внимание, ошибка!</b>'.$info['error'].'<br></div>' : '';
    $gd_sess = number_format ($gd_sess / 60, 0);
    echo $gd_sess.'<br>'.$gd_site.'<br>'.$error;
    return <<<EOF
    {$gd_sess}
    {$gd_site}
    {$error}
<div>
<table>
    <tr>
        <td><img src="{$gd_site}/images/knop4.gif" width="77" height="85" alt="Внимание, обманули!" border="0"></td>
        <td><h1>Внимание, обманули!</h1></td>
    </tr>
</table>
<p class="txt2">В разделе представлены записи  граждан и юридических лиц, которые считают, что пострадали от действий определенных людей, поступки которых, по их мнению, соответствует статьям 159 «Мошенничество», 
160 «Присвоение, растрата» УК РФ. Вы можете проверить данные интересующего вас человека или сделать новую запись.
<p>Проверить на судимость можно <a class="txt2" href="{$gd_site}/index.php?pages=in10">здесь</a>
{$error}
<p>&nbsp;</p>
<form action="index.php?pages=r1&id=1" method="post">
<input name="vid" type="hidden" value="4">
<hr>
<p>Для входа введите имя и пароль
<p><a class="txt2" href="http://befocus.qqq/index.php?pages=in06">Информация о получении пароля пользователя</a>
<table cellspacing="0" cellpadding="5" border="0" width="100%">
<tr class="txt1">
    <td align="right">Имя пользователя:</td>
    <td><input name="login" type="text" maxlength="20"></td>
</tr>
<tr class="txt1">
    <td align="right">Пароль:</td>
    <td ><input name="pasw1" type="password" maxlength="3" size="2">&nbsp;-&nbsp;<input
         name="pasw2" type="password" maxlength="3" size="2">&nbsp;-&nbsp;<input
         name="pasw3" type="password" maxlength="3" size="2">
    </td>
</tr>
<tr class="txt1">
    <td>&nbsp;</td>
    <td><input type="submit" value="Вход" name="id1"></td>
</tr>
</table>
</form>
<hr>
<span class="txt5">* если пользователь не произвел никаких активных действий в течение {$gd_sess} минут, он  автоматически выходит из регистрации</span><br><br>

</div>
EOF;
}

http://befocus.ru/index.php?pages=r1


Автор: Feldmarschall 8.7.2008, 10:18
Gold Dragon, на странице "этого" быть не может. Поскольку "это" - только определение функции. А вызова здесь нету.

В коде мы видим
Код

 echo $gd_sess.'<br>'.$gd_site.'<br>'.$error;

на странице -
Цитата

15<br>http://befocus.ru<br>0<br>http://befocus.ru<br>

у тебя есть идеи, как 2 br превратились в 4?

Автор: Gold Dragon 8.7.2008, 10:19
Цитата(Mal Hack @  8.7.2008,  11:10 Найти цитируемый пост)
global маленькими напиши.Добавлено через 38 секундНо с точки зрения технологии это не совсем верно...
да вроде в прошлый раз так ине определились что лучше передавать переменные или использовать глобальные smile

Feldmarschall, уже много раз давай ссылку на результат smile 
Насчёт всего кода согласен. Но оставил его только потому что он именно так на сервере, вдруг где-то именно в самом коде синтаксис глючит.. просто уже не вижу. Пытался полность переписать вручную и заново, тоже самое..

а насчёт иголки--яйца--утки... Мне нравится так  smile проблема то сейчас не в этом

Добавлено через 6 минут
Цитата(Feldmarschall @  8.7.2008,  11:18 Найти цитируемый пост)
у тебя есть идеи, как 2 br превратились в 4?
а вот это уже интересно... почему-то не обратил на это внимание...  smile 

Автор: Mal Hack 8.7.2008, 10:25
передавать конечно.

Автор: Gold Dragon 8.7.2008, 10:29
действительно, функция скорее всего вызывается два раза. Буду смотреть..


Feldmarschall, и нечего было так кричать smile Вот видишь у меня уже как говориться, взгляд замусолился, а ты заметил...

Mal Hack, в чём плюсы передачи?

Автор: Feldmarschall 8.7.2008, 10:31
Цитата(Gold Dragon @  8.7.2008,  10:19 Найти цитируемый пост)
уже много раз давай ссылку на результат 

в котором ничего, из того, что ты описывал словами, не было.

Цитата(Gold Dragon @  8.7.2008,  10:19 Найти цитируемый пост)
проблема то сейчас не в этом

именно в этом. в кривом шаблоне. 

Цитата(Gold Dragon @  8.7.2008,  10:19 Найти цитируемый пост)
почему-то не обратил на это внимание... 

Это неудивительно. Ты слишком большое внимание уделял собеседникам, объясняя им, какие они некультурные. Где уж тут за своим кодом смотреть.
Тем более, что код вообще ничего не выводил.
Может, ты что-то и правил на своем befocus.qqq, но на страницах, на которые ты исправно посылал своих собеседников, не выводилось ни-че-го.

Автор: Gold Dragon 8.7.2008, 10:51
Feldmarschall, ну конечно, я вот весь такой из себя.. и всё у меня кривое, и всё не как надо и правильно, и всё через одно место сделано.. Предлагаю меня расстрелять smile 

В общем, вопрос закрыт. Проблема оказалось банальной, в условиях была логическая ошибка и функция использовалась несколько раз. А шаблон уж не такой и кривой оказался  smile 

Автор: skyboy 8.7.2008, 12:48
Цитата(Gold Dragon @  8.7.2008,  09:51 Найти цитируемый пост)
А шаблон уж не такой и кривой оказался

кривой не шаблон сам по себе. подход к системе шаблонизации выбран один из самых неудобных для отладки, рефакторинга и даже - использования.
впрочем, тебе с этим жить.

Автор: Gold Dragon 8.7.2008, 13:00
skyboy, есть несколько причин по которым я этим пользуюсь. Ну первая и наверное самая главная - я просто привык и мне очень с ним удобно работать. Вторая - используя этот подход удобнее менять вид страниц, т.е. можно сделать все страницы сайта абсолютно разными вплодь до изменения стилей и расположения элементов при меньших затратах smile
Кстати, есть же тема "Шаблонизатор", решение что лучше так и не приняли  smile 

Автор: skyboy 8.7.2008, 15:33
Цитата(Gold Dragon @  8.7.2008,  12:00 Найти цитируемый пост)
решение что лучше так и не приняли

там, насколько мне помнится, речь шла о HTML с PHP вставками, блочный шаблонизатор и XML/XSLT
все они дают фору варианту с  heredoс.
а) попробуй сделать шаблон внутри шаблона: либо переменную придется инициализировать содержимым целиком(значит, занимать память), либо придется разрывать heredoc'овское echo, что не улучшит читабельность ни на йоту
б) попробуй вызвать PHP  функцию в шаблоне; опять же: либо придется дополнительно инициировать переменные, либо разрывать вывод
в) попробуй сделать вывод однотипной информации по данным в массиве: придется разрывать вывод, чтоб можно было echo вынести в РНР-шный цикл
или я чего не понимаю?

Автор: Gold Dragon 8.7.2008, 15:38
не по теме конечно пошло... smile

разрывов у меня нет.. я просто даю функции массив, а там просто в HTML-тексте уже идут простые вставки типа {$info['name']} и всё очень читаемо  smile А из функции возвращается готовая страница.

Автор: Mal Hack 8.7.2008, 15:46
Цитата(Gold Dragon @  8.7.2008,  10:29 Найти цитируемый пост)
Mal Hack, в чём плюсы передачи? 

Использование глобальных переменных чревато их возможным изменением где-ть..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)