Het maken van 'Rate / stem systeem' probleem
Ik ben bezig met een item database met informatie over bepaalde items, en daarbij wil ik het mogelijk maken voor bezoekers om te stemmen op items, zodat het mogelijk word om te bepalen wat de meest gewilde / populaire items zijn.
Nu heb ik het database in orde, al weet ik niet als alles correct is aangegeven.
En zit met het volgende probleem, ik weet niet hoe ik het moet schrijven naar de database.
Ik had ooit een script gezien die schreef het als volgt naar de database "5,5,1,4" (dat zijn de gegeven cijfers) en op een of ander manier last hij het als één geheel. Ik zou graag willen hebben, dat je als eind resultaat op de website bijv dit krijgt "7,5".
Heeft er iemand verstand / ervaring met ratings?
Alvast bedankt.
Groetjes,
Marco
Extra info:
Item_id moet hoort zonder A.I., aangezien alle items al in het database staan, en degene die stemt, update als ware alleen maar een row.
Gewijzigd op 12/05/2013 19:25:13 door Marco Eilander
Gewijzigd op 12/05/2013 19:31:54 door Michael R
Michael R op 12/05/2013 19:26:13:
je moet geen int gebruiken maar double. En bijv. geen 1,7 maar 1.7
Bedankt, hoe kan ik het opslaan?
Ik krijg namelijk dit :
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') NOT NULL' at line 1
Gewijzigd op 12/05/2013 19:36:41 door Michael R
Michael R op 12/05/2013 19:35:51:
lengte/waarden moet leeg zijn
Ik kom er nog niet uit.
Nu krijg ik dus enkel alleen resultaten zoals dit : 7.1
Wat ik graag wil is dat als er bijv 3 mensen stemmen :
persoon 1 stemt : 10
persoon 2 stemt : 5
persoon 3 stemt : 1
Dan heb ik dat het zo in de database komt : 10,5,1 en dat er via PHP een berekening word gemaakt : 10+5+1 / 3(aantal personen die stemde) = het cijfer.
rating + 10 = 10
rating + 5 = 15
rating + 1 = 16
rating = 16
rating / aantal colommen = antwoord
maar dan in php code natuurlijk
of zoiets. Wel moet je een (koppel)tabel vote_table aanleggen tussen je item-tabel en je user-tabel, waarin je alle votes bijhoudt. Als ik de oorspronkelijke post bekijk, lijkt het dat daarin nu niet wordt voorzien.
Gewijzigd op 12/05/2013 23:26:16 door Willem vp
en zodra je meerdere waardes in 1 veld opslaat weet je dat je moet gaan normalizeren en 3 tabellen moet maken: user, vote en user_vote.
Wouter J op 12/05/2013 23:26:49:
en zodra je meerdere waardes in 1 veld opslaat weet je dat je moet gaan normalizeren en 3 tabellen moet maken: user, vote en user_vote.
Aanvulling:
Als je user_id, item_id en vote in 1 tabel opslaat, zit je in BCNV, aangezien het niet-sleutelattribuut 'vote' alleen informatie bevat over de gehele primare sleutel (user_id + item_id).
Verder normaliseren dan BCNV lijkt me in dit geval niet erg nuttig.
Ook zou ik 'rating' niet als veld in de database opnemen, aangezien dat een waarde is die berekend wordt.
Gewijzigd op 13/05/2013 00:14:40 door Willem vp
@ erwin waar is de : voor ?
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
/**
* Als we er vanuit gaan dat $pdo een database connectie is. Zie
* http://php.net/manual/en/book.pdo.php of http://www.php.net/manual/en/pdostatement.execute.php
*/
$sth = $pdo->prepare('SELECT ... FROM ... WHERE id = :id');
$sth->execute(array(':id' => 1000));
?>
/**
* Als we er vanuit gaan dat $pdo een database connectie is. Zie
* http://php.net/manual/en/book.pdo.php of http://www.php.net/manual/en/pdostatement.execute.php
*/
$sth = $pdo->prepare('SELECT ... FROM ... WHERE id = :id');
$sth->execute(array(':id' => 1000));
?>
Je zou ook bind param kunnen gebruiken. Maar dat kun je verder lezen op de officiële PHP website. Als je gewoon mysql gebruikt moet je dat dus veranderen met het volgende.
Erwin H op 13/05/2013 11:18:24:
Een andere optie, als je niet geinteresseerd bent wie precies een stem hebben uitgebracht, is om in twee kolommen het totaal en het aantal bij te houden.
Dat heeft wel als consequentie dat gebruikers meerdere keren kunnen stemmen op hetzelfde item.
- Roland - op 13/05/2013 11:39:12:
@ erwin waar is de : voor ?
Zie het als een placeholder (wat het ook daadwerkelijk is). In je uiteindelijke query behoort daar een waarde te komen. Dit kan middels een parameter via een prepared statement, het kan dat je er direct een waarde in plaatst via een php variabele.
Toevoeging op 13/05/2013 12:03:44:
Willem vp op 13/05/2013 12:02:26:
Dat heeft wel als consequentie dat gebruikers meerdere keren kunnen stemmen op hetzelfde item.
Erwin H op 13/05/2013 11:18:24:
Een andere optie, als je niet geinteresseerd bent wie precies een stem hebben uitgebracht, is om in twee kolommen het totaal en het aantal bij te houden.
Dat heeft wel als consequentie dat gebruikers meerdere keren kunnen stemmen op hetzelfde item.
Dat klopt, net zoals in de oorsponkelijke post van de TS, dus blijkbaar is dat geen probleem.
Willem vp:
Als je user_id, item_id en vote in 1 tabel opslaat, zit je in BCNV, aangezien het niet-sleutelattribuut 'vote' alleen informatie bevat over de gehele primare sleutel (user_id + item_id).
Verder normaliseren dan BCNV lijkt me in dit geval niet erg nuttig.
Verder normaliseren dan BCNV lijkt me in dit geval niet erg nuttig.
Ik denk dat je zelfs al in 5NF zit, dus zou je nog naar 6NF kunnen?
Nee.
Bedankt allemaal voor het mee denken en helpen.
Groeten,
Marco