[PHP/MySQL] Ontwerp pollscript*

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik ben een beginnende PHP-noob en ik zit niet met zoveel ervaring als jullie. Momenteel ben ik bezig om een website te ontwerpen en zo een paar kunstjes aan te leren voor mezelf en ook wat meer ervaring op te doen. Maar nu zit ik met een probleem, ik zou namelijk een poll script willen maken met een archief en een onbeperkt aantal antwoorden. In mijn gedachten vormde zich een prachtig idee, namelijk om een id & subid te gaan gebruiken, om zo bvb 1.1, 1.2, 1.3, 1.4 etc te gaan bekomen.

Maar ik heb een probleem: Hoe zou ik ervoor kunnen zorgen dat alleen het laatste cijfer van id geselecteerd en weergegeven word? Dus bvb enkel poll 8 ipv poll 7,6,5 etc allemaal weer te geven. Eerst had ik gedacht om alle nr's 1 te nummeren van antwoorden( en dan dat nummer te selecteren), maar als er dan een poll zou moeten verwijderd worden zou er geen correcte versie meer geselecteerd worden.

Heeft iemand van jullie een oplossing voor dit probleem? Want dingen zoals hotscripts.com zijn wel met enkele serieuze fouten gemaakt, en daaraan zit ik dan langer te debuggen dan zelf een code te schrijven...

Alvast bedankt.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ik begrijp niet wat je bedoelt? Heb je zelf wel een goed beeld/overzicht van het datamodel dat je nodig hebt?

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voutloos schreef op zaterdag 09 april 2005 @ 00:03:
Ik begrijp niet wat je bedoelt? Heb je zelf wel een goed beeld/overzicht van het datamodel dat je nodig hebt?
Om even te verduidelijken, elke poll zou dus zijn eigen ID krijgen. dus poll 1,2,3,4,5,6,7 etc etc. Maar dan zou er ook nog een subid zijn voor de antwoorden(ook 1,2,3,4 etc), zodat deze ook gesorteerd worden. Dus poll 7 antwoord 1, poll 7 antwoord 2 etc word dan ge-echo'd uit de database ( als poll 7 de laatst toegevoegde poll is uiteraard ). Het probleem is enkel dat ik niet weet hoe ik enkel poll met eventueel ID 7 moet selecteren uit de database.

[ Voor 10% gewijzigd door Verwijderd op 09-04-2005 00:07 ]


Acties:
  • 0 Henk 'm!

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 16:30

TheDane

1.618

Volgens mij wil je een ander datamodel hebben.

Een iets minder brakke opzet zou dan zijn:

code:
1
2
3
4
5
table Antwoorden (
antwoordID int(10),
pollID int(10), 
antwoord varchar(100)
);


en dan een primary key op antwoordID,pollID

[ Voor 11% gewijzigd door TheDane op 09-04-2005 00:12 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
code:
1
2
3
SELECT veldjeshierinvullen
FROM TabelMetPolls
WHERE id=7;

Dus. En wat voor probleem heb je daarmee dan?

Geef eens wat code, een query (poging tot), een datamodel cq. info over je db, want ik kan alleen maar gokken nu.

Want mijn gok nu is dat je alles in 1 tabel probeert te kwakken. :P :>

{signature}


Acties:
  • 0 Henk 'm!

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Bedenk voor je zelf eventjes welke tabellen, met welke velden je wilt maken en schrijf dat gewoon eventjes ergens op :) Post dat voorbeeldje wat je op dat moment bedacht heeft eventjes hier :)

Verder - je laatste vraag ('Het probleem is enkel dat ik niet weet hoe ik enkel poll met eventueel ID 7 moet selecteren uit de database.') klinkt een beetje alsof je nog geen enkele ervaring hebt met SQL ? Als dat zo is, ben je vermoedelijk beter uit met een standaard SQL tutorial - http://www.w3schools.com/sql/default.asp is een hele basic SQL tutorial wat dat betreft :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
mijn code om te selecteren is
PHP:
1
2
$sql="SELECT * FROM poll ORDER BY id DESC";
$result = mysql_query($sql) or die(mysql_error());

