Jump to content
  • 0

Ифы и ифы форах


gesandte
 Share

Question


Вот кусок кода:


{
$modules = mysql_fetch_array($query_modules);
if ($content === $modules[id_name])
{
include "modules/$modules[id_name]/index.php";
}
}

if ($content === "auth") :
include "auth.php";
elseif ($content === "close") :
include "close.php";
elseif ($content === "mail") :
include "mail.php";
else :
include "modules/$settings[/page][page]/index.php";
endif;
  for ($i = 0; $i < mysql_num_rows($query_modules); $i++)

$content извлекается из адресной строки(гет).

Предположим что в каждом файле содержится некая переменная, имя которой одинаково в каждом файле, а значения разные.

Проблема в том, что если условие равенства выполняется в куске кода с циклом, то второй кусок кода(if-elseif-else) срабатывает на else. В итоге переменная изменит свое значение. Можно конечно решить эту проблему очень просто, поменяв местами части этого кода, т.е вначале if-elseif-else, а затем уже цикл.

Но это решение не кажется мне правильным, т.к получается, что если $content будет соответствовать условию в цикле, то вначале подгрузится файл от первой части кода (сработает else), а только потом нужный нам файл. Конечно в итоге на выходе значение условной переменной из файла будет иметь нужное значение.

Вот и как составить условие, чтоюбы не происходило двойной зугрузки файла пока не пойму.................................

хотя........................

можно в else вписать цикл с условиями, в содержащееся там include влепить еще проверку на то, было ли задействована функция include(можно присваивать некий флаг). Далее в else написать условие на проверу флага и если include из цикла не происходило, то подключать файл по умолчанию.....

Как видите, то что я придумал на ходу выглядит как то уж очень громоздко, может кто преложит более простой и компактный вариант

Спасибо.

П.с Изначально планировалось использовать switch-case , а во внутрь ее поместить еще и цикл. Код конечно выглядел там красиво, но вылетала ошибка(((

ПП.сс Ивиняюсь за кривое название темы)

Edited by gesandte
Link to comment
Share on other sites

Recommended Posts

  • 0

rus, а ты для этих целей хочеш предложить ипользовать == ? :D

Ты бы лучше объяснил что ты хочешь получить на выходе, то есть визуально.

Как визуально? :D

Вот смотри. Мы в зависимости от значения $content подключаем нужный нам файл, а после подключения(в коде не указал), мы выводим значение переменной, которое содержалось в подключаемом файле

Link to comment
Share on other sites

  • 0
rus, а ты для этих целей хочеш предложить ипользовать == ? :D

А почему бы и нет? Ведь пустого значения не будет?

А к стати, а почему со свич кейсом не вышло-то?

Вроде бы он тут как раз подходит...

Link to comment
Share on other sites

  • 0
А почему бы и нет? Ведь пустого значения не будет?

дело в том что при использовании == сравнерие происходит , как бы сказать "по линии логических значений", то есть true и false. Т.о если какой нибудь умник в адресной строке нипишет $content=true , то при этом будут выполнены все условия, за исключением условия, находящегося в else и тем самым пых будет подгружать почти все файлы, кроме, как я написал последнего условия.

А к стати, а почему со свич кейсом не вышло-то?

Вроде бы он тут как раз подходит...

интерпритатор ошибку выдавал, если не путаю, указывя на стороку закрытия цикла. Могу написать на свитче снова и отписаться о результате

что-то не врублюсь никак... а почему в цикл нельзя нижний if поместить?

Хм :D и вправду можно, и сразу объединить их в один иф.....

правда вызывает сомнение что это правильно, ведь получается увеличение нагрузки на сервер........

Edited by gesandte
Link to comment
Share on other sites

  • 0
А к стати, а почему со свич кейсом не вышло-то?

Вроде бы он тут как раз подходит...

вот оно - зло :

Parse error: syntax error, unexpected T_FOR, expecting T_CASE or T_DEFAULT or '}'

вобщем нельзя цикл в свитч

Кстати в самом начале я наврал(тока щас заметил) немного. В приведенном примере вылетае ошибка, если передать значение $content удовлетворяющее первому ифу в цикле

Link to comment
Share on other sites

  • 0


наверно придется остановится на такой структуре(работает как надо)



for ($i = 0; $i < mysql_num_rows($query_modules); $i++) {
$modules = mysql_fetch_array($query_modules);

if ($content === $modules[id_name]) {
$flag = @include "modules/$modules[id_name]/index.php";
}
}

if ($flag == true) {
echo "функция include применена";
} else {
echo "функция include не была применена";
include "modules/$settings[/page][page]/index.php";
}

т.е применить флаг

Edited by gesandte
Link to comment
Share on other sites

  • 0

Ладно, вопрос наверно можно закрыть.

Но чтобы не засорять форум напишу сюда еще один.

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

Т.о в самом начале страницы мы имеем получение данных из таблицы в массив $query_modules

А второй блоков к примеру выглядит так


for ($i = 0; $i < mysql_num_rows($query_modules); $i++) {
$mod = mysql_fetch_array($query_modules);
echo "$mod[id_name]";
}

Естественно так не работает, правда и ошибок не выдает)))

