[PHP] Antwoorden ophalen bij $PHP_SELF

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb 12 vragen, deze wil ik om de beurt afbeelden op het scherm. Dus als vraag 1 beantwoord is krijgt men pas vraag twee te zien, etc. Dit werkt, het probleem is alleen dat ik het niet voor elkaar krijg de antwoorden op te halen uit elke vraag. Ik zou natuurlijk voor elke vraag een aparte pagina kunnen maken, maar dat lijkt me een beetje nutteloos.

Dit is wat ik tot dusver heb gemaakt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function uitslag() 
    { 
        $lijst = array ($_POST['1'], $_POST['2'], $_POST['3'], $_POST['4'], $_POST['5'], $_POST['6'], $_POST['7'], $_POST['8'], $_POST['9'], $_POST['10'], $_POST['11'], $_POST['12']);
            switch ( $lijst[$a] ){ 
                case "a": $uitslagiq++; $_SESSION["uitslagiq"] = $uitslagiq; echo "$goed $antw[$a]"; break;
                default: echo "$fout $antw[$a]"; break;} 
     } 
     uitslag();
     
if (!isset($telleriq)) { $telleriq=0; }
if (!isset($uitslagiq)) { $uitslagiq=0; }
for ($a=0; $a<12; $a++) {
    switch ( $telleriq ) {
        case "0": echo "$vraag[0]"; $telleriq=1; $_SESSION["telleriq"] = $telleriq; uitslag(); exit; break;
        case "1": echo "$vraag[1]"; $telleriq=2; $_SESSION["telleriq"] = $telleriq; uitslag(); exit; break;
        case "2": echo "$vraag[2]"; $telleriq=3; $_SESSION["telleriq"] = $telleriq; uitslag(); exit; break;
        case "3": echo "$vraag[3]"; $telleriq=4; $_SESSION["telleriq"] = $telleriq; uitslag(); exit; break;
        case "4": echo "$vraag[4]"; $telleriq=5; $_SESSION["telleriq"] = $telleriq; uitslag(); exit; break;
        case "5": echo "$vraag[5]"; $telleriq=6; $_SESSION["telleriq"] = $telleriq; uitslag(); exit; break;
        case "6": echo "$vraag[6]"; $telleriq=7; $_SESSION["telleriq"] = $telleriq; uitslag(); exit; break;
        case "7": echo "$vraag[7]"; $telleriq=8; $_SESSION["telleriq"] = $telleriq; uitslag(); exit; break;
        case "8": echo "$vraag[8]"; $telleriq=9; $_SESSION["telleriq"] = $telleriq; uitslag(); exit; break;
        case "9": echo "$vraag[9]"; $telleriq=10; $_SESSION["telleriq"] = $telleriq; uitslag(); exit; break;
        case "10": echo "$vraag[10]"; $telleriq=11; $_SESSION["telleriq"] = $telleriq; uitslag(); exit; break;
        case "11": echo "$vraag[11]"; $telleriq=12; $_SESSION["telleriq"] = $telleriq; uitslag(); exit; break;
        default: echo "$uitslagiq"; unset($_SESSION["telleriq"]); break; }}
        
        
?>
        
        
?>


De vragen bestaan uit twee radiobuttons met antwoorden a of b. Voor het gemak is even alles wat a is goed en alles wat b is fout. Iedere set is genaamd 1 t/m 12.

$vraag[x] zijn vragen die bovenaan in het document staan, die vaker terugkomen. Hierin zit de form en de button verwerkt:

PHP:
1
$vraag[0] = "<form name=\"iq0\" method=\"post\" action=\"$PHP_SELF\">1.De eerste vraag.<br><br><input name=\"1\" type=\"radio\" value=\"a\"> Ja <br><input name=\"1\" type=\"radio\" value=\"b\"> Nee <br><br><input name=\"Submit\" type=\"submit\" value=\"Juist / Onjuist\"></form>";


Ik weet dat de code netter kan, maar ik heb zoveel geschoven en geprobeerd dat op dit moment dit de meeste stabiele versie is. Dergelijke fouten haal ik er zelf nog uit.

