Эта тема на forum.dklab.ru


wsok: Странное поведение условного оператора IF при использовании функции
Имею функцию которая выводит файлы блоков:
function blocks($value){
global $db, $inf, $inf2, $keyinf, $stop, $reason, $urlhome, $go, $inum, $numb, $numbc, $pd;
if($pd)
{$q = "WHERE bpos='$value' AND ons = '1' AND bplug like '%$pd%'";}
else
{$q = "WHERE bpos='$value' AND ons = '1' AND bhome= '1'";}
$result = $db->sql_query("SELECT * FROM blocks $q ORDER BY prb ASC");
$num = $db->sql_numrows($result);
while ($row2 = $db->sql_fetchrow($result)) {
$f++;
if($f >= 2){$w = ",";}else{$w = "";}
$a .="$w".$row2['fname']."";
}
if($num > 0){
$files = explode(",", $a);
for ($t = 0; $t < count($files); $t++) {
include("blocks/".$files[$t]."");
}

}else{
return false;
}
}

В шаблоне темы оформления вставил условный оператор IF, который проверяет есть ли содержание в функции:

if(blocks(right)){
echo"<td width=300px valign=top align=center>
<table border=0 width=250px height=100% align=center class='bgtd' >
<tr><td align=center valign=top>";
blocks(right);
echo"</td></tr></table></td>";
}

Но... Условный оператор не работает, а срабатывает сама функция что вписана в его скобках. Даже если уберу тот код, что должен был вывести условный оператор... Сработает не условный оператор а сама функция, которая прописана в него...

Короче я не понял причин такой странной работы(неработы) условного оператора IF, как не допустить срабатывание моей функции в условном операторе? Вот такая странная задачка возникла у меня.
wsok:
добавил аргумент в функцию :
function blocks($value, $mode){
global $db, $inf, $inf2, $keyinf, $stop, $reason, $urlhome, $go, $inum, $numb, $numbc, $pd;
if($pd)
{$q = "WHERE bpos='$value' AND ons = '1' AND bplug like '%$pd%'";}
else
{$q = "WHERE bpos='$value' AND ons = '1' AND bhome= '1'";}
$result = $db->sql_query("SELECT * FROM blocks $q ORDER BY prb ASC");
$num = $db->sql_numrows($result);
while ($row2 = $db->sql_fetchrow($result)) {
$f++;
if($f >= 2){$w = ",";}else{$w = "";}
$a .="$w".$row2['fname']."";
}
if($mode == 1){
if($num > 0){
$files = explode(",", $a);
for ($t = 0; $t < count($files); $t++) {
include("blocks/".$files[$t]."");
}
}
}elseif($mode == 0){
if($num) return true;
else return false;
}
}

не знаю насколько это правильно, но по крайней мере вызов INCLUDE в функции можно вторым аргументом отсечь, чисто для проверки переменной $num

Наверно слишком банально, но другого в голову ничего не пришло...
wsok:
если будут альтернативные идеи моему решению, буду только рад увидеть, так как не убеждён в правильности своего решения.

В чём минус моего решения, так это лишние запросы в БД при проверке в условном операторе.
Rumata:

if ( условное_выражение ) {
действие_1
} else {
действие_2
}

Условный оператор if работает следующим образом:
1. вычиляется условное_выражение
2. результат вычисления приводится к логическому типу
3. если результат приведения == true, то выполнить пункт 5
4. если результат приведения == false, то выполнить пункт 7
5. выполнить действие_1
6. перейти к следующему оператору
7. выполнить действие_2

В Вашем примере вычисляется услвное_выражение, представленное вызовом функции, которая выполняется, но не возвращает значение true. Проверяйте логику функции. Для начала расставьте отступы, чтобы увидеть вложенность операторов. Уверен, Вы сами после этого разберетесь - где же не работает.
wsok:

if ( условное_выражение ) {
действие_1
} else {
действие_2
}

Условный оператор if работает следующим образом:
1. вычиляется условное_выражение
2. результат вычисления приводится к логическому типу
3. если результат приведения == true, то выполнить пункт 5
4. если результат приведения == false, то выполнить пункт 7
5. выполнить действие_1
6. перейти к следующему оператору
7. выполнить действие_2

В Вашем примере вычисляется услвное_выражение, представленное вызовом функции, которая выполняется, но не возвращает значение true. Проверяйте логику функции. Для начала расставьте отступы, чтобы увидеть вложенность операторов. Уверен, Вы сами после этого разберетесь - где же не работает.

Получается, что моё решение проблемы как раз соотносится с тем, что вы мне сказали. Вторым аргументом я как бы говорю функции как работать, выводить содержание или вернуть логическое представление функции FALSE или TRUE . Получается это единственное решение использовать эту функцию в условном операторе.
Александр Михалицын:
wsok,
Вы бы для начала код оформили таким образом, чтобы его можно было воспринимать. Лично у меня, например, нет ни малейшего желания читать неоформленный код.
wsok:
wsok,
Вы бы для начала код оформили таким образом, чтобы его можно было воспринимать. Лично у меня, например, нет ни малейшего желания читать неоформленный код.

Да я думаю нужды уже нет выкладывать весь код, мой прошлый собеседник тут уже дал понять, что функцию, которая выводит данные - нельзя использовать в условном операторе. Пришлось добавить второй аргумент в неё, чтоб переключать режим работы функции, если приходится её проверять в условном операторе.
Maus:
функцию, которая выводит данные - нельзя использовать в условном операторе
да ну?
<?php

function say_hello() {
echo " Hello! ";
return true;
}

function say_bye() {
echo " Bye! ";
return false;
}

if ( say_hello() )
{
if ( say_bye() )
{
echo " oops...";
} else {
echo " RTFM";
}
} else {
echo " hmm... ";
}

В PHP функции всегда возвращают значения. Даже если нет return
Юрий Насретдинов:
Человек просто не в курсе, что echo и return — это разные операторы.
Maus:
... и так же не в курсе, что если функция не содержит return (или она может отработать по такой ветке, где нет return),то это эквивалентно тому, что она возвращает null (а null==false )

Эта тема на forum.dklab.ru