Суперглобальная переменная PHP не сохраняет значения с одной страницы на другую - PullRequest
0 голосов
/ 02 ноября 2011

У меня глупый вопрос :) Я работаю над простым документом php, который примитивно похож на онлайн-тест. Код на данный момент состоит из двух вопросов, которые, где оценки увеличиваются, если они правильные (пока не сработали, что он должен делать, если он выбрал неправильный ответ). Проблема в том, что переменная, которая содержит «отметки», не переносит обновленное значение на следующую страницу. Вот код:

<?php
    $marks=0;
    $question1=" <form method=post action='ThirdChallenge.php?question=2&marks=$marks'>
            &nbsp;&nbsp;    1. <input type=radio name='question1' value='first'/> Hyperttext PreProcessor <br/>
                            2. <input type=radio name='question1' value='second'/> HypertText PeriPheral <br/><br/>
                                <input type=submit value='submit'/>
            </form> ";
    $question2="<form method=post action='ThirdChallenge.php?question=3&marks=$marks'>
                            1. <input type=radio name='question2' value='first'/> Compiled Language <br/>
            &nbsp;          2. <input type=radio name='question2' value='second'/> Interpreted Language <br/><br/>
                                <input type=submit value='submit'/>
            </form> ";          

    switch($_GET[question]){

        case "1":
            print"
            <div align=center > 
                what does PHP stand for?<br/><br/> $question1 
            </div>";

            break;

        case "2":
            if(!isset($_POST["question1"])){
            //Check if an option has been selected, if not re-ask the question
                echo " Error! Select one of the options <br/>
                <div align=center >
                what does PHP stand for?<br/><br/> $question1 
                </div>";

                    }
            elseif($_POST["question1"]=="first"){
                // if the answer is "first" which is the value of the form radio button with the correct answer
                // Then simply increment the marks
                $_GET[marks]++;
                //echo only for testing
                echo $_GET[marks];

                    }


            print"
            <div align=center> What kind of Language is PHP?<br/> <br/> $question2</div>";
            break;

        case "3":
        // again do the checking for the second question
            if(!isset($_POST["question2"])){
                echo " Another error, select the questions again <br/>
                <div align=center>
                What kind of Language is PHP?<br/> <br/> $question2
                </div>";}

            elseif($_POST["question2"]=="second"){
                $_GET[marks]++;
                echo $_GET[marks];
                    }
            // The problem is right here, instead of giving me say 2 if both the answers are correct it simply outputs 1
            echo  "$_GET[marks]The total marks you got are $_GET[marks] out of 20 ";

        break;
        default:
            print" 
                <html>
                <head/>

                <body>

                    <div align=center><b>Hi there!, Welcome to the PHP exame. When you are ready, click the begin button</b><br/>

                    <a href='ThirdChallenge.php?question=1'> Begin </a>

                    </div>
                </body>
                </html>";

}



?>

Спасибо за ваше время заранее:)

Вот пример, который повлиял на написание моего собственного кода: (это abit long):

<code>$question1="<b>Question 1: What is the URL to access the PHP users manual online?</b><br>
            A) <input type=radio name='q1a' value='a'> http://www.php.org/docs.php<br>
            B) <input type=radio name='q1a' value='b'> http://www.php.com/docs.php<br>
            C) <input type=radio name='q1a' value='c'> http://www.php.net/docs.php<br>
            D) <input type=radio name='q1a' value='d'> http://documentation.php.net<br>
            <input type=submit value='Go'>
            </form>";
$question1_answer="c";

$question2="<b>Question 2: What is the extention that PHP documents generally have?</b><br>
            A) <input type=radio name='q2a' value='a'> .phps<br>
            B) <input type=radio name='q2a' value='b'> .html<br>
            C) <input type=radio name='q2a' value='c'> .htm<br>
            D) <input type=radio name='q2a' value='d'> .php<br>
            <input type=submit value='Go'>
            </form>";
$question2_answer="d";

$question3="<b>Question 3: What does PHP stand for?</b><br>
            A) <input type=radio name='q3a' value='a'> PHP: Hypertext Preprocessor<br>
            B) <input type=radio name='q3a' value='b'> Personal Home Page<br>
            C) <input type=radio name='q3a' value='c'> Pretty Handy Programmer<br>
            D) <input type=radio name='q3a' value='d'> Personal Hypertext Processor<br>
            <input type=submit value='Go'>
            </form>";
$question3_answer="a";

$question4="<b>Question 4: How should a PHP statement close?</b><br>
            A) <input type=radio name='q4a' value='a'> ?><br>
            B) <input type=radio name='q4a' value='b'> ;<br>
            C) <input type=radio name='q4a' value='c'> </php><br>
            D) <input type=radio name='q4a' value='d'> .<br>
            <input type=submit value='Go'>
            </form>";