* Ik weet dat het netter zou zijn om
PHP:
1
$telleriq++; $_SESSION["telleriq"] = $telleriq


of beter nog
PHP:
1
$_SESSION["telleriq"]++


In de functie op te nemen, maar op één of andere manier komt hij dan tot vraag twee en daar houdt de pret op. Hij gaat niet verder. Bij $_SESSION["telleriq"]++ doet hij overigens al helemaal niks terwijl dat volgens mij ook zou moeten werken.

[ Voor 13% gewijzigd door Verwijderd op 22-10-2006 02:33 ]


Acties:
  • 0 Henk 'm!

  • henkbiertank
  • Registratie: April 2006
  • Laatst online: 15-09 14:22
PHP:
1
echo "<form action=\"$PHP_SELF\">";


zou ik zoiezo veranderen door:

PHP:
1
echo "<form action=\"".$_SERVER['PHP_SELF']."\">";

Als je dit leest, verdoe je je tijd


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
@hierboven: of je gebruikt single quotes, of je gebruikt dubbel quotes. Wat jij nu hebt zijn de nadelen van beide.
PHP:
1
echo '<form action="'.$_SERVER['PHP_SELF'].'">';



@TS: Waarom zou je een switch maken voor 11 dingen die vrijwel identiek zijn? Als je code moet copy/pasten doe je wat fout. Verder maakt het achter elkaar plakken van meerdere instructies per regel je code niet leesbaarder.Ook je manier van inspringen is erg inconsequent. Waarom is regel 8 ingesprongen? Waarom staan er zoveel accolades achteraan regel 26?
Het toevoegen van 'break' achter default is overbodig.
Zonder inhoudelijk ook maar iets aan je code te hebben gewijzigd, ziet dit er al een stuk leesbaarder uit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function uitslag() { 
    $lijst = array ($_POST['1'], $_POST['2'], $_POST['3'], $_POST['4'], $_POST['5'], $_POST['6'], $_POST['7'], $_POST['8'], $_POST['9'], $_POST['10'], $_POST['11'], $_POST['12']);
    switch ( $lijst[$a] ) { 
        case "a":
            $uitslagiq++;
            $_SESSION['uitslagiq'] = $uitslagiq;
            echo $goed . ' ' . $antw[$a];
            break;
        default:
            echo $fout . ' ' . $antw[$a];
    }
} 
uitslag();
     
if (!isset($telleriq)) { $telleriq=0; }
if (!isset($uitslagiq)) { $uitslagiq=0; }
for ($a=0; $a<12; $a++) {
    if($telleriq >= 0 && $telleriq <= 11) {
        echo $vraag[$telleriq];
        $telleriq++;
        $_SESSION[telleriq] = $telleriq;
        uitslag();
        exit;
    } else {
        echo $uitslagiq;
        unset($_SESSION['telleriq']);
    }
}

Dan nu over de inhoud:
Hoe weet de functie uitslag wat $uitslagiq is? Heb jij soms register_globals aanstaan, en/of werk je met session_register?
Wat is $a inde functie uitslag?
Waarom wordt uitslag 2x aangeroepen als 0<=$telleriq<=11?

Wat bedoel je met "het probleem is alleen dat ik het niet voor elkaar krijg de antwoorden op te halen uit elke vraag"? Als je één vraag hebt beantwoord, staat dat ergens in $_POST, daar is toch niks mis mee?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@TS: Waarom zou je een switch maken voor 11 dingen die vrijwel identiek zijn? Als je code moet copy/pasten doe je wat fout. Verder maakt het achter elkaar plakken van meerdere instructies per regel je code niet leesbaarder.Ook je manier van inspringen is erg inconsequent. Waarom is regel 8 ingesprongen? Waarom staan er zoveel accolades achteraan regel 26?
Het toevoegen van 'break' achter default is overbodig.
Zonder inhoudelijk ook maar iets aan je code te hebben gewijzigd, ziet dit er al een stuk leesbaarder uit:
Bedankt hiervoor! Het ziet er inderdaad stukken beter uit. Om je vragen te beantwoorden. Ik ben heel nieuw met PHP maar doe mijn best het zo goed mogelijk te leren. Dat is ook de rede waarom ik alles in het begin voluit schrijf. Dat is meer werk, de code wordt langer en het inspringen is sporadisch, maar het is voor mij tijdelijk overzichtelijker. Wanneer een script functioneert maak ik het altijd mooier. Als beginner werk ik in fases, voor mijn gevoel leer ik het dan het beste.
Dan nu over de inhoud:
Hoe weet de functie uitslag wat $uitslagiq is? Heb jij soms register_globals aanstaan, en/of werk je met session_register?
Wat is $a inde functie uitslag?
Waarom wordt uitslag 2x aangeroepen als 0<=$telleriq<=11?
Ik werk met session_register. De bedoeling is dat na elke vraag de telleriq +1 wordt zodat de volgende vraag gesteld wordt, dit werkt. De $uitslagiq moet na elk goed antwoord (a) met +1 verhoogd worden. $a is de $a die in de for loop staat onder de functie. Waarschijnlijk is het een hele kromme gedachte en werkt het ook niet. Maar het is de bedoeling dat het script de juiste $_POST er uit haalt gezien er maar een is ingevuld.
Wat bedoel je met "het probleem is alleen dat ik het niet voor elkaar krijg de antwoorden op te halen uit elke vraag"? Als je één vraag hebt beantwoord, staat dat ergens in $_POST, daar is toch niks mis mee?
Na elke vraag hoort in de desbetreffende $_POST het antwoord gezet. Wanneer dit goed is moet de uitslagiq met 1 verhoogd worden en anders gelijk blijven. Echter de uitslagiq blijft altijd 0 (en soms krijg ik het tot 1) maar nooit daadwerkelijk de goede uitslag. Het antwoord staat volgens mij ook niet in $_POST. Ik zou dat tussendoor moeten echo-en, maar ik zit momenteel achter een andere computer, dus dat laat ik later vandaag nog weten.

In ieder geval bedankt voor al je tijd!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb even jouw code gepakt om met comments te laten zien wat voor mij de bedoeling was. Dat maakt het misschien makkelijker te begrijpen voor iedereen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php 
function uitslag() {  
    $lijst = array ($_POST['1'], $_POST['2'], $_POST['3'], $_POST['4'], $_POST['5'], $_POST['6'], $_POST['7'], $_POST['8'], $_POST['9'], $_POST['10'], $_POST['11'], $_POST['12']); 

/* 
Alle antwoorden uit alle vragen halen. 
Ik wilde een for each gebruiken maar kwam daar niet helemaal uit.
Vandaar dat alle $_POST los staan 
*/

    switch ( $lijst[$a] ) {  
        case "a": 
            $uitslagiq++; 
            $_SESSION['uitslagiq'] = $uitslagiq; 
            echo $goed . ' ' . $antw[$a]; 
            break; 
        default: 
            echo $fout . ' ' . $antw[$a]; 

/* 
De loop (de for loop staat in de code waarin de functie gebruikt wordt). 
Elke $_POST wordt afgelopen afhankelijk van de vraag. 
Vraag 1 krijgt dus $_POST['1']; 2 $_POST['2'] etc. 
Wanneer het aangeklikte antwoord (radiobutton a of b) goed is (a) dan 
wordt de $uitslagiq met 1 verhoogd in de sessie en wordt de code die bij 
$goed en $antw[$a] getoond. $goed is altijd hetzelfde, $antw[$a] is 
afhankelijk van de vraag. Bijvoorbeeld vraag 1 krijgt $_POST['1'] 
krijgt $antw['1']. Eigenlijk is het de bedoeling dat tussen de vraag 
en de volgende vraag getoont wordt of het antwoord goed of fout was 
met uitleg erbij. Hier was ik zelf nog niet aan toe gekomen omdat ik 
eerst de basis werkend wilde hebben.
 */
    } 
}  
uitslag(); 
      
if (!isset($telleriq)) { $telleriq=0; } 
if (!isset($uitslagiq)) { $uitslagiq=0; } 

