[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Опрос по алгоритму
Юрий Шу
Есть алгоритм опроса, который в конечном итоге в зависимости от результатов опроса выводит пользователю нужную информацию.

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

Как посоветуете сделать?? Желательно конечно, чтобы это все было в рамках одной php-страницы.



Спустя 7 минут, 44 секунды (9.06.2009 - 08:11) stepan написал(а):
По любому тебе придется пользоваться либо if либо case, а что именно ты будеш проверять это от тебя зависить, можно проверять какой ответ был сделан, можно от количества баллов отталкиваться.

Спустя 8 минут, 24 секунды (9.06.2009 - 08:19) glock18 написал(а):
Лучше, наверно, все таки по ответу. Количество баллов не позволяет однозначно определить вопросы, на которые ответы были даны правильно (при равной значимости вопросов).

А ты сам мысли какие имеешь?
Цитата
каждый следующий вопрос опроса зависит от ответа на предыдущий вопрос.


Это несколько расплывчато. То есть тут может быть много разных зависимостей.
Если в общем случае, то я бы хранил вопросы в БД, и хранил бы в таблице с вопросами поля "След. после правильного ответа" и "След. после неправильного ответа".

Спустя 3 минуты, 37 секунд (9.06.2009 - 08:23) sergeiss написал(а):
stepan - я думаю, вопрос не в этом smile.gif

Юрий Шу Тебе нужно, наверное, использовать сессии для хранения данных о том, на какой ответ и как ответил юзер.
Это даст возможность как знать ответ на его последний вопрос и принимать решения о следующем вопросе, так и ты сможешь контролировать, чтобы пользователь не мог вернуть обратно и "переответить". Потому что твой скрипт просто "тупо" будет предлагать очередной вопрос, и не будет принимать ответы на все предыдущие вопросы именно для этого пользователя.

Этой инфы достаточно? Если я вообще вопрос понял правильно.

Спустя 15 минут, 9 секунд (9.06.2009 - 08:38) Юрий Шу написал(а):
Подробней опишу задачу…
Скрипт должен определять просто подходящий тариф для пользователя по его данным, то есть если на первый вопрос: «Наименование лица:» будет ответ «Юридическое лицо», то следующий уточняющий вопрос будет как раз для юридических лиц.

И так серия из 3-4 вопросов. А на выходе для каждой серии возможных ответов я получаю готовый результат: Тариф и сумма, которые должен вывести на печать.

Спустя 24 минуты, 51 секунда (9.06.2009 - 09:03) sergeiss написал(а):
Юрий Шу - как раз подходят сессии, как я уже озвучивал. Потому что сессии как раз позволяют хранить на сервере некоторые данные от определенного пользователя между разными вызовами скриптов от него.

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

Спустя 5 часов, 7 минут, 38 секунд (9.06.2009 - 14:10) Юрий Шу написал(а):
sergeiss, с сессиями знаком, но никогда не работал.
Можно представить кусочек кода (скажем для 2-х вопросов), чтобы смысл стал понятен?

Спустя 40 минут, 54 секунды (9.06.2009 - 14:51) sergeiss написал(а):
http://phpforum.ru/index.php?showforum=103 - это раздел тут на форуме, где про сессии речь идет. Там много примеров можно найти... Уже готовых и даже с кАментами smile.gif
Так что лучше иди и почитай там, много чего полезного узнаешь на эту тему.

Спустя 56 минут, 20 секунд (9.06.2009 - 15:48) Юрий Шу написал(а):
sergeiss, нужно ознакомиться. Только вопрос про мою ситуацию.

Алгоритм правильно ли я понял?
При заходе на страницу с опросом (vote.php) заводить на юзера сессию. Далее после ответа на первый вопрос проверять и записывать его первый ответ в переменную сессии, и далее отправлять на страницу vote.php&step=2 (такой адрес возможен?). При попытке пользователя вернуться назад проверять, есть ли в определенной переменной сессии ответ на вопрос, и если есть то выводить ему ту же страницу — vote.php&step=2. И так далее…

Так?

Спустя 8 минут, 13 секунд (9.06.2009 - 15:56) sergeiss написал(а):
Вобщем-то да, алгоритм верный.

Только даже адрес менять не обязательно smile.gif Можно просто после начала опроса каждый раз вызывать один и тот же скрипт vote.php без параметров. А информацию о том, что же именно предложить юзеру, передавать через переменные сессии - ты же там запишешь, что последнее было отвечено! Это примерно то же, что и через параметры в строке (GET), но только пользователь уже не сможет на это всё влиять.

Единственные возможные грабли - это кеширование в браузерах. При неизменном адресе и "жестком" кешировании (которым иногда страдает, например, Опера) может получиться такая гадость: юзер будет видеть одну и ту же неизменную странице. Поэтому выводить для каждого вопроса новые адрес имеет смысл (чтобы браузер мозги не пудрил), но при этом указанные данные можно просто не использовать. Потому что в сессии будет передано, что надо.

Спустя 7 минут, 16 секунд (9.06.2009 - 16:03) Юрий Шу написал(а):
Цитата (sergeiss @ 9.06.2009 - 12:56)
но при этом указанные данные можно просто не использовать. Потому что в сессии будет передано, что надо.

Это про что, недопонял немного wink.gif

Цитата (sergeiss @ 9.06.2009 - 12:56)
Поэтому выводить для каждого вопроса новые адрес имеет смысл

тут мой вариант адреса подойдет?

Спустя 19 минут, 51 секунда (9.06.2009 - 16:23) sergeiss написал(а):
Цитата (Юрий Шу @ 9.06.2009 - 17:03)
Цитата (sergeiss @ 9.06.2009 - 12:56)
но при этом указанные данные можно просто не использовать. Потому что в сессии будет передано, что надо.

Это про что, недопонял немного wink.gif

Это про то, что если ты будешь тут использовать сессии, то переданные через GET данные можно просто тупо игнорировать. Они, эти данные, могут пригодиться только для "управления" кешированием браузеров, но не для передачи данных.
Цитата (Юрий Шу @ 9.06.2009 - 17:03)

Цитата (sergeiss @ 9.06.2009 - 12:56)
Поэтому выводить для каждого вопроса новые адрес имеет смысл

тут мой вариант адреса подойдет?

Да.

Спустя 17 часов, 5 минут, 46 секунд (10.06.2009 - 09:29) Юрий Шу написал(а):
sergeiss, начал писать.
Столкнулся с первой проблемой.
PHP
<?
session_start();
//echo session_id();
//echo session_name();
?>
<?
if(!isset($_POST['step1'])){?>
<form action="?" method="post">
<p>Выберите тип абонента:</p>
<select name="question1" class="text1">
<option value="default">Физическое лицо</option>
<option value="2">Юридическое лицо</option>
<option value="3">Бюджетная организация</option>
</select>
<p><input class="submit" type="submit" name="step1" value="Выбрать" /></p>
</form>
<?}
else {
    echo 
$_SESSION['step1'] = $_POST['question1'];
    
header("Location: tariff.php?step=2");
    
print_r($_SESSION);
    }

При переходе на страницу tariff.php?step=2 выводится все то же самое, что и на странице tariff.php, то есть конструкция else не работает dry.gif

Спустя 7 минут, 8 секунд (10.06.2009 - 09:36) sergeiss написал(а):
Цитата (Юрий Шу @ 10.06.2009 - 10:29)
$_POST['step1']

Цитата (Юрий Шу @ 10.06.2009 - 10:29)
tariff.php?step=2

Так ты уж определись - у тебя там step или step1, а также POST или GET!!!. А во-вторых, тут лучше не "мешать в кучу" POST, GET и сессии для вычисления номера шага и требуемых действий.
У тебя получается, что при переходе по "Location: tariff.php?step=2" нету step1 в ПОСТе. И, естественно, ты попадаешь в первый блок.

Спустя 9 минут, 20 секунд (10.06.2009 - 09:45) Юрий Шу написал(а):
переписал вот так:
но адрес в Get получается довольно сложный тогда.
PHP
<?
session_start();

if(!isset(
$_GET['step2'])){?>
<form action="?" method="get">
<p>Выберите тип абонента:</p>
<select name="question1" class="text1">
<option value="default">Физическое лицо</option>
<option value="2">Юридическое лицо</option>
<option value="3">Бюджетная организация</option>
</select>
<p><input class="submit" type="submit" name="step2" value="Выбрать" /></p>
</form>
<?}
else {
    echo 
$_SESSION['step1'] = $_GET['question1'];
    echo 
"<pre>";
    
print_r($_SESSION);
    echo 
"</pre>";
    }

Спустя 1 час, 13 минут, 57 секунд (10.06.2009 - 10:59) sergeiss написал(а):
По-моему, ты просто "перемудрил" с логикой обработки.
GET вообще надо исключить из анализа, и использовать чисто формально, для браузеров (как я ранее говорил).
Алгоритм примерно такой получается:
PHP
<? session_start();
$last_step=isset( $_SESSION['last_step'] ) ? intval($_SESSION['last_step']) : false;
$next_step=isset( $_POST['next_step'] ) ? intval($_POST['next_step']) : false;
// далее в экшене формируем запрос, но реально его НИГДЕ не используем
?>
<form action=<? echo '"?step='.$last_step+1.'"';> method="post">

<?
if(
 !$last_step or !$next_step )
{
  // это самый начальный шаг
  $_SESSION['last_step']=1;
?>
  <p>Выберите тип абонента:</p>
  <select name="question1" class="text1">
  <option value="default">Физическое лицо</option>
  <option value="2">Юридическое лицо</option>
  <option value="3">Бюджетная организация</option>
  </select>
  <input type="hidden" name="next_step" value=2>
<?

}
else if( $last_step and $next_step )
{
  // далее "тупо" формируем вопрос для номера $last_step+1; естественно, с учетом ответов по предыдущим вопросам, которые также должны быть записаны в переменных сессии
  // всевозможные инпуты и всё, что тебе нужно; может быть, имеет смысл подключать нужные блоки через инклуды.
  ...
  // где-то тут прописываем
  echo '<input type="hidden" name="next_step" value='.$last_step+2.'>';
  $_SESSION['last_step'] = $last_step+1;
  //
}

И завершаем вывод формы
HTML
<p><input class="submit" type="submit" name="go_go" value="Выбрать" /></p>
</form>

Спустя 1 день, 1 час, 28 минут, 53 секунды (11.06.2009 - 12:28) Юрий Шу написал(а):
sergeiss, спасибо огромное за заготовку.
Только вот с шагами last_step и next_step так и не понял. Как они выбираются и для чего нужны в конечном итоге?

Спустя 25 минут, 8 секунд (11.06.2009 - 12:53) sergeiss написал(а):
Цитата (Юрий Шу @ 11.06.2009 - 13:28)
sergeiss, спасибо огромное за заготовку.

Да не за что smile.gif Ежели я вижу, что человек сам думает-делает, то помочь не проблема.
Цитата (Юрий Шу @ 11.06.2009 - 13:28)

Только вот с шагами last_step и next_step так и не понял. Как они выбираются и для чего нужны в конечном итоге?

А вот для чего.
Вот в таком порядке они должны появляться
(пусто, пусто) - начальный вход, стартовый (первый) вопрос
(1, 2) - второй вопрос.
(2, 3) - третий вопрос
----

1. Зашли изначально - их нету (любого из параметров). Это значит, что надо показать первый вопрос.
2. Еще один вызов скрипта - видим, что они имеются (оба сразу). Тогда выдаем вопрос, основываясь на номере, записанном в переменной сессии. И, по записанной в next_step величине контролируем, что всё у нас идет корректно.

Тогда мы не позволим пользователю зайти с какого-то произвольного вопроса. Потому что в этом случае, даже если он и подправит переменную next_step, то она будет уже рассинхронизирована с last_step. И тогда пользователь попадет опять на первый вопрос.

А ты, ежели видишь нестыковку между параметрами, все равно выдаешь вопрос, основываясь на last_step (т.е. какой вопрос был предыдущий), но можешь "пожурить" пользователя за торопливость smile.gif

Спустя 36 минут, 8 секунд (11.06.2009 - 13:29) Юрий Шу написал(а):
sergeiss, хитро придумали. Сразу даже и не понял.

Спустя 1 час, 41 минута, 6 секунд (11.06.2009 - 15:10) glock18 написал(а):
sergeiss, вот он php smile.gif
Применил старый добрый прием из C/pascal (да откуда угодно) по обработке строк окном из n символов, а его уже и не знает/помнит никто. Жаль, учите люди программирование.

sergeiss, я думаю, понимаешь прекрасно о чем я. wink.gif

Спустя 25 минут, 14 секунд (11.06.2009 - 15:36) sergeiss написал(а):
Цитата (glock18 @ 11.06.2009 - 16:10)
я думаю, понимаешь прекрасно о чем я.

Э-э-э-э.... Если честно, то не совсем smile.gif

Юрий задал вопрос, я подумал, как это можно решить, и предложил свой вариант. В работоспособности которого уверен. А вот если он является неким старым добрым приемом... То я об этом не знал rolleyes.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.