в последнее время я столкнулся с проблемой при настройке викторины на PHP. У меня есть тест, настроенный с использованием счетчика, который затем используется для проверки ответа, например, если вопрос правильный, счетчик увеличивается на единицу, чтобы перейти к следующему вопросу. В конце викторины я хотел сказать, что как только на все вопросы будут даны ответы, нужно перенаправить страницу. Я подумал, что для этого проще всего было бы установить другой оператор else{ if{}}
, который говорит, когда $currentQuestion==3
перенаправляет страницу. Однако, как только счетчик достигает трех, страница не перенаправляется. Вот пример:
$currentQuestion = 0;
if (isset($_POST["currentQuestion"])){
$currentQuestion = $_POST["currentQuestion"];
if ($_POST["guess"] == $questionsAndAnwsers[$currentQuestion] ["answer"]){
$currentQuestion++;
print("Answer Correct<br>");
print("Next Question Below<br><br>");
}
else {
$currentQuestion=0;
print("You have failed..");
}}
else{
if ($currentQuestion==3){
header("Location: http://students.purchase.edu/martin.mcnicholas/scriptingfortheweb/index2. html"); /* Redirect browser */
exit();
}
}
Сначала я подумал, что, может быть, он не распознал номер счетчика, но, как показано выше, с:
else {
$currentQuestion=0;
print("You have failed..");
}}
Мне удалось установить его на ноль, чтобы вернуться к первоначальному первому вопросу. Я также мог изменить его на любой номер счетчика, и при неправильном ответе меня бы высадили на вопросе, соответствующем счетчику. Я также попытался разместить else if в if (isset($_POST["currentQuestion"])){
, однако это полностью нарушило мою программу.
Часть кодирования, содержащая html:
// current question
$currentQuestion = 0;
if (isset($_POST["currentQuestion"])){
$currentQuestion = $_POST["currentQuestion"];
if ($_POST["guess"] == $questionsAndAnwsers[$currentQuestion]["answer"]){
$currentQuestion++;
print("Answer Correct<br>");
print("Next Question Below<br><br>");
}
else {
$currentQuestion=0;
print("You have failed..");
}}
else{
if ($currentQuestion==3){
header("Location: http://students.purchase.edu/martin.mcnicholas/scriptingfortheweb/index2.html"); /* Redirect browser */
exit();
}
}
?>
<form method = "POST" action = "">
<label for = "question"><?php echo ($currentQuestion+1).". ". $questionsAndAnwsers[$currentQuestion]["question"];?></label>
<input type = "hidden" name = "currentQuestion" value = "<?php echo $currentQuestion;?>">
<input type = "text" name = "guess" value = "" placeholder = "Answer...">
<input type = "submit" value = "Next Question">
</form>
заголовок должен быть помещен в функцию перед любым html-кодом. Поместите это в функцию, поэтому
Используйте правильное форматирование и отступы кода. Если бы вы это сделали, вы бы увидели, что if ($currentQuestion == 3) {
будет проверяться только в том случае, если $_POST["currentQuestion"]
не установлен, поэтому для $currentQuestion
будет установлено значение 0.
Это правильный порядок для проверки условий.
$currentQuestion = 0;
if (isset($_POST["currentQuestion"])){
$currentQuestion = $_POST["currentQuestion"];
if ($currentQuestion==3){
header("Location: http://students.purchase.edu/martin.mcnicholas/scriptingfortheweb/index2. html"); /* Redirect browser */
exit();
}else if ($_POST["guess"] == $questionsAndAnwsers[$currentQuestion] ["answer"]){
$currentQuestion++;
print("Answer Correct<br>");
print("Next Question Below<br><br>");
}else{
$currentQuestion=0;
print("You have failed..");
}
}
Сначала я получаю значение currentQuestion. Если = 3, я выхожу; Если нет, я проверяю, правильный ли это ответ; Если это не так, я снова выхожу
Обратите внимание, что отступы в вашем коде не только эстетичны, но и избавят вас от головной боли.
Большое спасибо за ваш код и объяснение Томаса. Я понимаю цель наличия заголовка перед выполнением кода проверки. И отступы - это моя вина, когда я делал отступ здесь, чтобы разместить код, я не сохранил правильные отступы
Это не ответ. Правильный ответ дал Лелио.
Это вкратце описывает образ мышления для решения такого рода проблем.
Давайте проанализируем ваш код ...
Сначала вы запускаете $currentQuestion
и устанавливаете его на 0
$currentQuestion = 0;
Затем вы проверяете, установлена ли переменная POST currentQuestion
if (isset($_POST["currentQuestion"])){
Иначе (таким образом, если и только если переменная POST currentQuestion
НЕ установлена) ...
}else{
... вы делаете следующее
if ($currentQuestion==3){
header("Location: http://students.purchase.edu/martin.mcnicholas/scriptingfortheweb/index2. html"); /* Redirect browser */
exit();
}
Верно?
Итак, теперь примите во внимание, что ваша переменная POST = 3 (т. Е. Установлена на 3), и прочитайте приведенное выше еще раз.
Как вы ожидаете, что оно прибудет в:
if ($currentQuestion==3){
?
Ах, большое спасибо за такое объяснение, хотя оно намного яснее и легче для понимания того, к чему мне нужно было добраться.
Мы предполагаем, что у вас есть
<input name = "currentQuestion">
в форме. Можете ли вы опубликовать соответствующую часть HTML-формы, которая отправляет следующий вопрос и отслеживает состояние последнего? Я хотел бы отметить, что$_SESSION
, вероятно, более подходит для использования здесь для отслеживания состояния вопроса на стороне сервера, чем полагаться на отправленную форму.