$question4_answer="b";

$question5="<b>Question 5: Which of the following are correct? (select all that apply)</b><br>
            A) <input type=checkbox name='q5a[a]' value='y'> print \$x;<br>
            B) <input type=checkbox name='q5a[b]' value='y'> print '\$x';<br>
            C) <input type=checkbox name='q5a[c]' value='y'> print x;<br>
            D) <input type=checkbox name='q5a[d]' value='y'> print \$x<br>
            E) <input type=checkbox name='q5a[e]' value='y'> print x<br>
            F) <input type=checkbox name='q5a[f]' value='y'> print \"\$x\";<br>
            <input type=submit value='Go'>
            </form>";
$question5_answer1="a";
$question5_answer2="b";
$question5_answer3="c";
$question5_answer4="f";

$question6="<b>Question 6: What value would be printed to the browser from the following script?</b><br>
            <pre>".'
            $x=3;$y=4;$z=9;
            $a=$x+($y*$z)/($x-($y%3));
            print $a;'."
А) Ошибка
B) 19,5
C) 21
D) Ничего из вышеперечисленного
"; $ Question6_answer = "C"; $ question7 = " Вопрос 7. Что выдает следующий скрипт?
".'
            $x=1;$y=3;$z=12;
            ++$y;
            $z*=2;
            $x=$y+$z;
            print $x'."
А) Ошибка
B) 28
C) 1
D) Ничего из вышеперечисленного
"; $ Question7_answer = "а"; $ question8 = " Вопрос 8: Какие из следующих утверждений TRUE принимают значения, указанные ниже? (выберите все подходящие варианты)
".'
            $x=3;$y=7;$z="green";$n=1;'."
А) \ $ x + \ $ y == \ $ z || \ $ x == 3 && \ $ n> = 0
B) \ $ x! = 3
C) \ $ z == \ "green \" && \ $ y% 3> = \ $ n
D) \ $ x == 3 && \ $ x ++ == \ $ y-3
E) \ $ x * \ $ x% 2 && 3 - \ $ y! = \ $ Z
F) <тип ввода = имя флажка = 'q8a [f]' значение = 'у'> \ $ x + 2 = 5
"; $ Question8_answer1 = "а"; $ Question8_answer2 = "C"; $ Question8_answer3 = "е"; $ question9 = " Вопрос 9: Каков результат следующего кода?
".'
            for($x=1;$y<10;$y++) {
                print $y."&lt;br&gt;";
            }'."
A) Числа от 0 до 9 будут выведены на экран
B) Бесконечный цикл
C) Ошибка
D) Ничего из вышеперечисленного
"; $ Question9_answer = "d"; $ question10 = " Вопрос 10: Каков результат следующего кода?
".'
            $x=5;
            switch($x) {
                case 1:
                    print "the value is 1&lt;br&gt;";
                case 2:
                    print "the value is 2&lt;br&gt;";
                case 3:
                    print "the value is 3&lt;br&gt;";
                case 4:
                    print "the value is 4&lt;br&gt;";
                case 5:
                    print "the value is 5&lt;br&gt;";
                case 6:
                    print "the value is 6&lt;br&gt;";
                default: 
                    print "There is no spoon.&lt;br&gt;";
            }
            '."
А) \ "значение 5 \" выводится на экран
B) Ошибка
C) \ "значение 5 \" и \ "значение 6 \" выводится на экран
D) \ "значение 5 \" и \ "значение 6 \" и \ "ложка отсутствует." Выводится на экран
E) Ничего из вышеперечисленного
"; $ Question10_answer = "d"; // последний бит здесь - обзор каждого вопроса и правильный ответ (ы) на этот вопрос. $ results = $ question1. "
Правильный ответ: $ question1_answer
Почему: другие домены уходят куда-то еще.

";$ results. = $ question2. "
Правильный ответ: $ question2_answer
Почему: .php - это расширение по умолчанию, для которого настроен сервер, хотя любое расширение можно настроить для анализа как скрипт PHP

"; $ results. = $ question3. "
Правильный ответ: $ question3_answer
Почему: PHP - рекурсивная аббревиатура, вопреки мифологии программирования, она никогда не была аббревиатурой для Personal Home . Page

"; $ results. = $ question4. "
Правильный ответ: $ question4_answer
Почему: операторы всегда заканчиваются точкой с запятой.

" ; $ results. = $ question5. "
Правильный ответ: $ question5_answer1, $ question5_answer2, $ question5_answer3, $ question5_answer4
Почему: a и b очевидны, c верно, если x определяется как константа. d отсутствует точка с запятой, e отсутствует точка с запятой и f, очевидно, является действительным.

"; $ results. = $ question6. "
Правильный ответ: $ question6_answer
Почему: равенство означает: \ $ a = 3 + (4 * 9) / (3- (4% 3).) Когда вы следуете порядку операций, вы получаете \ $ a = 3 + 36/2, а затем снова, следуя порядку операций, \ $ a = 3 + 18 и конечное значение 21.

"; $ results. = $ question7. "
Правильный ответ: $ question7_answer
Почему: В окончательном утверждении печати отсутствует точка с запятой. Вы не пытались вычислить это, не так ли ? Всегда сначала ищите наиболее очевидные точки отказа!;)

"; $ results. = $ question8. "
Правильный ответ: $ question8_answer1, $ question8_answer2, $ question8_answer3
Почему: Если у вас возникают проблемы с выяснением, является ли уравнение истинным или ложным , разбить его по частям. Например, первое равенство: 10 == зеленый || 3 == 3 && 1> = 0: ложь ИЛИ истина И истина, поэтому это ИСТИНА. Если все остальное не сработает, бросьте его в в выражении IF, выведите «yes», если оно истинно, и запустите сценарий! «B» неверно, потому что \ $ x IS 3, «d» ложно, потому что правая часть и (&&) оценивает «ложь», помня тонкую разницу между префиксами и постфиксные приращения ... ++ \ $ x приращения THEN возвращает, \ $ x ++ возвращает THEN приращения, так что вы действительно получаете: (3 == 4) ++ - приращение в этом случае теряется в порядке операций, потому что его оценка не имеет отношения к операции, таким образом, правая сторона ложна, и, таким образом, все уравнивание ложно. Наконец, F ложно, потому что возвращает ошибку - вы не можете выполнить операцию присваивания в одном и том же tatement как арифметическая операция.

"; $ results. = $ question9. "
Правильный ответ: $ question9_answer
Почему: скрипт выведет цифры от 1 до 9.) не распечатывается, так как в первый раз в цикле \ $ y вообще не имеет значения VALUE, в конце цикла он увеличивается, создает его и устанавливает его в единицу.

"; $ results. = $ question10. "
Правильный ответ: $ question10_answer
Почему: нет операторов прерывания, поэтому, как только значение найдено в операторе case, каждое последующее утверждение выполняется.

