Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скрипт тестирования 
:(
    Опции темы
Kuliev
Дата 3.5.2008, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.5.2008

Репутация: нет
Всего: нет



Доброго времени суток.
Начал писать скрипт тестирования, но до конца не понимаю механизма как его написать!
Я только представляю как он должен выглядеть:

1)-- > Сначала выводится название тестов!
2)-- > Затем пользователь выбирает тест для прохождения!
3)-- > Скрипт выводит по очереди вопросы, скажем всего 10
3)-- > По окончанию теста выдается результат (оценка)

ТЕСТЫ - ВОПРОСЫ - ОТВЕТЫ хранятся в базе

Вот скрипт
Код




   1.  <?
   2.  include "../config.php";
   3.  // функция вывода всех тестов
   4.  function TestList()
   5.  {
   6.  // разбивае на страницы
   7.  $per_page=pages;
   8.  if (isset($_GET['list'])) $list=($_GET['list']-1); else $list=0;
   9.  $start=abs($list*$per_page);
  10.  // запрос на выборку из базы
  11.  $sql="select * from test ORDER BY id_test LIMIT $start,$per_page";
  12.  $result=db($sql);
  13.  // выводим в таблицу
  14.  echo "<br><br><center><font class='content'><b>Выбирите тест</b></font></center><br>";
  15.  echo "<table width='70%' border='0' cellspacing='1' cellpadding='4' align='center' bgcolor='#336699'><tr>";
  16.  echo "<td align='center'>№</td>";
  17.  echo "<td align='center'>Тесты</td></tr>";
  18.  $bgr='1';
  19.  // заганяем запрос в цикл для вывода тестов
  20.  while($row=mysql_fetch_array($result))
  21.  {
  22.  if($bgr==1)
  23.  {
  24.  $bgcolor='#F5F5F5';
  25.  $bgr=0;
  26.  }
  27.  else
  28.  {
  29.  $bgcolor='#FFFFFF';
  30.  $bgr=1;
  31.  }
  32.   // название теста выглядит как ссылка
  33.  echo "<tr bgcolor='$bgcolor' onMouseOut=this.style.backgroundColor='$bgcolor' onMouseOver=this.style.backgroundColor='#BED9FB'>";
  34.  echo "<td align='center'>".$row['id_test']."<input type='hidden'  value='".$row['id_test']."'></td>";
  35.  echo "<td align='center'><a href='".$_SERVER['PHP_SELF']."?page1-for-3.php&num=1&id_test=".$row['id_test']."&flag=1'>".$row['name_test']."</a>";
  36.  echo "<input type='hidden' name='name_test' value='".$row['name_test']."'></td>";
  37.  }
  38.  // конец цикла
  39.  //закрываем форму и таблицу
  40.  echo "</form></tr></table><br><center>";
  41.  // выводим ссылки для № страниц
  42.  $sql=("SELECT count(*) FROM test");
  43.  $result=db($sql);
  44.  $row=mysql_fetch_row($result);
  45.  $total_rows=$row[0];
  46.  $num_pages=ceil($total_rows/$per_page);
  47.  for($i=1;$i<=$num_pages;$i++) {
  48.    if ($i-1 == $list) {
  49.  
  50.      echo $i." ";
  51.    } else {
  52.      echo '<a href="'.$_SERVER['PHP_SELF'].'?page1-for-3.php&list='.$i.'">'.$i."</a> ";
  53.    }
  54.    }
  55.      }
  56.  
  57.  
  58.  //Функция для прохождения тестов пользователем
  59.  
  60.  function TestingUsers ()
  61.  {
  62.  // запрос на вывод вопроса согластно названия теста
  63.  $sql=("select * from vopros,test where vopros.id_test='".$_GET['id_test']."' and vopros.id_test=test.id_test  LIMIT 1");
  64.  $result=db($sql);
  65.  
  66.  $row=mysql_fetch_array($result);
  67.  // выводим ВОПРОС
  68.  echo "<b class='red'>".$row['vopr']."</b>";
  69.  
  70.  // Табличка с ответами на вопрос
  71.  
  72.  
  73.  echo "<br><br>";
  74.  echo "<table width='50%' border='0' cellspacing='1' cellpadding='4' align='center' bgcolor='#336699'><tr>";
  75.  echo "<td align='center'>№</td>";
  76.  echo "<td align='center'>Вариант ответа</td>";
  77.  echo "<td align='center'>Ответ</td></tr>";
  78.  
  79.  
  80.  //форма || Почему то когда ставлю метот GET данные в массив не передаются 
  81.  echo "<form action='".$_SERVER['PHP_SELF']."?flag=1&id_test=".$_GET['id_test']."&id_vopros=".$_GET['id_vopros']."' method='POST'>";
  82.  echo "<input type='hidden' name='id_vopros' value='".$row['id_vopros']."'>";
  83.  echo "<input type='hidden' name='id_test' value='".$_GET['id_test']."'>";
  84.  
  85.  $bgr='1';
  86.  
  87.  
  88.  // зарос на вывод ответов для вопроса
  89.  $sql=("select * from vopros,otvet where vopros.id_vopros='".$row['id_vopros']."' and vopros.id_vopros=otvet.id_vopros");
  90.  $result=db($sql);
  91.  // загоняем ответы в цикл
  92.  while($row=mysql_fetch_array($result)){
  93.  
  94.  if($bgr==1)
  95.  {
  96.  $bgcolor='#F5F5F5';
  97.  $bgr=0;
  98.  }
  99.  else
 100.  {
 101.  $bgcolor='#FFFFFF';
 102.  $bgr=1;
 103.  }
 104.  
 105.   // выводим ответы
 106.  echo "<tr bgcolor='$bgcolor' onMouseOut=this.style.backgroundColor='$bgcolor' onMouseOver=this.style.backgroundColor='#BED9FB'>";
 107.  echo "<td align='center'>".$row['id_otvet']."</td>";
 108.  echo "<td align='center'>".$row['otvet']."</td>";
 109.  echo "<td align='center'><input type='checkbox' name='' value='1'></td>";
 110.  }
 111.  // кнопка SUBMIT Smile
 112.  echo "</tr><tr>";
 113.  echo "<td align='center' bgcolor='#FFFFD0'><b class='red'>Вопрос №</b></td>";
 114.  echo "<td align='center' bgcolor='#FFFFD0'><input type='submit'  value='Ответить'></td>";
 115.  echo "<td align='center' bgcolor='#FFFFD0'><b class='red'>".$_GET['num']."</b></td>";
 116.  echo "</form></tr></table><br><center>";
 117.  
 118.  }
 119.  // выбираем функцию
 120.  
 121.  if ($_GET['flag']>0)
 122.  {
 123.  TestingUsers();
 124.  }
 125.  else
 126.  {
 127.   TestList();
 128.  }
 129.  
 130.  
 131.  
 132.    ?>



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

Это сообщение отредактировал(а) Kuliev - 3.5.2008, 11:16
PM MAIL   Вверх
Feldmarschall
Дата 3.5.2008, 11:35 (ссылка) |   (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



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

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

Добавлено через 6 минут и 53 секунды
а лучше выводи все вопросы теста на одной странице. так проще будет
PM   Вверх
Kuliev
Дата 3.5.2008, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.5.2008

Репутация: нет
Всего: нет



Простите, действительно хочу многого и сразу  smile 
Буду исправляться.
Действительно проблема стоит с выводом вопросов и ответов  поочередно!
Мне нужно чтобы юзер нажал на кнопку ДАЛЕЕ соответственно поменяется вопрос с ответами!

Вот пример кода, только незнаю как его доработать до ума. Может кто подскажет как быть?
Код

<?
include "../config.php";
// sql запрос на выборку
$sql =( "SELECT * from testing WHERE id='1'");
$result = db($sql);
// выводим вопрос с вариантами ответа
$row =mysql_fetch_array($result);
$table1="<table bgcolor='#f0f0f0' cellspacing='1' cellpadding='2'><tr><td width='400' bgcolor='#ffffff'>";
$table2="</td></tr></table>";
 // выводим все красиво в табличке
echo "<table>";
echo "<form action='".$_SERVER['PHP_SELF']." method='post'>";
echo "<tr><td><b>".$row[vopros]."</b></td></tr>";
echo "<tr><td>".$table1."<input type='radio' name='vs' value='1' id='1'><label for='1'>".$row[otvet1]."</label> ".$table2."</td></tr>";
echo "<tr><td>".$table1."<input type='radio' name='vs' value='2' id='2'><label for='2'>".$row[otvet2]."</label> ".$table2."</td></tr>";
echo "<tr><td>".$table1."<input type='radio' name='vs' value='3' id='3'><label for='3'>".$row[otvet3]."</label>".$table2."</td></tr>";
echo "<tr><td>".$table1."<input type='radio' name='vs' value='4' id='4'><label for='4'>".$row[otvet4]."</label>".$table2."</td></tr>";
echo "<tr><td><input type='submit' value='Далее'></td></tr>";
echo "</from>";
echo "</table>";
?>

PM MAIL   Вверх
Feldmarschall
Дата 3.5.2008, 16:13 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



Не нужно код дорабатывать. Код - это второй этап программирования. Первый - алгоритм.
Сначала надо понять - а чего мы вообще хотим, чтобы наш код делал. А потом уже дорабатывать.

Прежде, чем выводить второй вопрос, надо сохранить ответ на первый. где обработка ответа?

Это сообщение отредактировал(а) Feldmarschall - 3.5.2008, 16:16
PM   Вверх
Kuliev
Дата 3.5.2008, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.5.2008

Репутация: нет
Всего: нет



Feldmarschall, 
Ща допишу! Минутку! smile 
PM MAIL   Вверх
Kuliev
Дата 3.5.2008, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.5.2008

Репутация: нет
Всего: нет



Чтото у меня совсем все не выходит!  smile 
 smile  ПОДСКАЖИТЕ!!!
Код

<?
session_start();
include "../config.php";



 // считаем количество строк в таблице
$sql=("select count(*) from testing");
$result=db($sql);
$row=mysql_fetch_row($result);
$total=$row['0'];

 //$i=1;
for ($i=1; $i<$total; $i++);
if($i>1){
// sql запрос на выборку
$sql =( "SELECT * from testing WHERE id='".$i."'");
$result = db($sql);
/*
$i=0;
$j=0;
for ($j=1; $j<$total; $j++){
if($row[$j]==0){$i++; $v[$i]=$row[$j]; $id[$i]=$row[$j];}
}
*/
// выводим вопрос с вариантами ответа
$row =mysql_fetch_array($result);
$table1="<table bgcolor='#f0f0f0' cellspacing='1' cellpadding='2'><tr><td width='400' bgcolor='#ffffff'>";
$table2="</td></tr></table>";
 // выводим все красиво в табличке
echo "<table>";
echo "<form action='".$_SERVER['PHP_SELF']."' method='post'>";
echo "<tr><td><b>".$row['vopros']."</b></td></tr>";
echo "<tr><td>".$table1."<input type='radio' name='vs' value='1' id='1'><label for='1'>".$row['otvet1']."</label> ".$table2."</td></tr>";
echo "<tr><td>".$table1."<input type='radio' name='vs' value='2' id='2'><label for='2'>".$row['otvet2']."</label> ".$table2."</td></tr>";
echo "<tr><td>".$table1."<input type='radio' name='vs' value='3' id='3'><label for='3'>".$row['otvet3']."</label>".$table2."</td></tr>";
echo "<tr><td>".$table1."<input type='radio' name='vs' value='4' id='4'><label for='4'>".$row['otvet4']."</label>".$table2."</td></tr>";
echo "<tr><td><input type='submit' name='next' value='Далее'></td></tr>";
echo "</from>";
echo "</table>";
}


PM MAIL   Вверх
Feldmarschall
Дата 3.5.2008, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



что именно не выходит-то?

Добавлено через 38 секунд
что за странный цикл? Ты решил все вопросы выводить на одной странице?
PM   Вверх
Kuliev
Дата 3.5.2008, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.5.2008

Репутация: нет
Всего: нет



Feldmarschall, 

Нужно чтобы сначала выводился один вопрос с 4 ответами, затем как юзер нажал кнопку ДАЛЕЕ нужно вывести второй ответ с 4 вопросами и т.д.
PM MAIL   Вверх
Feldmarschall
Дата 3.5.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



Мда. Тяжелый случай.
Может, тебе рано еще тесты писать? Потренируйся на гостевых книгах.

При чем здесь цикл? 
Тебе надо вывести три разных страницы. по очереди. Одним и тем же скриптом. Вот у тебя есть функция TestList. Ты понимаешь, как она работает? Или просто содрал где-то? 
На разных страницах она выводит, между прочим, разный список вопросов. И где ты там цикл увидел?


PM   Вверх
Kuliev
Дата 3.5.2008, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.5.2008

Репутация: нет
Всего: нет



Цитата(Feldmarschall @ 3.5.2008,  18:52)
Мда. Тяжелый случай.
Может, тебе рано еще тесты писать? Потренируйся на гостевых книгах.

При чем здесь цикл? 
Тебе надо вывести три разных страницы. по очереди. Одним и тем же скриптом. Вот у тебя есть функция TestList. Ты понимаешь, как она работает? Или просто содрал где-то? 
На разных страницах она выводит, между прочим, разный список вопросов. И где ты там цикл увидел?

Да я понимаю как работает функция TestList потому что сам ее написал! У меня просто трудность в создании теста, делаю все это в первый раз, так что прошу сильно не критиковать! Мне просто нужен толчек в правильном направлении!

А насчет разбивки страниц ЭТО ИДЕЯ надо попробывать! Мда. Кстати там есть цикл 
Код

<?
while($row=mysql_fetch_array($result))
?>


PM MAIL   Вверх
Feldmarschall
Дата 3.5.2008, 19:11 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



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

Вывод вопросов НИЧЕМ не отличается от вывода тестов. 
Тебе не толчок нужен, а понять сначала, что такое веб-скрипт, и как он работает.
По сути, вывод списка тестов - это тот же самый опрос. пользователь жмет кнопку ответа (с номером страницы) и перемещается к следующему.
То есть, делаешь ты это не в первый раз. Только про "сам написал" по ушам ездить не надо. Я гуглем-то пользоваться умею.


PM   Вверх
Alukard
Дата 3.5.2008, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 14.11.2006

Репутация: нет
Всего: нет



Из всего вышесказанного, понятно, что нужен алгоритм. 
В любом варианте необходимо выводить по одному вопросу на страницу из БД, так же по 4 или сколько то ответов к вопросу. Во-первых, нужно учесть, что БД будет минимум 2 - БД с вопросами и БД с вариантами ответов, и соответственно они будут связаны. После ответа нужно сохранять ответ юзверя на предыдущий вопрос, выдавать следующий (также несколько вариантов, либо случайный, либо идущий по какому-либо алгоритму). В итоге выдавать результат. Главная проблема - собрать все ответы юзверя в конце теста и сделать вывод. Вывод вопроса и ответов к нему проблемой не считаю, так как тут алгоритма быть не может (только если алгоритм при случайном выводе чтобы не было одинаковых вопросов, но это элементарно). Впринципе есть несколько вариантов решения проблемы с передачей ответов:
1) С помощью сессий. Так мы можем передавать и хранить в памяти любое количество переменных, будь то массивов или других ( с массивами будет удобнее) а также давать им любые имена для удобства, и в конце теста допустим будет несколько массивов (1-с номером вопроса и правильностью ответа, 2-с номером вопроса и номером ответа, и тд). В итоге будет просто построить алгоритм аля (Колво правильных ответов)/(Колво вопросов)*100%....это и будет процент знаний так сказать. 
2) С помощью временной БД. Завести 3-ю таблицу типа test_temp. С полями типа: ид_теста, номер_вопроса, номер_ответа,правильность_ответа и тд и тп.
3) С помощью переменных GET. Просто без сессий каждый раз при переходе на новый вопрос записывать (дополнять) в массив те значения, которые были получены от предыдущего. При этом нужно учесть, что придется всегда в скрытом поле передавать весь массив с уже записанными данными.

Я не учитыал то, что тестовые вопросы могут иметь много варинтов ответа (всмысле 2 из 5, 3 из 4-х и тп) , но эта проблема так же решаема. К сожалению не смог найти исходники своего подобного проекта, включая тесты с многовариантными вопросами, давно это было) Если что, спрашивайте. А так я думаю просто сказывается нехватка опыта и знаний, вот некоторые доволно полезных ссылок:
PHP.net
Там же есть и описание функций для работы с БД.
Сессии и переменные
Здесь легко и просто описана работа с сессиями и переменными )
Формы
Работы с формами из PHP...

Почитай материал, затем будет проще понять свои алгоритмы) 
--------------------
Блог блогу рознь: Алукардные РецептыPHP, Операционные системы, Россия & США...etc.
PM MAIL   Вверх
Kuliev
Дата 4.5.2008, 04:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 3.5.2008

Репутация: нет
Всего: нет



Alukard, спасибо обязательно посматрю!
PM MAIL   Вверх
MoLeX
  Дата 4.5.2008, 06:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Kuliev, все намного проще чем кажется. допустим надо вывести 10 вопросов, так вот все что тебе нужно эт постраничная навигация. когда-то тоже делал тест на РНР и именно ее я и использовал... 


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Alukard
Дата 4.5.2008, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 14.11.2006

Репутация: нет
Всего: нет



MoLeX, С таких подходом будет даже несколько лучше, ведь тогда у пользователя появится возможность вернуться к предыдущему вопросу, чтобы поменять ответ, если он может всмпомнил что ошибся) 
Постраничная навигация
Здесь подробно расписан алгоритм постраничности (на примере яндексаsmile Для твоих нужд придется немного модифицировать) Так как у тебя число страниц будет постоянным = числу вопросов...
--------------------
Блог блогу рознь: Алукардные РецептыPHP, Операционные системы, Россия & США...etc.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.