Het maken van 'Rate / stem systeem' probleem

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Marco Eilander

Marco Eilander

12/05/2013 19:22:01
Quote Anchor link
Hallo,

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.
Afbeelding

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
 
PHP hulp

PHP hulp

27/04/2024 01:01:37
 
Michael R

Michael R

12/05/2013 19:26:13
Quote Anchor link
je moet geen int gebruiken maar double. En bijv. geen 1,7 maar 1.7
Gewijzigd op 12/05/2013 19:31:54 door Michael R
 
Marco Eilander

Marco Eilander

12/05/2013 19:34:28
Quote Anchor link
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
 
Michael R

Michael R

12/05/2013 19:35:51
Quote Anchor link
lengte/waarden moet leeg zijn
Gewijzigd op 12/05/2013 19:36:41 door Michael R
 
Marco Eilander

Marco Eilander

12/05/2013 19:49:29
Quote Anchor link
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.
 
Michael R

Michael R

12/05/2013 19:52:45
Quote Anchor link
dan doe je dus

rating + 10 = 10
rating + 5 = 15
rating + 1 = 16

rating = 16
rating / aantal colommen = antwoord

maar dan in php code natuurlijk
 
Willem vp

Willem vp

12/05/2013 23:21:06
Quote Anchor link
Waarom zo moeilijk doen in PHP? Gewoon in SQL oplossen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT AVG(*) AS rating
FROM vote_table
WHERE item_id = $itemid
GROUP BY item_id

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
 
Wouter J

Wouter J

12/05/2013 23:26:49
Quote Anchor link
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.
 
Willem vp

Willem vp

13/05/2013 00:11:42
Quote Anchor link
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 H

Erwin H

13/05/2013 11:18:24
Quote Anchor link
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. Bij elke stem tel je de waarde van de stem bij het totaal op en hoog je het aantal met 1 op. Wil je dan later het gemiddelde hebben dan kan je gewoon het totaal door het aantal delen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
UPDATE vote_table
SET totaal = totaal + :stem_waarde,
  aantal = aantal + 1
WHERE item_id = :item_id

SELECT totaal/aantal AS rating
FROM vote_table
WHERE item_id = :item_id
 
- Roland -

- Roland -

13/05/2013 11:39:12
Quote Anchor link
@ erwin waar is de : voor ?
 

13/05/2013 12:00:32
Quote Anchor link
Dat is al je PDO gebruikt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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));

?>

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.
Gewijzigd op 13/05/2013 12:03:46 door
 
Willem vp

Willem vp

13/05/2013 12:02:26
Quote Anchor link
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.
 
Erwin H

Erwin H

13/05/2013 12:02:35
Quote Anchor link
- 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:
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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

13/05/2013 18:11:31
Quote Anchor link
Het was geen probleem in ieder geval, maar misschien gaat TS er nu anders over denken ;-)

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.

Ik denk dat je zelfs al in 5NF zit, dus zou je nog naar 6NF kunnen?
Nee.
 
Marco Eilander

Marco Eilander

14/05/2013 23:59:04
Quote Anchor link
Het is inmiddels gelukt! :)

Bedankt allemaal voor het mee denken en helpen.

Groeten,
Marco
 



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.