Maar het probleem is dat er een soort van LIMIT moet opkomen, zodat er slechts 1 poll(de laatste, logish) wordt weergegeven maar toch al de antwoorden van die desbetreffende poll worden weergegeven. Met LIMIT 0,1 zou het iig niet werken, heb ik zelfs al geprobeerd :9

EDIT:
elevator schreef op zaterdag 09 april 2005 @ 00:12:
[...] klinkt een beetje alsof je nog geen enkele ervaring hebt met SQL ?
Ik heb wel al wat ervaring met wat betreft MySQL, ik heb nl al een nieuwssysteem, registratiesysteem en ( in progress ) loginsysteem ontworpen , welke werken :).

EDIT 2 : Mijn vragen & antwoorden staan al apart, maar er zijn nog altijd meerdere antwoorden...
Een tabel maken met 100 kollommen voor antwoorden lijkt me een beetje nutteloos >:)

[ Voor 46% gewijzigd door Verwijderd op 09-04-2005 00:24 ]


Acties:
  • 0 Henk 'm!

  • ludo
  • Registratie: Oktober 2000
  • Laatst online: 26-04-2024
Het beste is om de vragen en de antwoorden in aparte tabellen te zetten. En ik denk dat je inderdaad, zoals elevator al zei, het beste even een sql tutorial/boek kunt bekijken :) want het selecteren van de poll met vraag en antwoord hoeft niet ingewikkeld te zijn.

[ Voor 20% gewijzigd door ludo op 09-04-2005 00:21 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
TheDane geeft je een tabel cadeau die je gewoon nodig hebt. MySQL is een relationele database, als je 1 tabel hebt, kan je net zo goed geen database hebben, ben je met te grof geschut bezig, of heb je een brak datamodel :> Probeer de filosofie achter TheDane's voorgestelde extra tabel te begrijpen en je bent een heel stuk verder met hoe je een database opzet.

De relevante tupels uit de Antwoorden tabel vissen moet je wel lukken. ;)

[ Voor 3% gewijzigd door Voutloos op 09-04-2005 00:25 ]

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat zou ik wel willen, maarzoals eerder vermeld, mijn idee om elk eerste antwoord op te tellen en dan die nr van poll te selecteren zou wel werken, maar als ik een poll zou deleten zou er steeds een poll vroeger weergegeven worden. Dat zou niet zo handig zijn hé _/-\o_ , daarom was mijn vraag of iemand niets alternatiefs & beter heeft dan dit :9

[ Voor 13% gewijzigd door Verwijderd op 09-04-2005 00:39 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op zaterdag 09 april 2005 @ 00:18:
EDIT 2 : Mijn vragen & antwoorden staan al apart, maar er zijn nog altijd meerdere antwoorden...
Een tabel maken met 100 kollommen voor antwoorden lijkt me een beetje nutteloos >:)
Dit is je belangrijkste opmerking in dit topic. Je hebt volkomen gelijk: je wilt inderdaad geen 100 kolommen.

Je moet juist honderd rijen maken in de tabel Antwoorden (indien er zoveel antwoorden zijn :+ Als een poll 5 mogelijke antwoorden heeft, maak je er 5 :) )

Jij ziet gewoon totaal (nog) niet in wat de kracht is van een relationele database. Verplicht leeswerk is uitzoeken wat 1:1 en 1:N relaties zijn. Vooral die laatste: 1 poll heeft n antwoorden.

[ Voor 10% gewijzigd door Voutloos op 09-04-2005 00:41 ]

{signature}


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ok, van je laatste post kan ik geen chocola maken. :P Ik verveel me, dus ik zal e.e.a. voor je uitwerken. :)

Maak eerst een tabel "Antwoorden" volgens het model van TheDane, met nog een extra veld voor het aantal stemmen dat dat antwoord gekregen heeft. Verder heb je een tabel "Polls" nodig, ik stel voor met de velden "id" (int) en vraag (varchar). In beide tabellen zijn de id-velden primary key, en in de antwoordtabel staat een "pollID", wat een foreign key is naar de poll-tabel.

Om de laatste poll op te vragen, doe je een query als deze:
SQL:
1
2
3
4
5
SELECT     *
FROM       antwoorden
INNER JOIN polls
ON         antwoorden.pollid = polls.id
WHERE      polls.id = MAX(polls.id)

Disclaimer: ongetest.