Можно ли использовать всего один запрос к таблице, который является общим для этих 2х блоков или же надо очистить массив и заново произвести запрос к таблице(при этом либо очистить старый массив, и использовать то же имя, либо применить новое имя)?

Link to comment
Share on other sites

  • 0

А я вот так и не понял фразы

если условие равенства выполняется в куске кода с циклом, то второй кусок кода(if-elseif-else) срабатывает на else. В итоге переменная изменит свое значение
О какой переменной речь? Если о $content, то может просто её переобозвать? А елси нет, то в чём проблема? Если так абстрактно начать рассуждать, получится уже философия, и проблему придётся решать диалектически, или какие там у них ещё умные слова есть. Типа "попробуй мотивировать переменную осознать себя и тем самым через точку бифуркации выйти на новый уровень бытия".

Что вообще нужно было получить по условию задачи?

Link to comment
Share on other sites

  • 0
Что вообще нужно было получить по условию задачи?
Мы в зависимости от значения $content подключаем нужный нам файл, а после подключения(в коде не указал), мы выводим значение переменной, которое содержалось в подключаемом файле
Link to comment
Share on other sites

  • 0

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

Это видимо что-то с синтаксисом вы напутали. Никаких проблем с else в цикле нет.

да вроде не напутал. Дело в том что: допустим переменная контент будет удовлетворять условию из первой интерации цикла, но интераций несколько, и в остальных будет срабатывать else и тем самым будет поытка переопределить функцию. Пробывал вписать break, не пошло.

Edited by gesandte
Link to comment
Share on other sites

  • 0
А я вот так и не понял фразы О какой переменной речь? Если о $content, то может просто её переобозвать? А елси нет, то в чём проблема? Если так абстрактно начать рассуждать, получится уже философия, и проблему придётся решать диалектически, или какие там у них ещё умные слова есть. Типа "попробуй мотивировать переменную осознать себя и тем самым через точку бифуркации выйти на новый уровень бытия".

Что вообще нужно было получить по условию задачи?

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

А на счет второго вопроса можете что нибудь подсказать?

Надеюсь от моих вопросов и описаний мозги еще ни у кого не поехали? :D

Link to comment
Share on other sites

  • 0
Ладно, вопрос наверно можно закрыть.

Но чтобы не засорять форум напишу сюда еще один.

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

Т.о в самом начале страницы мы имеем получение данных из таблицы в массив $query_modules

А второй блоков к примеру выглядит так


for ($i = 0; $i < mysql_num_rows($query_modules); $i++) {
$mod = mysql_fetch_array($query_modules);
echo "$mod[id_name]";
}

Естественно так не работает, правда и ошибок не выдает)))