"; $ results. = "Хорошо, теперь я понимаю, верните меня в начало , чтобы повторить попытку."; ?> <! DOCTYPE HTML PUBLIC "- // W3C // DTD HTML 4.01 Transitional // EN" «http://www.w3.org/TR/html4/loose.dtd"> <? // изменить название в соответствии с вопросом, на котором мы находимся if ($ _ GET [вопрос]) { выведите «Question $ question»; } еще { распечатать «Инструкции»; } ?>
<? switch ($ _ GET [вопрос]) { Случай 1": Распечатать " <form method = post action = 'chapter_4_challenge.php? question = 2'> $ Question1 "; перерыв; дело "2": // первая проверка вопроса 1 if ($ _ POST [q1a]) {// если они выбрали ответ - оцените его здесь. if ($ question1_answer == $ _ POST [q1a]) { $ _GET [ "оценка"] ++; } Распечатать " $ question2 "; } еще { печать ОШИБКА. "
$ Question1 "; } перерыв; дело "3": // проверить вопрос 2 if ($ _ POST [q2a]) { if ($ question2_answer == $ _ POST [q2a]) { $ _GET [ "оценка"] ++; } Распечатать " $ Вопрос3 "; } еще { печать ОШИБКА. "
$ question2 "; } перерыв; дело "4": // первая проверка вопроса 3 if ($ _ POST [q3a]) { // если они выбрали ответ - оцените его здесь. if ($ question3_answer == $ _ POST [q3a]) { $ _GET [ "оценка"] ++; } Распечатать " $ Вопрос4 "; } еще { ОШИБКА печати. ​​"
$ Вопрос3 "; } перерыв; дело "5": // первая проверка вопроса 4 if ($ _ POST [q4a]) { // если они выбрали ответ - оцените его здесь. if ($ question4_answer == $ _ POST [q4a]) { $ _GET [ "оценка"] ++; } Распечатать " $ Вопрос5 "; } еще { ОШИБКА печати. ​​"
$ Вопрос4 "; } перерыв; дело "6": / * Сначала проверьте вопрос 5 - это немного отличается, потому что у нас есть несколько вариантов выбора у нас есть каждый выбор с использованием флажков. Каждое из текстовых полей называется с [xxxx] после него - это помещает его в подмножество суперглобального $ _GET. Мы делаем не нужно проверять, выбрали ли они что-либо вообще, потому что они могли бы думаю, что ни один из ответов не должен отвечать .... поэтому мы переходим непосредственно к проверке чтобы увидеть, выбрали ли они какой-либо или все правильные ответы. * / if ($ _ POST [q5a] [$ question5_answer1] == "y") {$ _GET [score] ++; } if ($ _ POST [q5a] [$ question5_answer2] == "y") {$ _GET [score] ++; } if ($ _ POST [q5a] [$ question5_answer3] == "y") {$ _GET [score] ++; } if ($ _ POST [q5a] [$ question5_answer4] == "y") {$ _GET [score] ++; } / * Хорошо - немного объяснения выше. Было бы оценить: $ _POST [q5a] [a], $ _ POST [q5a] [b] и т. Д. В зависимости от значения $ question5_answer1, $ question5_answer2 и т. д., значения. Когда вы смотрите на флажок, вы видите, что значения выбранные поля будут у - так что это значение мы проверяем. Это на самом деле называется многомерные массивы, и это очень продвинутая концепция. Если вам удалось понять это ты ОЧЕНЬ готов продолжить! Если нет, то попробуйте код и добавьте print_r ($ _ POST);Функция к выводу, чтобы увидеть, как он выходит из формы. * / Распечатать " Поздравляем! Пока ваш счет составляет $ _GET [оценка] из возможных 8. Давайте продолжим?

$ Вопрос6 "; перерыв; дело "7": // первая проверка вопроса 6 if ($ _ POST [q6a]) { // если они выбрали ответ - оцените его здесь. if ($ question6_answer == $ _ POST [q6a]) { $ _GET [ "оценка"] ++; } Распечатать " $ Вопрос7 "; } еще { печать ОШИБКА. "
$ Вопрос6 "; } перерыв; дело "8": // первая проверка вопроса 7 if ($ _ POST [q7a]) { // если они выбрали ответ - оцените его здесь. if ($ question7_answer == $ _ POST [q7a]) { $ _GET [ "оценка"] ++; } Распечатать " $ Вопрос8 "; } еще { печать ОШИБКА. "
$ Вопрос7 "; } перерыв; дело "9": if ($ _ POST [q8a] [$ question8_answer1] == "y") {$ _GET [score] ++; } if ($ _ POST [q8a] [$ question8_answer2] == "y") {$ _GET [score] ++; } if ($ _ POST [q8a] [$ question8_answer3] == "y") {$ _GET [score] ++; } Распечатать " $ question9 "; перерыв; дело "10": // первая проверка вопроса 9 if ($ _ POST [q9a]) { // если они выбрали ответ - оцените его здесь. if ($ question9_answer == $ _ POST [q9a]) { $ _GET [ "оценка"] ++; } Распечатать " $ question10 "; } еще { ОШИБКА печати. ​​"
$ question9 "; } перерыв; падеж "конец": // первая проверка вопроса 10 if ($ _ POST [q10a]) { // если они выбрали ответ - оцените его здесь. if ($ question10_answer == $ _ POST [q10a]) { $ _GET [ "оценка"] ++; } print "Поздравляем! Вы завершили тестовый тест PHP! Ваша оценка была $ _ GET [оценка] из возможных 15!

"; // выяснить, какой тип поздравления дать им. если ($ _ GET [счет] == 15) { print "ВАУ! Ты суперзвезда PHP!"; } elseif ($ _ GET [счет]> 9 && $ _GET [счет] <15) { печать «Совсем неплохо. Но возможности для улучшения.»; } elseif ($ _ GET [счет]> 4 && $ _GET [счет] <10) { print "Хорошо. Но, возможно, вам стоит немного пересмотреть."; } еще { print "WoW. Это плохо. Хм, может быть, вам лучше начать с начала учебного курса."; } print "</h1>Если вы хотите увидеть ответы на все вопросы, нажмите здесь";} else {print ERROR."
$ question10";} break; case" results ": напечатать $ results; break; по умолчанию: print" Добро пожаловать в тест знаний PHP!В этом тесте вам будет задан ряд из 10 вопросов.Восемь из этих вопросов будут вопросами с несколькими вариантами ответов, и на 2 из них вам потребуется выбрать несколько ответов.В конце теста вы будете оцениваться с 15 баллами. Удачи!

Начало!"; перерыв;}?>

1 Ответ

1 голос
/ 02 ноября 2011

Это совершенно правильное поведение для PHP и любого веб-приложения в целом, поскольку оно основано на HTTP-протоколе без сохранения состояния.

Чтобы сохранить состояние (другими словами, переменную) между вызовами, вы должны использовать сеансы

...