[ Voor 4% gewijzigd door NMe op 09-04-2005 00:46 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op zaterdag 09 april 2005 @ 00:28:
Dat zou ik wel willen, maarzoals eerder vermeld, mijn idee om elk eerste antwoord op te tellen en dan die nr van poll te selecteren zou wel werken, maar als ik een poll zou deleten zou er steeds een poll vroeger weergegeven worden. Dat zou niet zo handig zijn hé _/-\o_ , daarom was mijn vraag of iemand niets alternatiefs & beter heeft dan dit :9
Als je nou gewoon apart een tabel maakt per poll en dan een tabel voor de antwoorden, zoals al wordt voorgesteld. Dan kun je netjes een poll selecteren en daar de antwoorden bij zoeken. En bij het verwijderen kan je dan eers netjes de antwoorden weggooien en daarna de poll zelf bijvoorbeeld.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Zie Nme,

een mogelijk inhoud van de database op tijdstip X:
Polls:
PollIdTitel
1Mijn 1e poll: Leuk?
2Mijn 2e poll: Leuker?

Elke poll heeft maar 1 titel en staat exact 1x in deze tabel. PollId is dus uniek.

Antwoorden:
PollIdAntwoordidAntwoordAantalStemmen
11Nee3
12Ja7
21Nee3
22Ja6
23Een beetje8
24Even leuk1

Hier is elke combi van PollId en AntwoordId uniek.

Redenen voor 2 tabellen:
• Je huidige probleem
• De reeds genoemde 1:N relatie.
• Als je 1 grote tabel maakt met wel een rij voor elk antwoord heb je een kolom met telkens de polltitel erin nodig, dit leidt tot het opslaan van dubbele informatie (databasejargon: redundantie) bij meer dan 1 antwoord.
• Als je 1 grote tabel maakt maar met maar 1 rij voor een poll en heb je een lelijk aantal kolommen nodig welke bij kleine polls niet gebruikt worden.

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok, uit jullie posts heb ik een soort oplossing samengesteld:
Het antwoord krijgt hetzelfde ID als de poll antwoorden, dus zal ik eerst een query maken van de vragen met een limiet van 1 vraag, en dan alle antwoorden selecteren waar het desbetreffende ID van de vraag gelijk is aan het ID van de antwoorden. Dus als het ID van de nieuwste vraag 8 is zal elke vraag ook geselecteerd worden met hetzelfde ID. Bedankt allemaal voor jullie hulp & tijd _/-\o_ _/-\o_ _/-\o_ !

[ Voor 5% gewijzigd door Verwijderd op 09-04-2005 01:17 . Reden: typo's ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom 2 queries? Het werkt wel, maar eentje volstaat volgens mij ook wel. (Zie mijn vorige post.)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
-NMe- schreef op zaterdag 09 april 2005 @ 01:39:
Waarom 2 queries? Het werkt wel, maar eentje volstaat volgens mij ook wel. (Zie mijn vorige post.)
Met het command JOIN heb ik nog niet gewerkt, maar ik zal het eens proberen; alles ten voordele van de performance :9 >:)

Nogmaals bedankt.

Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
Verwijderd schreef op zaterdag 09 april 2005 @ 12:34:
[...]

Met het command JOIN heb ik nog niet gewerkt, maar ik zal het eens proberen; alles ten voordele van de performance :9 >:)

Nogmaals bedankt.
In de FAQ van hier staat hoe joins werken best goed uitgelegd :)

Overigens kan je volgens mij ook gewoon zonder join werken hier toch? :)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

pierre-oord schreef op zaterdag 09 april 2005 @ 14:25:
Overigens kan je volgens mij ook gewoon zonder join werken hier toch? :)
Zonder join werken kan altijd, maar wanneer je op een simpele manier een extra query kan besparen, dan lijkt me dat wel gewenst. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ludo
  • Registratie: Oktober 2000
  • Laatst online: 26-04-2024
pierre-oord schreef op zaterdag 09 april 2005 @ 14:25:
Overigens kan je volgens mij ook gewoon zonder join werken hier toch? :)
Niet als je het met één query op wilt lossen :)

edit: -NMe- wint, hij was sneller ;)

[ Voor 11% gewijzigd door ludo op 09-04-2005 14:32 ]

Pagina: 1