Можно ли использовать всего один запрос к таблице, который является общим для этих 2х блоков или же надо очистить массив и заново произвести запрос к таблице(при этом либо очистить старый массив, и использовать то же имя, либо применить новое имя)?

$query_modules - это не массив, это указатель на результат запроса.

что там у вас не работает не пойму... возможно где-то переопределяется $query_modules...

пока работает скрипт, в памяти сохраняется результат запроса.

А с первым вопросом все-таки вы что-то с синтаксисом напутали поскольку break как раз с условиями и используется и не должно быть проблем. Покажите лучше нерабочий код, понятней будет, что там не так.

Link to comment
Share on other sites

  • 0


$query_modules - это не массив, это указатель на результат запроса.

спасибо что просветил :D

А с первым вопросом все-таки вы что-то с синтаксисом напутали поскольку break как раз с условиями и используется и не должно быть проблем. Покажите лучше нерабочий код, понятней будет, что там не так.

как раз такой пример у меня в книге приведен, может я там его не правильно применил:


{
$modules = mysql_fetch_array($query_modules);
if ($content === $modules[id_name]) :
include "modules/$modules[id_name]/index.php";
break;
elseif ($content === "auth") :
include "auth.php";
elseif ($content === "close") :
include "close.php";
elseif ($content === "mail") :
include "mail.php";
#else :
# include "modules/$settings[/page][page]/index.php";
endif;
}
  for ($i = 0; $i < mysql_num_rows($query_modules); $i++)

что там у вас не работает не пойму... возможно где-то переопределяется $query_modules...

пока работает скрипт, в памяти сохраняется результат запроса.

сам не пойму в чем дело....



for ($i = 0; $i < mysql_num_rows($query_modules); $i++) {
$modules = mysql_fetch_array($query_modules);

if ($content === $modules[id_name]) {
$include_flag = @include "modules/$modules[id_name]/index.php";
}
}

if ($include_flag == false) {
echo "функция include не была применена";

if ($content === "auth") {
include "auth.php";
} elseif ($content === "close") {
include "сlose.php";
} elseif ($content === "mail") {
include "mail.php";
} else {
include "modules/$settings[/page][page]/index.php";
}
}

my_functions();

for ($i = 0; $i < mysql_num_rows($query_modules); $i++) {
$menu = mysql_fetch_array($query_modules);
echo "<li><a href=\"index.php?content=$menu[id_name]\">$menu[name]</a></li>";
}

в данном случае не выводится меню, если поместиь блок меню перед подключением файлов, то меню выводится, а вот цикл в блоке подкключения файлов не срабатывает

Link to comment
Share on other sites

  • 0
Вместо второго может быть применить if (function_exists($a)) $a()?

:D ну да, вместо флага на подключение файла можно использовать. Спасибо.

Только запись там идет без $

Int, по второму вопросу предположений нет? Даже не знаю как заставить работать........

Link to comment
Share on other sites

  • 0

Можно использовать $, если $a - это переменная с именем функции.

Кажется, я не дочитал до второго вопроса :D))

Дочитал, тоже не понял, что именно нужно. Если использовать один результат mysql_query несколько раз, то я даже и не знаю, не пробовал ни разу. В принципе, если пользоваться mysql_result, то можно.

Edited by Int
Link to comment
Share on other sites

  • 0
Дочитал, тоже не понял, что именно нужно. Если использовать один результат mysql_query несколько раз, то я даже и не знаю, не пробовал ни разу. В принципе, если пользоваться mysql_result, то можно.

mysql_result вместо mysql_fetch_array ? Не понимаю тогда как его там можно применить, т.к он преднеазначен для извлечения нужного элемента из запси. Т.о можно прогнать через массив только одно поле, и то заметил что у меня при выводе отображается только первый символ из записи))

Щас напишу полный пример, с тестовой бд, чтобы вы могли посмотреть у себя

Edited by gesandte
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy