Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > система тестирования на php


Автор: welt 8.6.2006, 22:23
Приветствую всех.
я пишу систему тестирования на php и ...как-то неочень получается.
Я использую бд. Таблица такая:
-----------------------------------------------------------------
id | question | ans1 | ans2 | ans3 | ans4 | number |
-----------------------------------------------------------------

где question-вопрос; ans1, ans2, ans3, ans4-варианты ответа.
Праильным ответом может быть только один из четырех.
number-это номер правильного ответа.(1, 2, 3 или 4).
Вопросы заносятся в бд через форму для добавления вопросов, куда вписывается сам вопрос, варианты ответов и номер правильного ответа.
Вывод теста такой: на страницу выводятся один за другим по одному вопросы(т.е. на странице один вопрос ), напротив каждого вариаента ответа стоит checkbox, причем моно поставить только одну галку. 
Проблема такая: как реализовать обработку галок, т.е. как связать номер галки с номером, который находится в поле number?
(можно ли как-нибудь получить номер столбца из бд? т.е. для ans1-номер столбца 3, для  ans2- номер стольбца 4 и т.д. ?). 
т.е вот 4-е галки, например такие.
Код

<INPUT type='checkbox' name='selected[]' value='1'>
<INPUT type='checkbox' name='selected[]' value='2'>
<INPUT type='checkbox' name='selected[]' value='3'>
<INPUT type='checkbox' name='selected[]' value='4'>

Как "научить" скрипт понимать правильно ли выбран ответ или нет. И если правильно, то в переменную $s накапливать количество правильных ответов? 
Подскажите именно как это программно реализовать.    

Автор: HuKoLaU 8.6.2006, 23:17
Можно имя задать в checkbox одинаковое, без массива, так как надо всего один вариант.
Код

<INPUT type='checkbox' name='variant' value='1'>
    
<INPUT type='checkbox' name='variant' value='2'>
    
<INPUT type='checkbox' name='variant' value='3'>
    
<INPUT type='checkbox' name='variant' value='4'>

Получаешь значение checkboxа, 
Код


$variant=$_POST['variant'];

Получаешь из БД вариант правильного ответа
Код

$sql="SELECT number FROM question where(id='$id')";
 и сравниваешь его с полученным из checkboxа

  

Автор: BobiKK 9.6.2006, 09:12
Если у тебя возможны несколько вариантов ответа, то пройтись в цикле foreach по массиву $_POST['selected'] 

Автор: welt 9.6.2006, 12:06
HuKoLaU, у меня же id - это номер вопроса. т.е. id одинаков для четырех вариатнтов ответа:
для вариантов к 1-ому вопросу id=1
для вариантов ко 2-ому вопросу id=2 и т.д.
можно ли как-нибудь получить номер столбца из бд? т.е. для ans1-номер столбца 3, для  ans2- номер стольбца 4 и т.д. ?
внимательно читай мое первое сообщение. 

Автор: skyboy 9.6.2006, 12:38
welt, измени структуру базы.
idquestion titleQuestion 
 - это хранятся вопросы(questions).
idanswer idqeustion TitleAnswer
 - это храняться варианты ответов(answers)
idquestion idanswer
 - это хранятся правильные ответы для вопросов.

 

Автор: Endeveit 9.6.2006, 12:41
welt, у тебя неверно спроектирована база данных, отсюда и куча проблем. 

Автор: HuKoLaU 9.6.2006, 22:44
Цитата(welt @ 9.6.2006,  12:06)
HuKoLaU, у меня же id - это номер вопроса. т.е. id одинаков для четырех вариатнтов ответа:

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

$sql="SELECT number FROM question where(id='$id')";

 

Автор: Drache 13.6.2006, 08:24
С базой здесь как раз все нормально. Просто используешь ее как-то непонятно наверно...
Думаю, такое решение подойдет:
форма
Код

<INPUT type='checkbox' name='variant[1]' value='1'>    
<INPUT type='checkbox' name='variant[1]' value='2'>    
<INPUT type='checkbox' name='variant[1]' value='3'>    
<INPUT type='checkbox' name='variant[1]' value='4'>


Ключ массива variant - это id каждого вопроса. Value - соответственно к этому вопросу номер ответа(1 - ans1, 2 - ans2, 3 - ans3, 4 - ans4).
В скрипте определяешь какой ключ массива variant существует (например с помощью array_key() или с помощью foreach - пройдешься в цикле только один раз, но получишь сразу и ключ и значение), потом ищешь в БД к нему правильный ответ (как описывали выше) и сравниваешь со значением этого массива. Ну а дальше уже понятно smile
 

Автор: Штык 15.6.2006, 07:53
хммм.. а если допустим надо будет исаользовать 5 вариантов ответа то что отгда?
еще продумай вариант чот в одном вопросе может быть два ответа или три ведь такое то дже бывает.. 

Автор: slang 20.6.2006, 05:42
В таком варианте БД не подойдет точно, нужно или разбивать на несколько таблиц (тесты/вопросы/ответы) или делать в одной таблице, но с разделением.
Например у меня сделано так:
Код

CREATE TABLE `test` (
  `id` int(11) NOT NULL auto_increment,
  `test_this` int(11) NOT NULL default '0',
  `vopros_this` int(11) NOT NULL default '0',
  `otvet_this` int(11) NOT NULL default '0',
  `name` varchar(255) NOT NULL default '',
  `url` varchar(255) NOT NULL default '',
  `otvet_ball` int(11) default '0',
  `variant` int(2) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=964 ;

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

Автор: Drache 26.6.2006, 10:14
Цитата

еще продумай вариант чот в одном вопросе может быть два ответа или три ведь такое то дже бывает..

Цитата

Праильным ответом может быть только один из четырех.

я отвечала именно по конкретному вопросу smile
И причем здесь сколько вариантов ответа? Если их может быть разное количество, то тогда и БД действительно нужно переделывать. А если только 4 как и было в задаче, то и так нормально, по-моему.

Если все будет действительно посложнее, то тогда возможно стоит разделить эту таблицу на две:

questions
id
question (текст)
answer_id (номер правильного ответа)

answers
id
question_id
answer (текст)

тогда формочка выглядела бы примерно так:
Код

<INPUT type='checkbox' name='variant[q_id]' value='a_id1'>     
<INPUT type='checkbox' name='variant[q_id]' value='a_id2'>     
<INPUT type='checkbox' name='variant[q_id]' value='a_id3'>     
<INPUT type='checkbox' name='variant[q_id]' value='a_id4'>
...
<INPUT type='checkbox' name='variant[q_id]' value='a_idN'>


Здесь правда все не очень надежно, главное не перепутать ответы от разных вопросов smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)