Door
daniel ravenshorst
op 17-04-2014 13:13
gewijzigd op 17-04-2014 13:46
2.307 views
Hallo,
Ik heb een probleem, ik heb een quiz gemaakt en die antwoorden wil ik nu opslaan in mysql.
Ik maak het script zo dat er altijd nieuwe quiz bij kan, zonder dat ik het weer moet programmeren.
Dus ik weet niet hoeveel vragen er zijn. In dit geval zijn het er 16.
Ik heb de antwoorden tijdelijk opgeslagen in een Session zodat aan het einde van de quiz alle antwoorden nog heb.
Maar dit werkt dus niet helemaal zoals ik wil, aangezien ik zogenaamd niet weet hoeveel vragen er zijn..
Heb al verschillende loops geprobeerd, maar kom er niet echt meer uit.
Hopelijk hebben jullie een oplossing :-)
Mvg Daniel
Toevoeging op 17/04/2014 13:15:16:
Sorry ik ben nieuw hier, ik weet niet hoe je de code anders kunt laten zien.
Code graag even tussen [code] en [/code] tags plaatsen.
>>> Dus ik weet niet hoeveel vragen er zijn.
Dat heet database normalisatie. Ik geloof dat er op deze site ook een tutorial over is.
Het komt er op neer dat je meerdere tabellen gebruikt en deze d.m.v. een uniek id of koppeltabel koppelt aan elkaar.
tabel_vragen
- id (foreign key,auto_increment)
---- quiz_id
| - vraag
|
| tabel_quiz
---- id (foreign key,auto_increment)
vragen.id en quiz.id hebben een relatie.
Van quiz zal er één zijn (uniek id), maar van de vragen kunnen er zoveel zijn als je wilt.
Middel een LEFT JOIN koppel je vragen.id aan quiz.id
Bedankt voor de reactie, Ik begrijp een beetje wat je bedoeld, maar hoe kan dit mijn probleem oplossen?
dit is mijn Database nu:
Tabel vragen
Nr Vraag Notitie Antw_a Antw_b Antw_c Antw_d Antw_e type_Antw
1 Vraag1 .... a b c d e radio
2 Vraag2 .... a b c d e checkbox
3 Vraag3 .... a b c d e radio
4 Vraag4 .... a b c d e radio
5 Vraag5 .... a b c d e checkbox
6 Vraag6 .... a b c d e radio
Tabel user_id
user_id Vraag_1 Vraag_2 Vraag_3 Vraag_4 Vraag_5 Vraag_6 Vraag_7 Vraag_8 etc..
... ... ... ... ... ... ... ... ...
Dan zou ik eerder eens kijken naar een betere databasestructuur, zoals Michael al heeft laten zien.
Het is not-done in de databasewereld om velden of tabellen te nummeren.
Je hebt dus drie entiteiten welke alle drie vooraf niet te bepalen zijn: quiz, vraag, antwoord. Voor elk van de entiteiten zal je dus een tabel moeten hebben:
Tabel quizzen:
- quiz_id
- .... (wat je nog meer wilt hebben)
Tabel vragen:
- vraag_id
- quiz_id (om te koppelen aan een quiz)
- vraag
- ....
Tabel antwoorden:
- antwoord_id
- vraag_id (om te koppelen aan de vraag, quiz_id is hier niet meer nodig)
- antwoord
- volgorde (als je altijd wilt weten welk antwoord als eerste moet komen etc)
Ik ben een beetje bezig geweest met mijn database.
Ik heb dus nu 3 tabellen gemaakt zoals hierboven: quizzen, vragen en antwoorden.
Alleen begrijp ik het nog niet zo goed.
Waar komen de antwoorden die ingevoerd zijn? moet ik daar ook nog een tabel voor aanmaken?
En hoe werkt dat precies met koppelen? en waar moet ik de primary key opzetten, ik neem aan quiz_id in tabel quizzen en in tabel vragen dan vraag_id?
En zou je meer uitleg kunnen geven over de volgorde die in tabel antwoorden staat.
Je zal inderdaad ook nog een tabel nodig hebben om de gegeven antwoorden in op te slaan. Ook dat is namelijk weer een many-to-many relatie. In feite is dat een koppeltabel tussen de gebruiker en het antwoord, of tussen gebruiker en vraag. Waarom of? Omdat je eigenlijk opslaat dat gebruiker x antwoord y heeft gegeven. Omdat je dan echter elke keer dat je een antwoord invoert zal moeten checken of die gebruiker niet al een ander antwoord voor de betreffende vraag heeft gegeven, is het denk ik makkelijker om de link tussen gebruiker en vraag op te slaan en daarbij het antwoord. Het is dan weliswaar geen koppeltabel meer in de stricte vorm, maar wel makkelijker. Je hebt dan dus:
tabel gegeven_antwoorden:
- gebruiker_id
- vraag_id
- antwoord_id
(met een unieke key op gebruiker_id en vraag_id als elke gebruiker maar 1 keer een quiz mag maken)
Met het koppelen zet je de primary keys op de id velden (quiz_id, vraag_id, antwoord_id). Vervolgens kan je ervoor kiezen om dan ook een foreign keys aan te maken tussen de tabellen, zodat als je de quiz wilt verwijderen alle vragen en antwoorden ook direct weg zijn.
Met de volgorde bedoel ik de volgorde zoals je de antwoorden op het scherm wilt hebben staan. Omdat in de meeste databases er geen natuurlijke sortering plaats vindt, kan het zijn dat de volgorde van de antwoorden bij een vraag de ene keer anders is dan de andere keer. Als je dat in de hand wilt houden en dus een antwoord a, b, c en d wilt hebben, dan heb je een extra kolom nodig waarin je die volgorde opslaat. Bij het ophalen van de vragen en antwoorden kan je daar dan op sorteren en op die manier krijg je altijd weer de juiste volgorde op het scherm.
>>(met een unieke key op gebruiker_id en vraag_id als elke gebruiker maar 1 keer een quiz mag maken)
Met het koppelen zet je de primary keys op de id velden (quiz_id, vraag_id, antwoord_id).
Als dan een quiz meerdere malen gemaakt kan worden door de dezelfde gebruiker, moet je vooral geen PK leggen op die drie kolommen, want dat levert ook weer een unique constraint op.
Overigens bestaat er geen strikte vorm voor een koppeltabel.
Allereerst wil ik iedereen bedanken voor de snelle hulp.
Ik begin het steeds beter te begrijpen, heb een aantal tut's gelezen en wordt me allemaal wat duidelijker.
Alleen begrijp ik de tabel gegeven_antwoorden niet helemaal.
In een quiz komen ongeveer 15 tot 20 vragen in voor, maar die moet hij toch opslaan onder dezelfde gebruiker_id, dus dezelfde gebruiker_id komt er 15 tot 20 keer in voor.
Begrijp ik dit goed?
Toevoeging op 25/04/2014 13:54:59:
-- Databank: `quiz`
--
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `antwoorden`
--
CREATE TABLE IF NOT EXISTS `antwoorden` (
`antwoord_id` int(11) NOT NULL,
`vraag_id` int(11) NOT NULL,
`antwoord` varchar(255) NOT NULL,
`volgorde` char(1) NOT NULL,
KEY `vraag_id` (`vraag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `quizzen`
--
CREATE TABLE IF NOT EXISTS `quizzen` (
`quiz_id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`quiz_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `resultaat`
--
CREATE TABLE IF NOT EXISTS `resultaat` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`vraag_id` int(11) NOT NULL,
`antwoord_id` int(11) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `vragen`
--
CREATE TABLE IF NOT EXISTS `vragen` (
`vraag_id` int(11) NOT NULL,
`quiz_id` int(11) NOT NULL,
`vraag` varchar(255) NOT NULL,
`bijschrift` varchar(255) DEFAULT NULL,
KEY `quiz_id` (`quiz_id`),
KEY `vraag_id` (`vraag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Beperkingen voor gedumpte tabellen
--
--
-- Beperkingen voor tabel `antwoorden`
--
ALTER TABLE `antwoorden`
ADD CONSTRAINT `vraag_id` FOREIGN KEY (`vraag_id`) REFERENCES `vragen` (`vraag_id`) ON DELETE CASCADE ON UPDATE CASCADE;
--
-- Beperkingen voor tabel `vragen`
--
ALTER TABLE `vragen`
ADD CONSTRAINT `quiz_id` FOREIGN KEY (`quiz_id`) REFERENCES `quizzen` (`quiz_id`) ON DELETE CASCADE ON UPDATE CASCADE;
Dit is mijn database nu.
Nog suggesties, of fouten die jullie zien?
En dan moet je in de tabel resultaat de primary key over user_id en vraag_id nemen.
In de tabel vragen mis je een PK, en ik zou daarbij ook het id van het goede antwoord opslaan.
Bij antwoorden mis je ook een PK (auto_increment).