Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Неизвестный идентификатор (https://javascript.ru/forum/misc/62805-neizvestnyjj-identifikator.html)

FaNaT_96 01.05.2016 10:07

Неизвестный идентификатор
 
Здравствуйте.
Есть блок со ссылками:
<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"
Но ведь параметр передается. Да и в адресной строке он есть. С остальными тестами все хорошо.

laimas 01.05.2016 13:08

Цитата:

Сообщение от FaNaT_96
В файле test.php есть кусок кода, который получат передаваемый параметр и записывает его в переменную

И какое отношение php-переменная имеет к клиентской функции test?

В строке 61 должно быть $('input[name=test_button]').attr('disabled',true);, и лучше не attr, а prop.

Первый switch лишний, массив вариантов ответов ведь можно просто сразу описать объектом.

FaNaT_96 01.05.2016 13:54

Цитата:

Сообщение от laimas (Сообщение 415413)
И какое отношение php-переменная имеет к клиентской функции test?

В строке 61 должно быть $('input[name=test_button]').attr('disabled',true);, и лучше не attr, а prop.

Первый switch лишний, массив вариантов ответов ведь можно просто сразу описать объектом.

В зависимости от того, что содержит эта переменная, выбирается нужный пользователю тест.

Поправил, но не помогло.

В чем еще может быть проблема?
А по поводу switch, то я только-только начал учить javascript и понятия не имею как это сделать. Для начала надо решить эту проблему с ошибкой, а потом уже начну гуглить. Но, конечно, буду очень благодарен, если вы приведете хотя бы небольшой пример того, как это сделать.

laimas 01.05.2016 14:22

Цитата:

Сообщение от 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])?>;


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

Теперь что касается ошибки, то что исправлено, это просто от невнимательности, а все остальное, это лучше привести код теста любого и описать чего вы хотите от проверки.

FaNaT_96 01.05.2016 14:40

Вот этот тест не работает:
<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 вопрос - выдать соответствующее сообщение в алерте и после нажатия на "ОК" подсветить красным те вопросы, которые не отвечены, попутно дав возможность ему дать ответы на оставшиеся вопросы.

laimas 01.05.2016 14:52

Тогда вообще не понятно причем тут вариант и switch, то есть код на клиенте. И массив вариантов ответов, это не связь варианта, а вопросы->варианта и ответов на них, так?

Причина ошибки в том, что test_number не определен, скорее всего у вас нет выдачи страницы по умолчанию, то есть первого теста, тогда когда не было GET запросов.

PS. Если я все правильно понял, то заменить $number_test = intval($_GET['test_number']); на

$number_test = (int)$_GET['test_number'] ?: 1;

FaNaT_96 01.05.2016 15:16

Теперь просто выдает эту ошибку "Notice: Undefined index: test_number in C:\xampp\htdocs\copyright\test.php on line 8", без содержимого exit. Однако, теперь не перебрасывает на другую стр, а просто на этой же, в самом её верху, выводит данную ошибку.

laimas 01.05.2016 15:46

Номер строки $number_test = intval($_GET['test_number']); какой?

FaNaT_96 01.05.2016 16:27

Восьмой

laimas 01.05.2016 16:41

Ну все правильно

Ошибка, вернее это не ошибка, а предупреждение гласит о том, о чем я писал ранее.

Есть два способа:

1) вы хорошо знаете, что означает это предупреждение, забиваете на него и определяете РНР не выводить предупреждений (это можно сделать постоянным, в настройках сервера), и этого предупреждения не будет. Вывод ошибок и предупреждений нужен при отладке, а на реально работающем сайте их нужно блокировать, писать их в лог-файл.

2) если пока нет ясности на все 100 с языком серверным, то писать так:

$number_test = isset($_GET['test_number']) && ($n = (int)$_GET['test_number']) ? $n : 1;


Часовой пояс GMT +3, время: 02:05.