01.05.2016, 10:07
|
Интересующийся
|
|
Регистрация: 27.03.2016
Сообщений: 21
|
|
Неизвестный идентификатор
Здравствуйте.
Есть блок со ссылками:
<li><a href="test.php?test_number=1">Тест на грамотность</a></li>
<li><a href="test.php?test_number=2">Тест на знание основ</a></li>
<li><a href="test.php?test_number=3">Тест на квалификацию рерайтера</a></li>
<li><a href="test.php?test_number=4">Тест на квалификацию копирайтера</a></li>
<li><a href="test.php?test_number=5">Тест на квалификацию SEO-работника</a></li>
В файле test.php есть кусок кода, который получат передаваемый параметр и записывает его в переменную
<?php
//Проверка передаваемых параметров для генерации страницы с тестами
$number_test = intval($_GET['test_number']);
if ($number_test < 1 || $number_test > 6)
exit("Значение за пределами");
?>
И есть функция, которая проверяет ответы:
function check() {
switch (select_test) {
case 1:
var arr_value_test = ["one","one","one","two",4,3,4,"two","one",3];
break;
case 2:
var arr_value_test = ["two","one","one","one","one"];
break;
case 3:
var arr_value_test = [4,4,3,"two","one"];
break;
case 4:
var arr_value_test = [4,"one","one","one","one"];
break;
case 5:
var arr_value_test = ["two","two","one","one","one"];
break;
default:
alert('Ошибка :(');
}
var ch =0;
var validate_result = 0;
var count = 0;
for (var i = 0; i < arr_value_test.length; i++)
{
var number_select = $('input[name=vp'+i+']:checked').val();
if (number_select==arr_value_test[i])
{
var count = count +1;
}
}
if ($(':radio:checked').length!= arr_value_test.length)
{
$("label").each(function(indx, element){
$(this).toggleClass("err", !$("input",this).is(":checked"))
});
alert("Ответы даны не на все вопросы");
}
else
{
switch (count) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
alert("Дано правильных ответов: "+count + " Ваш результат является неудовлетворительным.");
break;
}
$('input[name=test_button').attr('disabled',true);
}
}
Проблема в том, что когда я открываю первый тест и не выбираю хотя бы 1 ответ, мне выдает сначала сообщение о том, что даны не все ответы, а затем перебрасывает на пустую страницу с ошибкой: "Notice: Undefined index: test_number in C:\xampp\htdocs\copyright\test.php on line 8"
Но ведь параметр передается. Да и в адресной строке он есть. С остальными тестами все хорошо.
|
|
01.05.2016, 13:08
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от FaNaT_96
|
В файле test.php есть кусок кода, который получат передаваемый параметр и записывает его в переменную
|
И какое отношение php-переменная имеет к клиентской функции test?
В строке 61 должно быть $('input[name=test_button ]').attr('disabled',true);, и лучше не attr, а prop.
Первый switch лишний, массив вариантов ответов ведь можно просто сразу описать объектом.
|
|
01.05.2016, 13:54
|
Интересующийся
|
|
Регистрация: 27.03.2016
Сообщений: 21
|
|
Сообщение от laimas
|
И какое отношение php-переменная имеет к клиентской функции test?
В строке 61 должно быть $('input[name=test_button]').attr('disabled',true);, и лучше не attr, а prop.
Первый switch лишний, массив вариантов ответов ведь можно просто сразу описать объектом.
|
В зависимости от того, что содержит эта переменная, выбирается нужный пользователю тест.
Поправил, но не помогло.
В чем еще может быть проблема?
А по поводу switch, то я только-только начал учить javascript и понятия не имею как это сделать. Для начала надо решить эту проблему с ошибкой, а потом уже начну гуглить. Но, конечно, буду очень благодарен, если вы приведете хотя бы небольшой пример того, как это сделать.
|
|
01.05.2016, 14:22
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от FaNaT_96
|
В зависимости от того, что содержит эта переменная, выбирается нужный пользователю тест.
|
Ну так по коду вашему этого не видно. Понятно, что передается GET параметр test_number, по нему будет определяться страница теста, но к функции test, к проблеме вашей переменная сервера не имеет отношения.
Хотя можно и завязать ее на клиента, тогда бы было понятно к чему вы ее упоминаете.
Можно сделать двояко: сразу описать в клиентском сценарии варианты ответов, либо отдавать клиенту только те ответы, что запрошены GET параметром, то есть:
var arr_value_test = {
"1" : ["one","one","one","two",4,3,4,"two","one",3],
"2" : ["two","one","one","one","one"],
.....
};
и определяя параметр запроса отдавать клиенту $number_test при выдаче страницы
var number_test = <?=$number_test?>
тогда варианты это arr_value_test[number_test]. Также их можно получить, получая номер варианта из url методом search.
А можно отдавать клиенту при формировании страниц теста и только нужный вариант ответов, то есть из массива их описанного на сервере:
$arr_value_test = [
1 => ["one","one","one","two",4,3,4,"two","one",3],
["two","one","one","one","one"],
.....
];
отдавать клиенту:
var arr_value_test = <?=json_encode($arr_value_test[$number_test])?>;
тогда и определять на клиенте с каким вариантом сейчас работа не нужно.
Теперь что касается ошибки, то что исправлено, это просто от невнимательности, а все остальное, это лучше привести код теста любого и описать чего вы хотите от проверки.
Последний раз редактировалось laimas, 01.05.2016 в 14:26.
|
|
01.05.2016, 14:40
|
Интересующийся
|
|
Регистрация: 27.03.2016
Сообщений: 21
|
|
Вот этот тест не работает:
<div class="literacy test">
<center><span class="Contacts_h1">Тест на грамотность</span></center><br>
<form id="literacy_form">
<label><b>Вопрос 1</b><br>
Выберите вариант ударения, соответствующий норме<br>
<input id="t0" type="radio" name="vp0" value="one">квАртал<br/>
<input id="t0" type="radio" name="vp0" value="two">квартАл<br/>
</label>
<br><br>
<label><b>Вопрос 2</b><br>
Одна буква <i>н</i> пишется в слове... <br>
<input id="t1" type="radio" name="vp1" value="one">изране(н/нн)ый<br/>
<input id="t1" type="radio" name="vp1" value="two">жела(н/нн)ый<br/>
<input id="t1" type="radio" name="vp1" value="3">кожа(н/нн)ый<br/>
<input id="t1" type="radio" name="vp1" value="4">свяще(н/нн)ый<br/>
</label>
<br><br>
<label><b>Вопрос 3</b><br>
Выберите вариант, соответствующий акцентологической норме полных и кратких форм прилагательных и причастий.<i>В универмаге началась распродажа товаров по ... ценам.</i><br>
<input id="t2" type="radio" name="vp2" value="one">Оптовым<br/>
<input id="t2" type="radio" name="vp2" value="two">оптОвым<br/>
</label>
<br><br>
<label><b>Вопрос 4</b><br>
Я часто ... эту книгу в библиотеке.<br>
<input id="t3" type="radio" name="vp3" value="one">бралА<br/>
<input id="t3" type="radio" name="vp3" value="two">брАла<br/>
</label>
<br><br>
<label><b>Вопрос 5</b><br>
В каком варианте ответа правильно указаны все цифры, на месте которых в предложении должны стоять запятые? <i>Идея единого европейского пространства (1) поклонником (2) которой (3) был первый директор Царскосельского лицея Малиновский (4) обрела множество сторонников.</i><br>
<input id="t4" type="radio" name="vp4" value="one">1, 3<br/>
<input id="t4" type="radio" name="vp4" value="two">2, 3<br/>
<input id="t4" type="radio" name="vp4" value="3">1, 4<br/>
<input id="t4" type="radio" name="vp4" value="4">2, 4<br/>
</label>
<br><br>
<label><b>Вопрос 6</b><br>
<i>Итак, ... новый учебный год.</i><br>
<input id="t5" type="radio" name="vp5" value="one">началсЯ<br/>
<input id="t5" type="radio" name="vp5" value="two">нАчался<br/>
<input id="t5" type="radio" name="vp5" value="3">начАлся<br/>
</label>
<br><br>
<label><b>Вопрос 7</b><br>
Буква <i>а</i> пишется на месте пропуска во всех словах в ряду...<br>
<input id="t6" type="radio" name="vp6" value="one">1) р...сток, ск...чок, р...стовщик<br/>
<input id="t6" type="radio" name="vp6" value="two">2) прил...жить, заск...чу, ск...кать<br/>
<input id="t6" type="radio" name="vp6" value="3">3) к...снуться, заг...реть, ур...внение<br/>
<input id="t6" type="radio" name="vp6" value="4">4) к...саться, пол...гать, м...кать<br/>
</label>
<br><br>
<label><b>Вопрос 8</b><br>
Выберите вариант, соответствующий норме словоупотребления. ... <i>Всероссийского конкурса студенческих работ получили денежную премию.</i><br>
<input id="t7" type="radio" name="vp7" value="one">Дипломанты<br/>
<input id="t7" type="radio" name="vp7" value="two">Дипломники<br/>
</label>
<br><br>
<label><b>Вопрос 9</b><br>
Молодые ... разработали летательный аппарат<br>
<input id="t8" type="radio" name="vp8" value="one">конструкторЫ<br/>
<input id="t8" type="radio" name="vp8" value="two">конструкторА<br/>
</label>
<br><br>
<label><b>Вопрос 10</b><br>
Выберите вариант, соответствующий морфологической норме числительных. <i>Выборы состоялись в ... округах.</i><br>
<input id="t9" type="radio" name="vp9" value="one">триста пятидесяти восьми<br/>
<input id="t9" type="radio" name="vp9" value="two">триста пятьдесят восьми<br/>
<input id="t9" type="radio" name="vp9" value="3">трехстах пятидесяти восьми<br/>
</label>
<br>
<p><center><input name="test_button" type="submit" value="Проверить" class="styled-button-1" onClick="check()"></center></p>
</form>
</div>
Вот этот работает:
<div class="base test">
<center><span class="Contacts_h1">Тест на знание основ</span></center><br>
<form>
<label><b>Вопрос 1</b><br>
Рерайт – это..?<br>
<input id="t0" type="radio" name="vp0" value="one">написание текста с нуля;<br/>
<input id="t0" type="radio" name="vp0" value="two">написание текста на основе уже имеющегося;<br/>
</label>
<br><br>
<label><b>Вопрос 2</b><br>
Уникальность текста – это..?<br>
<input id="t1" type="radio" name="vp1" value="one" >показатель того, насколько уникален текст по сравнению с другими;<br/>
<input id="t1" type="radio" name="vp1" value="two">показатель интересности текста.<br/>
</label>
<br><br>
<label><b>Вопрос 3</b><br>
Важна ли скорость печатания?<br>
<input id="t2" type="radio" name="vp2" value="one">да<br/>
<input id="t2" type="radio" name="vp2" value="two">нет<br/>
</label>
<br><br>
<label><b>Вопрос 4</b><br>
Важно ли наличие портфолио?<br>
<input id="t3" type="radio" name="vp3" value="one">да<br/>
<input id="t3" type="radio" name="vp3" value="two">нет<br/>
</label>
<br><br>
<label><b>Вопрос 5</b><br>
Можно ли пользоваться сторонними ресурсами для улучшения качества своего текста?</i><br>
<input id="t4" type="radio" name="vp4" value="one">да<br/>
<input id="t4" type="radio" name="vp4" value="two">нет<br/>
</label>
<br><br><br>
<p><center><input name="test_button" type="button" value="Проверить" class="styled-button-1" onClick="check()"></center></p>
</form>
</div>
Проверка должна определять ответил ли пользователь на все вопросы. Если ответил - вывести сообщение с кол-вом правильных ответов. Если не ответил хотя бы на 1 вопрос - выдать соответствующее сообщение в алерте и после нажатия на "ОК" подсветить красным те вопросы, которые не отвечены, попутно дав возможность ему дать ответы на оставшиеся вопросы.
|
|
01.05.2016, 14:52
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Тогда вообще не понятно причем тут вариант и switch, то есть код на клиенте. И массив вариантов ответов, это не связь варианта, а вопросы->варианта и ответов на них, так?
Причина ошибки в том, что test_number не определен, скорее всего у вас нет выдачи страницы по умолчанию, то есть первого теста, тогда когда не было GET запросов.
PS. Если я все правильно понял, то заменить $number_test = intval($_GET['test_number']); на
$number_test = (int)$_GET['test_number'] ?: 1;
Последний раз редактировалось laimas, 01.05.2016 в 15:10.
|
|
01.05.2016, 15:16
|
Интересующийся
|
|
Регистрация: 27.03.2016
Сообщений: 21
|
|
Теперь просто выдает эту ошибку "Notice: Undefined index: test_number in C:\xampp\htdocs\copyright\test.php on line 8", без содержимого exit. Однако, теперь не перебрасывает на другую стр, а просто на этой же, в самом её верху, выводит данную ошибку.
|
|
01.05.2016, 15:46
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Номер строки $number_test = intval($_GET['test_number']); какой?
|
|
01.05.2016, 16:27
|
Интересующийся
|
|
Регистрация: 27.03.2016
Сообщений: 21
|
|
Восьмой
|
|
01.05.2016, 16:41
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Ну все правильно
Ошибка, вернее это не ошибка, а предупреждение гласит о том, о чем я писал ранее.
Есть два способа:
1) вы хорошо знаете, что означает это предупреждение, забиваете на него и определяете РНР не выводить предупреждений (это можно сделать постоянным, в настройках сервера), и этого предупреждения не будет. Вывод ошибок и предупреждений нужен при отладке, а на реально работающем сайте их нужно блокировать, писать их в лог-файл.
2) если пока нет ясности на все 100 с языком серверным, то писать так:
$number_test = isset($_GET['test_number']) && ($n = (int)$_GET['test_number']) ? $n : 1;
|
|
|
|