Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

[PHP] Dynamische variabelen

Anoniem
None
25 antwoorden
  • Hallo,

    Ik ben al een tijdje bezig met het bouwen van een quiz-achtige oefening.

    Hierbij is het de bedoeling dat de gebruiker goede of passende antwoorden zoekt bij een stelling. Vervolgens moet er worden gekeken hoeveel ze goed of fout heeft en waarom.

    De stellling en bijbehorende antwoorden worden allemaal uit een MySQL db geplukt. De antwoorden worden vervolgens random geplaatst en gekoppeld aan een checkbox via een unieke naam ($answer[$antwoordnummer]). Hidden fields ($answerx[$antwoordnummer]) houden bij of een antwoord juist is of niet (Ja ik weet het; veilig is anders, maar we laten het voorlopig even zo…).

    Omdat de namen van de te submitten velden variabel zijn probeer ik dit op te vangen door in het verwerkingsscript gebruik te maken van '$$'.
    Om een of andere reden schijnt dit niet te werken, net als '${$var}'.
    Kan iemand mij vertellen wat ik over het hoofd zie? Bedankt. :wink:


    [code:1:2ce71042a0] // Prepare/Generate Variables
    $max_answers = $Rs_akoef_sel->Fields("amount_answers");
    $corr_answers = 0;
    $i = 1;

    while ($i<=$max_answers)
    {
    // Check Answers
    $foo = "answerx" . $i;
    $bar = $$foo;

    $foo2 = "answer" . $i;
    $bar2 = $$foo2;

    if ($bar==1)
    {
    if ($bar2==1)
    {
    // Correct
    $com_answers[$i] = "$i. Dat is goed geantwoord.";
    $corr_answers++;
    // End Correct
    }
    else
    {
    // Incorrect
    $com_answers[$i] = "$i. Dat is fout geantwoord.";
    // End Incorrect
    }
    }
    else
    {
    if ($bar2==1)
    {
    // Incorrect
    $com_answers[$i] = "$i. Dat is fout geantwoord.";
    // End Incorrect
    }
    else
    {
    // Correct
    $com_answers[$i] = "$i. Dat is goed geantwoord.";
    $corr_answers++;
    // End Correct
    }
    }
    echo $com_answers[$i]."<br>bar = ".$bar. "<br>bar2 = ".$bar2. "<br>";
    $i++;
    // End Check Answers
    }
    [/code:1:2ce71042a0]
  • Hoe heten de variabelen waar je data in staat?
    $answerx[1] of $answer1 ?

    En hoe heet een form variabele normaal in php (hoe kom je aan de waarde?)
  • Heb je al geprobeerd de waarden uit je form uit te lezen via $_POST["inputnaam"] (of $_GET afhankelijk van je gebruikte method)? Zo ja, wat krijg je dan terug?

    Overigens zie ik het nut van het meesturen van de correcte antwoorden via hidden inputs niet zo. Of een antwoord correct is kan je beter in het script bepalen aan de hand van het vraagnummer.

    Wat ik zou doen is de antwoorden (er van uit gaande dat er maar 1 correct antwoord is) bij een radio input zetten die per vraag een unieke naam heeft. De value van de radio kan dan het antwoord id (uit de database) zijn. Bij de controle van de vragen hoef je dan alleen maar te controleren of de gegeven antwoorden overeenkomen met de database.

    bijv (pseudo code)
    [code:1:db5c482276]
    // controle van gegeven antwoorden
    query:
    SELECT vraagId, antwoordId
    FROM Vragen, Antwoorden
    WHERE Vragen.vraagId = Antwoorden.vraagId
    AND Antwoorden.antwoordCorrect = 1

    zolang er nog vragen zijn:
    antwoordVanGebruiker = _POST["vraag_" . vraagIdUitDatabase]
    Als antwoordVanGebruiker = antwoordIdUitDatabase
    Vraag Correct beantwoord
    [/code:1:db5c482276]

    Waarbij het formulier er bijvoorbeeld zo uit ziet:
    [code:1:db5c482276]
    <form method="post" …enz..>

    Een vraag:
    <input type="radio" name="vraag_6" value="12" /> Antwoord 1
    <input type="radio" name="vraag_6" value="143" /> Antwoord 2

    Nog een vraag:
    <input type="radio" name="vraag_9" value="45" /> Antwoord bla
    …enz..
    </form>
    [/code:1:db5c482276]
  • Bedankt Annie,

    ik snap precies waar je naartoe wilt, maar bij deze quiz zijn er meerdere antwoorden mogelijk. Anders had ik het inderdaad gemakkelijk met radiobuttons op kunnen lossen.

    Ik had ook al geprobeerd de $POST["answer(x)$i"] vars direct aan te spreken/op te slaan in de variabele $bar(2), maar op de een of andere manier geeft de onderstaande echo de waarden ervan niet weer. Ergens ook wel logisch natuurlijk, omdat de namen van de variabelen zelf ook variabel zijn. Dit is dus mijn probleem.

    OK, ter verduidelijking even kort de opzet van de quiz:

    Beheerders kunnen via een CMS zogeheten 'aanklikoefeningen' aanmaken. Een aanklikoefening bestaat uit 1 vraag of stelling en een variabel aantal antwoorden. Het maximaal aantal (goede) antwoorden wordt vooraf tijdens het aanmaken van de oefening bepaald.
    Alle gegevens worden opgeslagen in een MySQL-database.

    Gebruikers van het 'frontend' krijgen dus een stelling voor de neus, met daarnaast de gekoppelde antwoorden. De antwoorden staan nooit op dezelfde plek, omdat ze vooraf door elkaar gehusseld zijn.
    De vraag luidt vervolgens: zoek de juiste antwoorden bij de stelling.

    In het verwerkingsscript dient dus gekeken te worden hoeveel antwoorden de gebruiker goed of fout heeft gehad en waarom.

    Da's alles :wink:
  • Geachte de_paashaas,

    Annie heeft het bij het rechte eind. Wat jij wil kan gemakkelijk zonder de antwoorden mee te sturen.
    Je maakt het jezelf veel te moeilijk.
    Tip: Begin eens met een makkelijk werkend voorbeeld en breidt dat langzaam uit.
    Probeer eerst eens een form met 1 input te verzenden en de waarde van de input in je php script uit te lezen. Als dat een keer gelukt is, probeer dan om meerdere radio's uit te lezen etc.

    Als dat allemaal gelukt is en je hebt een vraag, probeer dan tot de KERN van je probleem te komen. Als jouw form variabele Aedfjb_ech heet, dan is deze uit te lezen met $_POST["Aedfjb_ech"]. Als je nou een oplopend getal aan de naam toevoegt, kan dat bv. zo:

    (Pseudo html en php code:)

    <input type="text" name="ding1">
    <input type="text" name="ding2">
    <input type="text" name="ding3">

    my $i = 1;
    echo $_POST["ding" + $i]

    Veel successsss…
  • Volgens mij gaat het ook veel te ingewikkeld. Stel date je 100 vragen hebt. Die geef je een nummer van 0 .. 99 Verder heb je 1000 antwoorden, nummers van 0 999

    Op de form zet je dan de vraag met bijvoorbeeld 5 checkboxes:

    [code:1:56b77a62d0]
    <input type="checkbox" name="cb[13101]" />
    <input type="checkbox" name="cb[13102]" />
    <input type="checkbox" name="cb[13103]" />
    <input type="checkbox" name="cb[13104]" />
    <input type="checkbox" name="cb[13105]" />
    [/code:1:56b77a62d0]
    Dit is dus vraag 13 met de antwoorden 101 t/m 105
    Met submit kont er dan dit uit:
    [code:1:56b77a62d0]
    POST data

    Array
    (
    [fname] => vraag13
    [cb] => Array
    (
    [13101] => on
    [13103] => on
    )
    )
    [/code:1:56b77a62d0]

    De nummers maak je met: vraag nummer * 100 + antwoord.
    Je krijgt wel alleen de aangevinkte checboxen te zien.

    wimb
  • Jaaap, bedankt voor je reply.

    Het uitlezen van een variabele vanuit een formulier op zich is echter het probleem niet. Hoe dit werkt is bij mij bekend.
    Zoals ik al eerder aangegeven heb kan ik niet radiobuttons werken, aangezien meerdere antwoorden goed kunnen zijn.
    En aangezien het aantal antwoorden per vraag variabel is, moet het mogelijk zijn om deze stuk voor stuk uit zijn.

    Ik begrijp alleen niet waarom mijn stukje code níet werkt, want de syntax klopt volgens mij. Ik heb al op verschillende manieren geprobeerd de doorgestuurde variabele variabelen aan te spreken ($_POST, $HTTP_POST_VARS, $$, ${$var} etc.), maar blijkbaar zie ik iets over het hoofd. Het is vast iets lulligs, dat kan bijna niet anders… :P
  • [quote:90384fa5f3="WimB"]Volgens mij gaat het ook veel te ingewikkeld. Stel date je 100 vragen hebt. Die geef je een nummer van 0 .. 99 Verder heb je 1000 antwoorden, nummers van 0 999
    [/quote:90384fa5f3]
    Dat lijkt me niet echt een schaalbare oplossing, WimB. De vragen en antwoorden zijn beheerbaar en dus is de kans vrij groot dat je binnen afzienbare tijd door je nummers heen bent. Bij het ophalen van de vraag en de antwoorden uit de database pas de nummering toekennen is geen optie (lijkt me) aangezien de volgorde van de antwoorden op het formulier niet vast staat. Waardoor je een extra "volgorde identifier" moet gaan toekennen en meesturen.

    Het wordt allemaal veel simpeler als je de waarden gescheiden door een karakter toevoegt aan de name. Bijv: cb_13_101. In het script kan je splitten op dit karakter en daarmee heb je in ieder geval niet de limitatie van het aantal vragen en/of antwoorden.

    Door het aantal goede antwoorden bij een vraag variabel te maken (1 of meerdere) wordt het probleem wel een klein beetje ingewikkelder. Als je namelijk dezelfde methode toepast als ik hierboven al schetste voor een quiz met maar een enkel goed antwoord zal je tegen een geneste lus aanlopen. Niet dat je daar echt van wakker hoeft te liggen gezien de geringe hoeveelheid data, maar ik denk dat er ook nog wel een andere mogelijkheid moet bestaan.
  • [quote:ed31c7b1bc="de_paashaas"]maar blijkbaar zie ik iets over het hoofd. Het is vast iets lulligs, dat kan bijna niet anders… :P[/quote:ed31c7b1bc]
    Laat dan eens zien hoe zo'n checkbox eruit ziet (html) en hoe je de waarde daarvan ophaalt. Dan kunnen we even meekijken.
  • Annie,

    Die limitatie zie ik niet , je kunt het getal heel groot maken of een string gebruken bv <input type="checkbox" name="cb[V100003A000001011]" />

    Als je alle vragen wilt weten kun je hidden inputs gebruiken met het zelfde getal / string.


    wimb
  • Annie heeft inderdaad gelijk.

    De aanklikoefeningen moeten uiteraard zo dynamisch mogelijk blijven, aangezien de content ervan uit een database getrokken wordt; maar je idee was/is okee :wink:

    Annie, ik kan nu even niet aan de source code komen, deze zal ik morgen even plaatsen, goed? Daarbij is er op dit moment Horizon op de BBC aan de gang met een aflevering over neutrino's (nerd-alert! haha). :lol:

    Grtz.
  • [quote:515e2caa6d="WimB"]Die limitatie zie ik niet , je kunt het getal heel groot maken of een string gebruken bv <input type="checkbox" name="cb[V100003A000001011]" />
    [/quote:515e2caa6d]
    In het eerste geval moet je nog steeds zelf die limiet aanbrengen terwijl dit niet nodig is (de limiet ligt dan vast in de mogelijkheden van de database of scripting taal). In het tweede geval doe je in principe hetzelfde als ik :D

    p.s. Bij een string-index natuurlijk wel quotes gebruiken, cb[
  • Goeiemorgen :wink:

    Bij deze even (het belangrijkste deel van) de source van het formulier. Het is inmiddels een beetje op
    spaghetti gaan lijken; het is gelukkig nog een test.

    [code:1:4701376089]
    <table width="100%" border="0" align="left" cellpadding="0" cellspacing="0" class="mednormal">
    <?php
    $max_answers = $Rs_akoef_sel->Fields("amount_answers");
    $Rs_answers->MoveFirst();

    // Shuffle
    $i = 1;

    srand((float) microtime() * 10000000);

    while ($i<=$max_answers)
    {
    $next_answer = rand(1, $max_answers);
    if ($set_answers[$next_answer]==NULL)
    {
    // Unused Answer
    $curr_answer = $Rs_answers->Fields("content");
    $curr_alpha = $alpha[$i-1];

    if ($Rs_answers->Fields("correct_answer")==1)
    {
    // Correct Answer
    echo "<input=\"hidden\" name=\"answerx$next_answer\" id=\"answerx$next_answer\" value=\"1\">";
    $meuh = 1;
    // End Correct Answer
    }
    else
    {
    // Correct Answer
    echo "<input=\"hidden\" name=\"answerx$next_answer\" id=\"answerx$next_answer\" value=\"0\">";
    $meuh = 0;
    // End Correct Answer
    }
    $set_answers[$next_answer]=$curr_answer;
    $set_canswers[$next_answer]=$meuh;

    $Rs_answers->MoveNext();
    $i++;
    // End Unused Answer
    }
    // End Shuffle
    }
    // Loop thrue the answers
    $n = 1;

    while ($n<=$max_answers)
    {
    $rowcount++;
    ?>
    <tr align="left" valign="middle" class="mednormal" <?php if ($rowcount==1) { echo "bgcolor=\"#EAEAF0\"";} elseif ($rowcount<>1) { echo "bgcolor=\"FFFFFF\""; $rowcount=0; } ?>>
    <td width="30" height="40">&nbsp;<strong><?php echo $n; ?>.</strong></td>
    <td width="20" height="40">
    <input name="answer<?php echo $n; ?>" type="checkbox" value="<?php echo $set_canswers[$n]; ?>">
    </td>
    <td width="20" height="40">&nbsp;</td>
    <td height="40"<?php if ($rowcount==1) { echo " style=\"filter:progid:DXImageTransform.Microsoft.Gradient(endColorstr='#FFFFFF', startColorstr='#EAEAF0', gradientType='1');\"";} elseif ($rowcount<>1) { echo "bgcolor=\"#FFFFFF\" bordercolor=\"#FFFFFF\""; } ?>>
    <?php echo $set_answers[$n]; ?>
    </td>
    </tr>
    <?php
    $n++;
    }
    ?>
    </table>[/code:1:4701376089]

    Bedankt :wink:
  • Annie heeft inderdaad gelijk.
    Je moet zelf een limit aanbrengen. Kan natuurlijk ook een voordeel zijn.
    Als je dat niet wilt kun je beter strings gebruiken. Als je dan voor die string de ID’s van de vraag en het antwoord aan elkaar plakt kun je dat meteen weer gebruiken om te zien of het antwoord goed is.

    Bv met 3 mysql tabellen:

    Tabel met vragen: vraag_ID vraag
    Tabel met antwoorden: antwoord_ID, antwoord
    Tabel met de combinaties: (vraag_ID antwoord_ID) , goed/fout

    De bedoeling is dat vraag_ID en antwoord_ID samen de key zijn voor de goed/fout tabel.. Die vind je dan weer terug in de checkbox array.

    wimb
  • Even wat screenshotjes:

    Het formulier:

    [img:e6b92e9d55]http://www.yarka.nl/vvv/images/x1.jpg[/img:e6b92e9d55]

    Antwoord 1, weergegeven als nr. 5 is in dit geval het enige juiste antwoord.

    De output van het verwerkingsscript:

    [img:e6b92e9d55]http://www.yarka.nl/vvv/images/x2.jpg[/img:e6b92e9d55]

    De $bar-variabelen zouden dus de juiste namen van de checkboxes moeten weergeven - hier gaat dus iets mis. :)
  • Kan je niet zien welke variabelen er wél worden doorgegeven? Misschien dat dat je een heel eind verder helpt…

    - Bas
  • Bas,

    Precies, vandaar ook dat ik de resultaten even naar de pagina 'echo'.
    Wat de pagina straks écht met de resultaten gaat doen en hoe ze deze gaat weergeven staat nog niet vast.

    Als ik dus bijvoorbeeld

    [code:1:a6cf583da6]
    echo $com_answers[$i]."<br>bar = ".$foo. "<br>bar2 = ".$foo2. "<br>";
    [/code:1:a6cf583da6]

    probeer geeft ze (en da's logisch) de juiste checkboxnamen:

    [img:a6cf583da6]http://www.yarka.nl/vvv/images/x3.jpg[/img:a6cf583da6]

    Het gaat mij om het uitlezen van deze variabele variabelen/-namen.

    Grtz.
  • Plaats eens het resultaat van[code:1:c145a4dd42]echo "<pre>";
    print_r($_POST);
    echo "</pre>";[/code:1:c145a4dd42]- Bas
  • [img:1130bd3d88]http://www.yarka.nl/vvv/images/x4.jpg[/img:1130bd3d88]

    Hè? Hoe kan dat nou? :o
  • Ach, je hebt iig de (voorlopige) oorzaak! ;)

    Hetzelfde kan je natuurlijk doen voor $_GET, misschien dat dat helpt…

    - Bas

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.