Неизвестный идентификатор
Здравствуйте.
Есть блок со ссылками: <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" Но ведь параметр передается. Да и в адресной строке он есть. С остальными тестами все хорошо. |
Цитата:
В строке 61 должно быть $('input[name=test_button]').attr('disabled',true);, и лучше не attr, а prop. Первый switch лишний, массив вариантов ответов ведь можно просто сразу описать объектом. |
Цитата:
Поправил, но не помогло. В чем еще может быть проблема? А по поводу switch, то я только-только начал учить javascript и понятия не имею как это сделать. Для начала надо решить эту проблему с ошибкой, а потом уже начну гуглить. Но, конечно, буду очень благодарен, если вы приведете хотя бы небольшой пример того, как это сделать. |
Цитата:
Хотя можно и завязать ее на клиента, тогда бы было понятно к чему вы ее упоминаете. Можно сделать двояко: сразу описать в клиентском сценарии варианты ответов, либо отдавать клиенту только те ответы, что запрошены 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])?>; тогда и определять на клиенте с каким вариантом сейчас работа не нужно. Теперь что касается ошибки, то что исправлено, это просто от невнимательности, а все остальное, это лучше привести код теста любого и описать чего вы хотите от проверки. |
Вот этот тест не работает:
<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 вопрос - выдать соответствующее сообщение в алерте и после нажатия на "ОК" подсветить красным те вопросы, которые не отвечены, попутно дав возможность ему дать ответы на оставшиеся вопросы. |
Тогда вообще не понятно причем тут вариант и switch, то есть код на клиенте. И массив вариантов ответов, это не связь варианта, а вопросы->варианта и ответов на них, так?
Причина ошибки в том, что test_number не определен, скорее всего у вас нет выдачи страницы по умолчанию, то есть первого теста, тогда когда не было GET запросов. PS. Если я все правильно понял, то заменить $number_test = intval($_GET['test_number']); на $number_test = (int)$_GET['test_number'] ?: 1; |
Теперь просто выдает эту ошибку "Notice: Undefined index: test_number in C:\xampp\htdocs\copyright\test.php on line 8", без содержимого exit. Однако, теперь не перебрасывает на другую стр, а просто на этой же, в самом её верху, выводит данную ошибку.
|
Номер строки $number_test = intval($_GET['test_number']); какой?
|
Восьмой
|
Ну все правильно
Ошибка, вернее это не ошибка, а предупреждение гласит о том, о чем я писал ранее. Есть два способа: 1) вы хорошо знаете, что означает это предупреждение, забиваете на него и определяете РНР не выводить предупреждений (это можно сделать постоянным, в настройках сервера), и этого предупреждения не будет. Вывод ошибок и предупреждений нужен при отладке, а на реально работающем сайте их нужно блокировать, писать их в лог-файл. 2) если пока нет ясности на все 100 с языком серверным, то писать так: $number_test = isset($_GET['test_number']) && ($n = (int)$_GET['test_number']) ? $n : 1; |
Часовой пояс GMT +3, время: 21:45. |