Probleem antwoorden opslaan in mysql

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Daniel ravenshorst

daniel ravenshorst

17/04/2014 13:13:34
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
$for ($i=1;$i<=$aantal;$i++){
$vraag[$i] = $_SESSION['vraag'.$i];
}

mysqli_query($con,"INSERT INTO resultaat ('Vraag_1', Vraag_2, 'Vraag_3', 'etc..') VALUES ('$vraag[$i]', '$vraag[$i]', '$vraag[$i]', 'etc..' )");



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.
Gewijzigd op 17/04/2014 13:46:48 door Daniel ravenshorst
 
PHP hulp

PHP hulp

26/04/2024 06:38:26
 
Michael -

Michael -

17/04/2014 13:20:21
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
  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
Gewijzigd op 17/04/2014 13:21:50 door Michael -
 
Daniel ravenshorst

daniel ravenshorst

17/04/2014 13:52:15
Quote Anchor link
Bedankt voor de reactie, Ik begrijp een beetje wat je bedoeld, maar hoe kan dit mijn probleem oplossen?

dit is mijn Database nu:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
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..
...        ...        ...        ...        ...        ...        ...        ...        ...
Gewijzigd op 17/04/2014 13:53:13 door daniel ravenshorst
 
- Ariën  -
Beheerder

- Ariën -

17/04/2014 14:22:26
Quote Anchor link
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.
 
Erwin H

Erwin H

17/04/2014 14:26:13
Quote Anchor link
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)
Gewijzigd op 17/04/2014 14:26:39 door Erwin H
 
Daniel ravenshorst

daniel ravenshorst

24/04/2014 12:44:11
Quote Anchor link
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.

Mvg Daniel
 
Erwin H

Erwin H

24/04/2014 14:34:48
Quote Anchor link
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.
Gewijzigd op 24/04/2014 14:35:52 door Erwin H
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

24/04/2014 21:29:56
Quote Anchor link
>>(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.
 
Daniel ravenshorst

daniel ravenshorst

25/04/2014 13:35:35
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
68
69
70
71
-- 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?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

25/04/2014 17:05:26
Quote Anchor link
Kijk even naar de opzet van Erwin:

- gebruiker_id
- vraag_id
- antwoord_id

Het gebruiker_id zal dus inderdaad 15 tot 20 keer (per quiz die de gebruiker gedaan heeft) voorkomen.
Maar de vraag_id is natuurlijk telkens anders.

Het uiteindelijke record zal dus telkens uniek zijn.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

25/04/2014 17:49:08
Quote Anchor link
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).
 
Frank Nietbelangrijk

Frank Nietbelangrijk

25/04/2014 18:26:36
Quote Anchor link
Ik zou het zo doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
-- phpMyAdmin SQL Dump
-- version 3.5.2.2
-- http://www.phpmyadmin.net
--
-- Machine: 127.0.0.1
-- Genereertijd: 25 apr 2014 om 18:21
-- Serverversie: 5.5.27
-- PHP-versie: 5.4.7

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Databank: `quiz`
--

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `antwoorden`
--

CREATE TABLE IF NOT EXISTS `antwoorden` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vraag_id` int(11) NOT NULL,
  `antwoord` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `volgorde` varchar(1) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `vraag_id` (`vraag_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ;

--
-- Gegevens worden uitgevoerd voor tabel `antwoorden`
--

INSERT INTO `antwoorden` (`id`, `vraag_id`, `antwoord`, `volgorde`) VALUES
(1, 1, 'rood', 'a'),
(2, 1, 'groen', 'b'),
(3, 1, 'blauw', 'c'),
(4, 2, '25 km per week', 'a'),
(5, 2, '50 km per week', 'b'),
(6, 2, '75 km per week', 'c'),
(7, 2, '100 km per week', 'd');

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `quizzen`
--

CREATE TABLE IF NOT EXISTS `quizzen` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `titel` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;

