Господа оптимизаторы! Подскажите как быть?

CjEcho

Новичок
Господа оптимизаторы! Подскажите как быть?

Здравствуйте!

Имеется следующий (образный) программный код:

PHP:
<?php
if (<условие_1>):
     <действия_1>;
     <действия_4>; 
endif;

if (<условие_2>):
     <действия_2>;
     <действия_4>;
endif;

if (<условие_3>):
     <действия_3>;
     <действия_4>;
endif;

if (<условие_4>):
     <действия_5>;
endif;
?>
Вся проблема в том, что <действия_4> повторяются в коде целых 3 раза, и там не короткий код связанный с выводом данных в HTML.

ВОПРОС:
1. Возможно ли как нибудь создать процедуру и просто вызвать её 3 раза?
2. Может быть построение кода в данном варианте неправильно для данного языка программирования?
 

SiMM

Новичок
1. Да.
Либо, как вариант
PHP:
<?php 
$do4 = false;
if (<условие_1> ): 
     <действия_1>; 
     $do4 = true;
endif; 

if (<условие_2> ): 
     <действия_2>; 
     $do4 = true;
endif; 

if (<условие_3> ): 
     <действия_3>; 
     $do4 = true;
endif; 

if ($do4):
     <действия_4>;
endif;

if (<условие_4> ): 
     <действия_5>; 
endif; 
?>
 

CjEcho

Новичок
Большое спасибо!

Думал меня тут сгрызут за то что я начинающий...
 

Gremboloid

инженера Гр...
prolis, switch подходит только для сравнений a==b, ТС этого не указал в условие_1-4.
А исходя из кода, то <действия_4> может выполняться от 0 до 3-х раз.
 

SiMM

Новичок
> А исходя из кода, то <действия_4> может выполняться от 0 до 3-х раз.
Кстати да :) Слажал-с :) И даже $do4++ вместо $do4 = true не факт, что подойдёт :)
 

prolis

Новичок
PHP:
switch (true) {
case (<условие_1> ):
case (<условие_2> ):
case (<условие_3> ):
    <действия_4>;
case (<условие_1> ):
 <действия_1>;
 break;
case (<условие_2> ):
 <действия_2>;
 break;
}
 

Wicked

Новичок
а если <условие_1> && <условие_2> && <условие_3> === true ?
результат выполнения должен быть таким:
<действия_1>;
<действия_4>;
<действия_2>;
<действия_4>;
<действия_3>;
<действия_4>;
 

Фанат

oncle terrible
Команда форума
интересно, что лично у меня таких ситуаций никогда не возникало.
ОСОБЕННО с операциями вывода в Html...
 

CjEcho

Новичок
Да тут форма опроса формируется. Примерный смысл, если интересно таков:

2. Если <Пользователь впервые зашел на страницу>
то <Выдаем ему номер опроса и устанавливаем флаг, что он не проголосовал (создаем сессионные переменные)> (+Выводим форму опроса)

1. Если <Пользователь повторно зашел на страницу и не голосовал>
то <Выдаем ему номер опроса и устанавливаем флаг, что он не проголосовал> (+Выводим форму опроса)

3. Если <Пользователь уже голосовал, но опрос изменился>
то <Выдаем ему новый номер опроса, и устанавливаем флаг, что он не проголосовал>
(+Выводим форму опроса)

4. ЛИБО Вывод результатов голосования на экран.

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

Сам код громоздкий, поэтому написал так. Путаница в нумерации не специальна, просто по коду иначе. Так легче понять.

Реализовал, с введением логической переменной $do. Работает, но такое началось! )) Этот метод $_POST. :)
 

Фанат

oncle terrible
Команда форума
непонятно, чем первые три пункта отличаются друг от друга и при чем тут сессии
 

CjEcho

Новичок
Вот этим:

PHP:
//Переменная отвечающая за показ голосования
//$cf - client flag (nop/yep)
//$cq - client quest (quest_id)
$do=false;

//Если пользователь уже был на сайте, но не голосовал
if ($_SESSION['cf']=="nop"):
	$do=true;
	echo "Debug: Вы уже были на сайте, но еще не голосовали<br>";
endif;

//Если пользователь зашел на сайт впервые:
if (empty($_SESSION['cq'])):
	$do=true;
	$_SESSION['cf']="nop";
	$_SESSION['cq']=$quest_id;
	echo "Debug: Вы впервые на сайте.<br>";
endif;

//Если пользователь уже голосовал, но опрос изменился
if (($_SESSION['cf']=="yep") and ($_SESSION['cq']<>$quest_id)):
	$do=true;
	$_SESSION['cf']="nop";
	$_SESSION['cq']=$quest_id;
	echo "Debug: Вы уже проголосовали, но опрос изменился.<br>";
endif;

//Вывод формы голосования
if ($do):
	echo "<FORM action='' method='post'>";
            ........................
endif;

//Вывод результатов голосования
if (($_SESSION['cf']=="yep") and ($_SESSION['cq']==$quest_id)):
	echo "Debug: Вы уже проголосовали.<br>";
             .........................
endif;

//Если нажали на кнопку "Проголосовать"
if (empty($_POST)):else:
	$_SESSION['cf']="yep";
	$_SESSION['cq']=$quest_id; 
            ..........................
endif;
 

Фанат

oncle terrible
Команда форума
почему первые три пункта нельзя заменить конструкцией
if ($current_quiz <> $_SESSION['quiz'])
?

-~{}~ 14.05.09 15:57:

в чем принципиальная разница пунктов были-не были и опрос изменился?
если конечных действий только два: показывать форму или результаты.

-~{}~ 14.05.09 15:58:

зачем держать в сессии номер опроса, если человек не голосовал?
 

CjEcho

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

-~{}~ 14.05.09 18:07:

Чуствую придёться переделывать всё, т.к. сессия обнуляется при выходе из браузера (или это из за локального веб-сервера?)
 

CjEcho

Новичок
именно так они и придуманы - отражать текущий сеанс посещения
Не хочеться уйти от темы, но впервые общаюсь с людьми, которые понимают php. В данном случае мне придется создавать таблицу с IP, и там хранить переменные (чтобы избежать накрутки)?
 

Фанат

oncle terrible
Команда форума
.к. сессия обнуляется при выходе из браузера
О!

-~{}~ 14.05.09 16:22:

а флаг ответа у него будет стоять что он прошел опрос и всё.
ну так в флаг писать не просто слово "флаг", а номер опроса.

другое дело, что сессии тебе здесь вообще не подходят
 

CjEcho

Новичок
ну так в флаг писать не просто слово "флаг", а номер опроса.
Спасибо, тут всё понял!

другое дело, что сессии тебе здесь вообще не подходят
... и тут тоже :( опять всю ночь в инете мануал читать.

-~{}~ 14.05.09 18:32:

То есть если всё писать с нуля, то нужно сделать табличку с полями:

IP, Question_ID

При входе заносить IP в базу , если его уже нету.
А если чел проголосует - заносить Question_ID и всё??
 
Сверху