Database structuur poll

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Koen Bokern

Koen Bokern

30/01/2008 13:17:00
Quote Anchor link
Hallo,

Ik ben bezig met een poll te schrijven. Het is de bedoeling dat er meerdere polls aanwezig kunnen zijn. Daarvoor wordt de database structuur ingewikkeld.
Zelf dacht ik al aan zoiets:


Table poll
- id
- poll_onderwerp
- datum
- poll_auteur
- poll_type ( meerkeuze/eenkeuze/janee )
- aantal_vragen


Maar dan moet ik in een andere tabel de data opslaan voor hoevaak er per antwoord is gestemd, en welke poll_antwoorden er mogelijk zijn om te kiezen. De php lukt me wel, echt heb ik geen idee hoe ik dergelijke dingen in een database opsla.

Heeft iemand wat tips?

Groet vlerk
 
PHP hulp

PHP hulp

22/12/2024 20:13:03
 
Frank -

Frank -

30/01/2008 13:25:00
Quote Anchor link
auteur komt vast uit een andere tabel, die zul je dus moeten koppelen.

Een poll is altijd een meerkeuze-poll, een poll met 1 antwoord is geen poll. ja/nee zijn bv. al 2 keuzes, maar je mag slechts 1 keuze maken, 1 antwoord geven. Het aantal vragen hoef je niet op te slaan, dat doe je al door de vragen in een tabel te zetten. Heb je 3 vragen, dan heb je 3 vragen. Ja toch? Zinloos om nog ergens te noteren dat het 3 vragen zijn.

Kortom, er missen in jouw opzetje nog wel een paar tabellen.
 
Gerben G

Gerben G

30/01/2008 13:37:00
Quote Anchor link
ik zou kiezen voor deze opzet
table poll
poll_id
poll_onderwerp
datum
auteur

table poll_keuze
keuze_id
poll_id
keuze
Gewijzigd op 01/01/1970 01:00:00 door Gerben G
 
Elwin - Fratsloos

Elwin - Fratsloos

30/01/2008 14:22:00
Quote Anchor link
En natuurlijk moet in de opzet van Donhertog nog de kolom 'geklikt' (of iets dergelijks) om bij te houden hoe vaak het antwoord gekozen.
 
Frank -

Frank -

30/01/2008 14:26:00
Quote Anchor link
Elwin schreef op 30.01.2008 14:22:
En natuurlijk moet in de opzet van Donhertog nog de kolom 'geklikt' (of iets dergelijks) om bij te houden hoe vaak het antwoord gekozen.
Ik zou reacties met ip-adressen in een aparte tabel opslaan, dan kun je altijd nog tellen hoevaak er is gereageerd. Tevens kun je nog veel afleiden van de reacties, dat gaat niet wanneer je alleen het aantal reacties opslaat.
 
Elwin - Fratsloos

Elwin - Fratsloos

30/01/2008 14:30:00
Quote Anchor link
Hoe je het ook oplost... in het schema van Donhertog mis je iets voor je antwoorden.
 
Gerben G

Gerben G

30/01/2008 14:39:00
Quote Anchor link
@Frank & Elwin
Dat klopt. Ik heb alleen maar een opzetje gemaakt voor de poll zelf niet voor de afhandeling daarvan. Maar volgens mij zou dit een goede uitbreiding zien:

table kliks
klik_id
poll_id
keuze_id
ip
 
Frank -

Frank -

30/01/2008 14:40:00
Quote Anchor link
Nog even een datumtijd erbij en het feest is compleet!
 
Koen Bokern

Koen Bokern

01/02/2008 11:59:00
Quote Anchor link
table poll
poll_id
poll_onderwerp
datum
auteur

table poll_keuze
keuze_id
poll_id
keuze

table poll_kliks
klik_id
poll_id
keuze_id
ip
datumtijd

Ik denk denk ik hiermee begin.

Maar hoe breng ik dit nu in de pratijk?

Met de table polls weergeef ik op de hoofdpagina dus alle polls.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$q
= mysql_query("SELECT * FROM `poll`");
while($list = mysql_fetch_array($q)) {
    echo $list['poll_onderwerp']." <br />";
   // nu nog de vragen echoen.
}
?>