--
-- Gegevens worden uitgevoerd voor tabel `quizzen`
--

INSERT INTO `quizzen` (`id`, `titel`) VALUES
(1, 'Test Quiz');

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `resultaten`
--

CREATE TABLE IF NOT EXISTS `resultaten` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `vraag_id` int(11) NOT NULL,
  `antwoord_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `vraag_id` (`vraag_id`),
  KEY `user_id` (`user_id`),
  KEY `antwoord_id` (`antwoord_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

--
-- Gegevens worden uitgevoerd voor tabel `resultaten`
--

INSERT INTO `resultaten` (`id`, `user_id`, `vraag_id`, `antwoord_id`) VALUES
(1, 1, 1, 1),
(2, 1, 2, 5);

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `naam` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;

--
-- Gegevens worden uitgevoerd voor tabel `users`
--

INSERT INTO `users` (`id`, `naam`, `email`) VALUES
(1, 'Frank', '[email protected]');

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `vragen`
--

CREATE TABLE IF NOT EXISTS `vragen` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `quiz_id` int(11) NOT NULL,
  `vraag` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `bijschrift` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `quiz_id` (`quiz_id`),
  KEY `vraag_id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

--
-- Gegevens worden uitgevoerd voor tabel `vragen`
--

INSERT INTO `vragen` (`id`, `quiz_id`, `vraag`, `bijschrift`) VALUES
(1, 1, 'Welke kleur heeft de auto?', NULL),
(2, 1, 'Hoeveel kilometer rijdt de auto per week?', NULL);

--
-- Beperkingen voor gedumpte tabellen
--

--
-- Beperkingen voor tabel `antwoorden`
--
ALTER TABLE `antwoorden`
  ADD CONSTRAINT `antwoorden_ibfk_1` FOREIGN KEY (`vraag_id`) REFERENCES `vragen` (`id`) ON DELETE CASCADE;

--
-- Beperkingen voor tabel `resultaten`
--
ALTER TABLE `resultaten`
  ADD CONSTRAINT `resultaten_ibfk_3` FOREIGN KEY (`antwoord_id`) REFERENCES `antwoorden` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `resultaten_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `resultaten_ibfk_2` FOREIGN KEY (`vraag_id`) REFERENCES `vragen` (`id`) ON DELETE CASCADE;

--
-- Beperkingen voor tabel `vragen`
--
ALTER TABLE `vragen`
  ADD CONSTRAINT `vragen_ibfk_1` FOREIGN KEY (`quiz_id`) REFERENCES `quizzen` (`id`) ON DELETE CASCADE;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


dan gelijk maar de query om de vragen voor één quiz op het scherm te krijgen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
select
    v.vraag, v.bijschrift, a.volgorde, a.antwoord
from
    vragen v
left join
    antwoorden a
on
    v.id=a.vraag_id
where
    v.quiz_id=1
order by
    v.id, a.volgorde


en de query om de gegeven antwoorden te krijgen voor één gebruiker en één quiz:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
select
    v.vraag, a.volgorde, a.antwoord
from
    resultaten  r
left join
    antwoorden a
on
    r.antwoord_id=a.id
left join
    vragen v
on
    a.vraag_id=v.id
where
    r.user_id=1 and v.quiz_id=1
order by
    v.id, a.volgorde
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

25/04/2014 19:17:52
Quote Anchor link
Frank, je weet dat er ook een INNER JOIN bestaat?
En waarom geef je in alle tabellen de id kolommen dezelfde naam?
In resultaten is die (AI)kolom volledig overbodig.