*/ Als de gebruiker de pagina voor het eerst opent zijn er nog geen $telleriq en $uitslagiq bekend.
Daarom starten deze hier bij 0. Volgens mij is de standaardwaarde sowieso 0 (weet ik niet zeker) maar dit leek mij netter 
*/

for ($a=0; $a<12; $a++) { 
    if($telleriq >= 0 && $telleriq <= 11) { 
        echo $vraag[$telleriq]; 
        $telleriq++; 
        $_SESSION[telleriq] = $telleriq; 
        uitslag(); 
        exit; 
/*
De loop. Als de $telleriq op 0 staat begint hij, als hij 11 is stopt hij. Twaaf vragen dus. 
Na elke vraag wordt er +1 opgeteld bij de teller zodat na het geven van het antwoord 
de volgende vraag getoond wordt de loop verlaten met exit omdat anders alle 12 vragen 
gelijk getoond zouden worden.
 */
    } else { 
        echo $uitslagiq; 
        unset($_SESSION['telleriq']); 
    } 
} 
/* 
De echo is louter voor mij bedoeld om te zien of de $uitslagiq werkt. 
Dit is tot dusver niet het geval geweest. Als de $telleriq hoger is dan 11 
wordt hij hier unset zodat de volgende keer weer bij vraag 1 begonnen wordt.
*/
?>


Misschien dat dit zo iets duidelijker is.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op zondag 22 oktober 2006 @ 14:35:
[...]
$a is de $a die in de for loop staat onder de functie. Waarschijnlijk is het een hele kromme gedachte en werkt het ook niet
Klopt, $a is in de functie onbekend. Omgekeerd zijn dingen die je in een functie instelt, niet buiten de functie bekend zijn (op superglobals als $_SESSION na). Dat is ook het handige aan een functie: hij trekt zich niks aan van zijn omgeving. Wat je kunt doen, is alle relevante dingen meegeven als parameter (ipv uitlsag(); doe je dan uitslag($a); bijvoorbeeld.
Verder: $telleriq is wat anders als $_SESSION['telleriq']. Die eerste zal nooit ingesteld zijn, dus die zet je ergens op 0, hoog je eentje op, en stop je in $_SESSION['telleriq']. Het is dus niet verwonderlijk dat je nooit boven de 1 uitkomt. Hetzelfde geldt voor de teller met goede antwoorden
Waarom die hele for-loop nodig is weet ik ook niet. Je hoeft elke keer toch maar 1 antwoord te controleren?
Volgens mij zoek je eerder zoiets, als $antw inderdaad de array met antwoorden voorstelt.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function verwerk_antwoord($vraag) {
    global $antw;
    if($_POST[$vraag+1] == $antw[$vraag]) {
        $_SESSION['uitslagiq']++;
        echo $goed . ' ' . $antw[$vraag];
    } else {
        echo $fout . ' ' . $antw[$vraag];
    }
} 


if(! isset($_SESSION['telleriq'])) {
    $_SESSION['telleriq'] = 0;
    $_SESSION['uitslagiq'] = 0;
}


if($_SESSION['telleriq'] > 0) {
    // groter dan 0, dus er is al een vraag gesteld
    verwerk_antwoord($_SESSION['telleriq']);
}

if($_SESSION['telleriq'] <= 11) {
    echo $vraag[$_SESSION['telleriq']];
    $_SESSION['telleriq']++;
}

if($_SESSION['telleriq'] == 12) {
    echo 'Aantal goed: ' . $_SESSION['uitslagiq'];
    $_SESSION = array();
    session_destroy();
}

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wederom bedankt voor al je moeite! Ik heb het script aangepast aan de rest en het werkt! :)