Nu wil ik natuurlijk de vragen erbij weergeven. Hiervoor maak ik een inwendige query en while-lus.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$q2
= mysql_query("SELECT * FROM `poll_keuze` WHERE `poll_id` = '". $list['poll_id'] ."'");
while($lst = mysql_fetch_array($q2)) {
        echo '<input type="radio" name="keuze" value='..$lst['keuze'] .'">'.$lst['keuze'].'<br />';
}

?>


Uiteraard wil ik nog weten of de gebruiker nog niet heeft gestemd. Dit controlleer door de table poll_kliks erbij te betrekken. Dan wordt de eerste code ongeveer 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
<?php
$q
= mysql_query("SELECT o.poll_onderwerp, k.ip  FROM `poll` AS p LEFT JOIN `poll_kliks` AS k ");
while($list = mysql_fetch_array($q)) {
    echo $list['poll_onderwerp']." <br />";
    $qq = mysql_query("SELECT * FROM `poll_kliks` WHERE `poll_id` = '". $list['poll_id'] ."'");
    $totaal_aantal_keuze = mysql_num_rows($qq);
    echo $qq .' keer gestemd <hr />';
    $q2 = mysql_query("SELECT * FROM `poll_keuze` WHERE `poll_id` = '". $list['poll_id'] ."'");
    while($lst = mysql_fetch_array($q2)) {
       if($list['ip'] == getIP()) {
            echo '<input type="radio" name="keuze" value='..$lst['keuze'] .'">'.$lst['keuze'].'<br />';
       }
else {
       $q3 = mysql_query("SELECT * FROM `poll_kliks` WHERE `keuze_id` = '". $lst['keuze_id'] ."'");
       $aantal_keuzes = mysql_num_rows($q3);
       $percentage = $totaal_aantal_keuze / $aantal_keuzes * 100;
       echo $totaal_keuzes .' ( '. $percentage .'% )';    
       }
    }
}

?>


Ha zo meteen uit gaan testen in de praktijk. Wat kan ik hier nog aan verbeteren? Ik denk dat mysql_num_rows overbodig is. Dat ik gewoon SELECT COUNT ofzoiets kan doen. Maar dit is een begin.
 
Joren de Wit

Joren de Wit

01/02/2008 12:16:00
Quote Anchor link
1 ding dat je in ieder geval kunt verbeteren: backticks uit je queries verwijderen! Dat is rotzooi van MySQL en hoort niet thuis in een SQL query...
 
Jason de Ridder

Jason de Ridder

01/02/2008 12:48:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$sql
= " SELECT pk.keuze_id, pk.keuze, p.onderwerp, p.auteur, p.datum FROM poll_keuze pk ".
        " LEFT JOIN polls p ON p.poll_id = pk.poll_id " .
        " WHERE pk.poll_id = ( SELECT poll_id FROM polls WHERE onderwerp = 'Dit is een pollvaag') ";
?>


Zoiets ofzo, je kan natuurlijk in de WHERE van de subquery elke andere colum doorzoeken op een bepaalde waarde. Op auteur ofzo, maar als een auteur meer polls heeft gemaakt moet je 'WHERE poll_id =' veranderen in 'WHERE poll_id IN (...)'

Trouwens als je die JOIN gebruikt kan die subquery er ook wel uit volgens mij :)
Dan kan je direct zoeken in de WHERE p.onderwerp = 'Dit is een pollvaag'


Anyway success.....
 
Frank -

Frank -

01/02/2008 13:20:00
Quote Anchor link
@Jason: Maak het jezelf makkelijk en ga niet een query (of welke string dan ook) onderbreken met quotes en puntjes. Dat schiet niet op en kan alleen maar voor syntax-errors zorgen. Gewoon een enter is ook goed en een stuk overzichtelijker!

Zelfde query, zelfde string, maar dan in 1 oogopslag te begrijpen:
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
<?php
$sql
= "
SELECT
  pk.keuze_id,
  pk.keuze,
  p.onderwerp,
  p.auteur,
  p.datum
FROM
  poll_keuze pk
    LEFT JOIN polls p ON p.poll_id = pk.poll_id
WHERE
  pk.poll_id = (
    SELECT poll_id FROM polls WHERE onderwerp = 'Dit is een pollvaag'
  )
"
;
?>
 



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.