Ik had hem zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
CREATE TABLE quizzen (
    quiz_id INT NOT NULL AUTO_INCREMENT,
    quiz_naam VARCHAR(75) NOT NULL,
    PRIMARY KEY (quiz_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE vragen (
    vraag_id INT NOT NULL AUTO_INCREMENT,
    quiz_id INT NOT NULL,
    vraag VARCHAR(255) NOT NULL,
    bijschrift VARCHAR(255),
    goed_antwoord INT NOT NULL,
    PRIMARY KEY (vraag_id),
    INDEX idx_quiz (quiz_id),
    CONSTRAINT fk_quiz FOREIGN KEY (quiz_id)
        REFERENCES quizzen(quiz_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE antwoorden (
    antwoord_id INT NOT NULL AUTO_INCREMENT,
    vraag_id INT NOT NULL,
    antwoord VARCHAR(255) NOT NULL,
    volgorde CHAR(1) NOT NULL,
    PRIMARY KEY (antwoord_id),
    INDEX idx_vraag_antwoord (vraag_id),
    CONSTRAINT fk_vraag_antwoord FOREIGN KEY (vraag_id)
        REFERENCES vragen(vraag_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE gebruikers (
    gebruiker_id INT NOT NULL AUTO_INCREMENT,
    gebruiker_naam VARCHAR(75) NOT NULL,
    gebruiker_email VARCHAR(150) NOT NULL,
    PRIMARY KEY (gebruiker_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE resultaten (
    gebruiker_id INT NOT NULL,
    vraag_id INT NOT NULL,
    antwoord_id INT NOT NULL,
    PRIMARY KEY (gebruiker_id, vraag_id),
    INDEX idx_vraag_resultaat (vraag_id),
    INDEX idx_antw_resultaat (antwoord_id),
    CONSTRAINT fk_vraag_resultaat FOREIGN KEY (vraag_id, antwoord_id)
        REFERENCES antwoorden(vraag_id, antwoord_id),
    INDEX idx_gebr_antwoord (gebruiker_id),
    CONSTRAINT fk_gebr_antwoord FOREIGN KEY (gebruiker_id)
        REFERENCES gebruikers(gebruiker_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Gewijzigd op 25/04/2014 19:25:37 door Ger van Steenderen
 
Frank Nietbelangrijk

Frank Nietbelangrijk

25/04/2014 21:11:23
Quote Anchor link
Ger van Steenderen op 25/04/2014 19:17:52:
Frank, je weet dat er ook een INNER JOIN bestaat?
En waarom geef je in alle tabellen de id kolommen dezelfde naam?
In resultaten is die (AI)kolom volledig overbodig.


Hoi Ger,

Ja ik weet dat er een inner join bestaat. Maar wellicht is het soms moeilijk om een keus te maken tussen left en inner. Misschien wil je hierover nog iets kwijt? Ik weet wel dat bij een innerjoin alleen de records opgehaald worden als er in beiden tabellen een record gevonden wordt. (zeg ik het zo goed?)

Ik geef er de voorkeur aan om de primary keys gewoonweg 'id' te noemen omdat
a. doctrine dit ook doet. Ik werk veel met doctrine
b. ik dan direct weet dat het om de primary key gaat.
c. omdat het bij een resultset met meerdere id's ook geen probleem is maar dan moet je hem even een alias geven.

De auto-increament in resultaten is inderdaad overbodig dat had ik over het hoofd gezien :-)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

25/04/2014 21:57:45
Quote Anchor link
Frank Nietbelangrijk op 25/04/2014 21:11:23:

Ja ik weet dat er een inner join bestaat. Maar wellicht is het soms moeilijk om een keus te maken tussen left en inner. Misschien wil je hierover nog iets kwijt? Ik weet wel dat bij een innerjoin alleen de records opgehaald worden als er in beiden tabellen een record gevonden wordt. (zeg ik het zo goed?)

Je zegt het goed, bij en left join kan alles wat voor de join staat worden meegenomen, dit kan een (groot) verschil maken in de totale rijen die afgelopen moeten worden.
In dit specifieke geval:
- Zonder quiz bestaat er geen vraag.
- Zonder vraag bestaat er geen antwoord
- Een antwoord wat niet bestaat kan niet gegeven worden

Een left join kan onverwachte resultaten opleveren, maar een inner join niet en die is daarbij vaak sneller.

Quote:
Ik geef er de voorkeur aan om de primary keys gewoonweg 'id' te noemen omdat
a. doctrine dit ook doet. Ik werk veel met doctrine
b. ik dan direct weet dat het om de primary key gaat.
c. omdat het bij een resultset met meerdere id's ook geen probleem is maar dan moet je hem even een alias geven.

Is wat Docrtine doet heilig?
Ik vind het persoonlijk een slecht gebruik om indenty kolommen een zelfde naam te geven (sterker nog, als ik het voor het zeggen heb verbied ik het)
Gewijzigd op 25/04/2014 22:07:01 door Ger van Steenderen
 
Frank Nietbelangrijk

Frank Nietbelangrijk

25/04/2014 23:01:06
Quote Anchor link
Thanks Ger, duidelijke antwoorden. Ben wel blij dat je het niet allemaal voor t zeggen hebt :-)
 
Daniel ravenshorst

daniel ravenshorst

09/05/2014 12:49:58
Quote Anchor link
Super jullie hebben me echt geholpen.
Begrijp het ook steeds beter.
Ik wil iedereen bedanken voor de hulp :-)

Ik heb een aantal aanpassingen gedaan, en nog een aantal vragen..
Ik heb ten eerste in tabel vragen goed_antwoord op NULL gezet aangezien het niet altijd voorkomt dat er een goed antwoord is. maar meer een soort van enquete, en mijn vraag is als er bijvoorbeeld meerdere antwoorden mogelijk zijn, dus als checkbox ipv radio. hoe kan ik dit het beste opslaan, gewoon dubbel in de antwoorden zetten, dan zit ik namelijk dat een gebruiker_id er 2 x inkomt voor 1 vraag. gaat dit geen problemen veroorzaken?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

09/05/2014 18:29:28
Quote Anchor link
Goed als we willen dat sommige antwoorden als checkbox worden weergegeven dan moet je programma dit ook kunnen weten. Het meest handig lijkt mij om een kolom aan de tabel 'antwoorden' toe te voegen zodat je per antwoord kunt bepalen of dit een checkbox moet zijn ja dan nee. Zo zouden vragen zelfs antwoorden kunnen hebben met een checkox en radiobutton door elkaar heen.. Als je denkt dat dit NOOIT zal voorkomen kun je er voor kiezen om die extra kolom aan de tabel 'vragen' toe te voegen waardoor deze betrekking heeft op ALLE antwoorden van die vraag.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
ALTER TABLE antwoorden ADD checkbox BOOLEAN NOT NULL DEFAULT FALSE AFTER antwoord


Nu moeten we nog even naar de resultaten kijken.
In de oude situatie was er altijd één antwoord. Indien het nu allemaal checkboxen zijn dan kan het zijn dat er geen antwoord is gegeven (alle checkboxen uit), dat er één of meerdere checkboxen zijn aangevinkt.

Je kunt dan inderdaad in de tabel resultaten één record schrijven per aangevinkte checkbox. Wel moet je even in je achterhoofd onthouden dat het ook kan zijn dat een gebruiker helemaal geen checkbox selecteert en er in dat geval helemaal geen records toegevoegd (hoeven te) worden.
Gewijzigd op 09/05/2014 18:30:41 door Frank Nietbelangrijk
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/05/2014 19:46:19
Quote Anchor link
Persoonlijk zou ik dat niet met dezelfde tabellen oplossen.
Een quiz en een enquete zijn verschillende entiteiten, ze hebben wel overeenkomsten maar daar houdt het mee op.

Doe je het wel met één verzameling van tabellen kan je in de resultaten tabel geen primary key hebben over vraag_id en gebruiker_id, maar moet je daar het antwoord_id bij toevoegen.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.