Ik heb voor de topiczoekers toegevoegd dat de vraag en het antwoord gescheiden worden weergegeven op het scherm. Verder moet de vraag ingevuld zijn, anders begint hij weer opnieuw. Alleen F5-en kan nog, maar goed, dat antwoord wordt toch fout gerekend. :D

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php 
function verwerk_antwoord($vraag) { 
    global $antw; 
     if($_POST[$vraag] == "a") { 
        $_SESSION['uitslagiq']++; 
        echo "<font color=green>GOED </font>"; echo $antw[$vraag-1];
        echo "<form name=\"volgende\" method=\"post\" action=\"$PHP_SELF\"><br><input name=\"submit\" type=\"submit\" value=\"Volgende\"></form>";
    } elseif ($_POST[$vraag] == "b") { 
        echo "<font color=red>FOUT </font>"; echo $antw[$vraag-1];
        echo "<form name=\"volgende\" method=\"post\" action=\"$PHP_SELF\"><br><input name=\"submit\" type=\"submit\" value=\"Volgende\"></form>";
    } else { echo "U dient alle twaalf vragen te beantwoorden!"; session_destroy(); exit;
 }
}  


if(! isset($_SESSION['telleriq'])) { 
    $_SESSION['telleriq'] = 0; 
    $_SESSION['uitslagiq'] = 0; 
} 


if($_SESSION['telleriq'] > 0 && $_POST['submit'] != "Volgende") { 
    verwerk_antwoord($_SESSION['telleriq']); 
} 

if($_SESSION['telleriq'] == 0) { 
    echo $vraag[$_SESSION['telleriq']]; 
    $_SESSION['telleriq']++; 
}

if($_SESSION['telleriq'] >=1 && $_SESSION['telleriq'] <= 12 && $_POST['submit'] == "Volgende") { 
    echo $vraag[$_SESSION['telleriq']]; 
    $_SESSION['telleriq']++; 
} 

if($_SESSION['telleriq'] == 13) { 
    echo 'U hebt ' . $_SESSION['uitslagiq'] . 'van de 12 vragen goed beantwoord.'; 
    $_SESSION = array(); 
    session_destroy(); 
} 
?>


Ik snap overigens precies wat je doet behalve bij de functie. Ik heb hierover wat vragen. Als je die zou willen beantwoorden kan ik het de volgende keer waarschijnlijk alleen af :)

function verwerk_antwoord($vraag)
Wordt hierbij de array van het aantal vragen geteld en is dit dan een soort lus? En waarom werkt if($_POST[$vraag] == "a") wel en het volgende niet?

PHP:
1
2
3
for ($vraag=0; $vraag<12; $vraag++)
($_POST[$vraag] == "a") 
// etc



global $antw;
Ik heb op php.net gezocht op global maar ik begrijp niet helemaal wat deze global doet. Als ik hem weg haal werkt het iig niet meer dus het is ergens nuttig voor, maar wat?

Nogmaals dank voor al je moeite! :)

[ Voor 3% gewijzigd door Verwijderd op 23-10-2006 01:04 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
function verwerk_antwoord($vraag)
Wordt hierbij de array van het aantal vragen geteld en is dit dan een soort lus? En waarom werkt if($_POST[$vraag] == "a") wel en het volgende niet?

PHP:
1
2
3
for ($vraag=0; $vraag<12; $vraag++)
($_POST[$vraag] == "a") 
// etc
Iedere keer als je een antwoord invult, wordt je script opnieuw uitgevoerd. In totaal hoeft er dus telkens maar één antwoord gecontroleerd te worden. Met jouw for-loop kijk je eerst $_POST[1] na maar als je juist de derde vraag beantwoordt hebt, zal $_POST[1] helemaal niet ingesteld zijn, en dus ook nooit gelijk zijn aan a.
global $antw;
Ik heb op php.net gezocht op global maar ik begrijp niet helemaal wat deze global doet. Als ik hem weg haal werkt het iig niet meer dus het is ergens nuttig voor, maar wat?
Kijk hier eens. Het komt erop neer dat als jij in een functie gebruik maakt van $antw, dan maakt hij een nieuwe $antw aan onafhankelijk van wat er buiten die functie gebeurt. Het zou namelijk erg vervelend zijn als je een functie later kopieert naar een groter project dat je opnieuw moet kijken of je wel unieke variabelenamen gebruikt binnen je functie. Door global $variabele toe te voegen, kijkt hij voor die variabele wel buiten je functie.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik snap hem helemaal! Bedankt voor de moeite :)
Pagina: 1