Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: Tietokannasta radiobuttonien arvot

Hoover [01.12.2006 15:28:13]

#

Hmm... Mitenkäs se olisi viisas tapa tehdä PHP + MySQL -yhdistelmällä tietokannasta radionapin arvon haku?

Tilanne on sellainen, että minulla on lomake joka sisältää paljon kysymyksiä joihin vastataan käyttäen radionappeja. Käyttäjät voivat käydä ronkkimassa lomakkeen radionappeja (4 radionappia aina yhtä kysymystä kohden) ja sitten tallentaa omat valintansa tietokantaan. Tähän asti ei ole ongelmaa, mutta sitten kun käyttäjä tulee takaisin järjestelmään muokkaamaan valintojaan ja tarkoitus olisi ladata valitut arvot radionapeille.

Tässähän pitää ihan älytön määrä tehdä ehtolauseita jos kuvitellaan, että minulla on vaikka yli 100 kysymystä joihin vastataan radionapeilla. Kait tähän jokin kikkakakkonen on etten ihan pöljänä rupea kirjoittamaan noita ehtolauseita. :o

ajv [01.12.2006 15:58:31]

#

Jos kysymyksiä tosiaan on paljon, niin ei muuta kuin kysymykset ja vastausvaihtoehdot tietokantaan (eri tauluihin). Lisäksi teet liitostaulun, johon tulee käyttäjän Id, kysymyksen Id sekä vastaus. Tuollaisen kannan päälle pystyykin sitten jo tekemään suht. automaattisen systeemin.

Nyt juuri sopivasti ylimääräistä aikaa pieneen demoon:

Kysymykset:
---------------------
Id | Kysymys
---+-----------------
 1 | Ikäsi?
 2 | Sukupuolesi?


Vastausvaihtoehdot
-----------------------------------------
KysymysId | VastausId | Vastausvaihtoehto
----------+-----------+--------------------
    1     |     1     | 10 - 20
    1     |     2     | 21 - 30
    1     |     3     | 31 - 40
    1     |     4     | 41 - 100
    2     |     1     | Mies
    2     |     2     | Nainen

KayttajaVastaukset
-----------------------------------
KayttajaId | KysysmysId | Vastaus
-----------+------------+----------
     1     |      1     |    3
     1     |      2     |    1

ajv [01.12.2006 16:13:41]

#

Niin ja käyttäjän vastausten haku balttiarallaa näin:

SELECT
   Kysymykset.Kysymys,
   Vastaukset.VastausId,
   Vastaukset.Vastaus
FROM
    Kysymykset
LEFT JOIN
	Vastausvaihtoehdot ON Vastausvaihtoehto.KysymysId = Kysymys.KysymysId
LEFT JOIN
	KayttajaVastaukset ON Kysymys.KysymysId = KayttajaVastaukset.KysymysId
WHERE
	KayttajaVastaukset.KayttajaId = [käyttäjän ID]
ORDER BY
	Kysymykset.Id, VastausVaihtoehdot.Id

Nyt pikkujouluihin...! :)

Hoover [01.12.2006 17:48:21]

#

Hmps.. Ehkä tuo kysymys oli hieman epäselvä.. :I

Tarkoitus on siis saada tämä oikea radionappi aktiiviseksi kun asiakas kirjautuu järjestelmään. Eli jos asiakas on valinnut:

Tykkään stetsoneista:
Ei[] Ehkä[x] En sano[] Kyllä[]

... niin tämä sama Ehkä on valittu sitten oletuksena kun hän seuraavan kerran kirjautuu järjestelmään. Valinnat on kirjattu tietokantaan ihan numeroina (0-3).

Ainut keino mitä tuli mieleen, olisi sellainen systeemi, että aina yhdelle kysymykselle pitäisi tehdä neljä ehtoa:

Jos valinta = 0
Radionappi1 = checked
Radionappi2 = unchecked
Radionappi3 = unchecked
Radionappi4 = unchecked

MuutoinJos valinta = 1
Radionappi1 = unchecked
Radionappi2 = checked
Radionappi3 = unchecked
Radionappi4 = unchecked

MuutoinJos valinta = 2
Radionappi1 = unchecked
Radionappi2 = unchecked
Radionappi3 = checked
Radionappi4 = unchecked

MuutoinJos valinta = 3
Radionappi1 = unchecked
Radionappi2 = unchecked
Radionappi3 = unchecked
Radionappi4 = checked

Jokaiselle kysymykselle tuollanen hirveä sarja ehtoja. :o

Antti Laaksonen [01.12.2006 18:33:21]

#

Ratkaisu on tulostaa kysymykset sopivan for-silmukan avulla, jolloin sama HTML-koodi täytyy kirjoittaa vain kerran. Tämän vuoksi silmukan sisällä täytyy tavalla tai toisella saada selville, mikä kysymys sillä hetkellä kuuluu tulostaa sivulle.

Tässä on esimerkki, jonka pitäisi selventää asiaa:

<?php

// kysymykset ja niiden vastaukset
$kys[] = array("Kysymys A", "Vastaus A1", "Vastaus A2", "Vastaus A3");
$kys[] = array("Kysymys B", "Vastaus B1", "Vastaus B2", "Vastaus B3");
$kys[] = array("Kysymys C", "Vastaus C1", "Vastaus C2", "Vastaus C3");
$kys[] = array("Kysymys D", "Vastaus D1", "Vastaus D2", "Vastaus D3");

// valittu vastaukset A2, B1, C3 ja D3
$val = array(2, 1, 3, 3);

for ($i = 0; $i < count($kys); $i++) {
    // tulostetaan kysymys
    echo "<p>{$kys[$i][0]}</p>";
    for ($j = 1; $j < count($kys[$i]); $j++) {
        $lisa = "";
        // merkitään vaihtoehto tarvittaessa valituksi
        if ($val[$i] == $j) $lisa = "checked=\"checked\"";
        // tulostetaan vaihtoehto
        echo "<input type=\"radio\" name=\"k{$i}\" $lisa>{$kys[$i][$j]}<br>";
    }
}

?>

Taulukossa $kys ovat kaikki kysymykset helposti muutettavassa muodossa, taulukossa $val taas ovat käyttäjän valinnat kysymysten järjestyksessä. Muuttuja $lisa määrittää kysymysten tulostuksessa, onko tietty vaihtoehto valittu.

Hoover [01.12.2006 22:02:53]

#

Joo, tuo näytästää vähän siltä mitä ajoin takaa. Kiitti.

Ainakin tulee paljon lyhempi tuosta tiedostosta kuin tuolla periaatteella mikä minulla kävi aluksi mielessä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta