Bewertungssystem
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anzahl
bewertung
datei
datenbank
datum
fehler
gesamtzahl
jahr
jemand
leute
machen
million
monat
nehmen
server
sperre
statistik
stern
tabelle
video
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
was genau möchtest du wissen
-wie man ein bewertungsformular macht oder oder wie man die sternchenanzeige macht oda was -
das ist Logik... man kann es in eine einfache datei packen... nach dem system:
n_1stern:n_2stern:n_3stern...
dann machst du den doppelpunkt als trennzeichen, ziehst dir den string zählst du hoch und setzt den dann wieder zusammen...
wenn du sowieso shcon eine Datenbank drin hast, machst du einfach 2 spalten. einmal summierst du die sterne und bei der anderen Spalte zählst du die anzahl der bewertung... der rest läuft über einen einfachen Mittelwert... das wäre das einfachste System..., wo du nciht weißt, wie oft welcher stern gewählt wurde, sondern nur, wie der schnitt ist... dafür ist das hocheffizient^^ -
bauernhof-game schrieb:
was genau möchtest du wissen
-wie man ein bewertungsformular macht oder oder wie man die sternchenanzeige macht oda was
Logischer Weise will er beides. Eins ohne das andere bringt wenig.
Also du erstellst eine PHP-Datei. Da kommt deine bisherige Seite rein. Falls deine bisherige Seite auf *.html endet, einfach aus ".html" ".php" machen. Dann möchtest du, dass man die Sterne anklicken kann. Dazu verlinkst du jeden Stern mit der Datei, in der du arbeitest, aber immer mit einer anderen GET-Variable. Wenn die Get-Variable gegeben ist, lässt du prüfen, ob der übergebene Wert eine Zahl ist, positiv ist, ganz ist (keine Kommastellen) und unter 5 liegt. Ist das alles der Fall, trägt das Script in eine Datenbanktabelle, die du noch erstellen musst die Bewertung, die IP des Users und die Video-ID ein. Soweit zur Eintragung.
Die Anzeige ist viel einfacher. Du liest die Tabelle aus (WHERE-Begindung verwenden, damit nur die Bewertungen über das Video rauskommen, das geschaut wird), addierst allle Bewertungen zusammen, zählst, wie viele Einträge es sind, und teilst die Summe durch die Anzahl.
Ich hoffe, das hilft dir.
Edit: @Sebulon: Dann hast du die Information, dass 5 Leute ihre Bewertung abgegeben haben, und dass der Schnitt bei 3,7 liegt. Der 6. User bewertet mit 4 Sternen. Wie rechnest du jetzt den neuen Druchschnitt aus? Dann muss man erst die 3,7 mal 5 nehmen, die 4 dazu zählen, das Ergebnis wieder durch 6 teilen, und dann in die DB eintragen, bessergesagt garnicht eintragen, sondern updaten.
mfg drafed-map
Beitrag zuletzt geändert: 11.11.2009 14:58:22 von drafed-map -
etwas anders:
das formular ist ganz einfach:
radio buttons und dann submit
dann kanst du mit php ohne probleme die daten in eine datei oder datenbank schreiben
das auswertundsformlar kannst du dann machen in dem du alle sterne zusammenzählst, durch die anzahl der bewertungen teilst und das dann gerundet ausgeben
die sterne sind dann grafiken, die du mit einer schleife machen kannst
kapiert?
sonst frag einfach nach -
drafed-map schrieb:
bauernhof-game schrieb:
was genau möchtest du wissen
-wie man ein bewertungsformular macht oder oder wie man die sternchenanzeige macht oda was
Logischer Weise will er beides. Eins ohne das andere bringt wenig.
Also du erstellst eine PHP-Datei. Da kommt deine bisherige Seite rein. Falls deine bisherige Seite auf *.html endet, einfach aus ".html" ".php" machen. Dann möchtest du, dass man die Sterne anklicken kann. Dazu verlinkst du jeden Stern mit der Datei, in der du arbeitest, aber immer mit einer anderen GET-Variable. Wenn die Get-Variable gegeben ist, lässt du prüfen, ob der übergebene Wert eine Zahl ist, positiv ist, ganz ist (keine Kommastellen) und unter 5 liegt. Ist das alles der Fall, trägt das Script in eine Datenbanktabelle, die du noch erstellen musst die Bewertung, die IP des Users und die Video-ID ein. Soweit zur Eintragung.
Die Anzeige ist viel einfacher. Du liest die Tabelle aus (WHERE-Begindung verwenden, damit nur die Bewertungen über das Video rauskommen, das geschaut wird), addierst allle Bewertungen zusammen, zählst, wie viele Einträge es sind, und teilst die Summe durch die Anzahl.
Ich hoffe, das hilft dir.
Edit: @Sebulon: Dann hast du die Information, dass 5 Leute ihre Bewertung abgegeben haben, und dass der Schnitt bei 3,7 liegt. Der 6. User bewertet mit 4 Sternen. Wie rechnest du jetzt den neuen Druchschnitt aus? Dann muss man erst die 3,7 mal 5 nehmen, die 4 dazu zählen, das Ergebnis wieder durch 6 teilen, und dann in die DB eintragen, bessergesagt garnicht eintragen, sondern updaten.
mfg drafed-map
total falsch.
Das Summenfeld bleibt summenfeld... die eine Rechnung kann man über PHP machen... das ist kein aufwand... man speichert keine errechneten Werte in eine Datenbank, sondern die originaldaen, ausdenen sich alles errechnet!!! man kann dann notfalls eine Abfrage machen, die den errechneten wert ausspuckt... aber man weiß halt nicht welcher wert wie oft vorkam... -
Ich habe ein optisch sehr ansprechendes Star Rating gefunden, welches auch "halbe" Sterne mittels CSS anzeigt.
http://www.komodomedia.com/blog/2006/01/css-star-rating-part-deux/,
Dort sind mehrere vorgestellt und auch die Funktionsweise. Mir gefällt das hier am besten: http://www.komodomedia.com/samples/star_rating/example2.htm
Egal wie Du abspeicherst: Meiner Meinung nach solltest Du einmal die Summe aller Werte (also unberechnet) und einmal die Anzahl aller Stimmen abspeichern.
Beispiel: 5 Leute bewerten mit 4, 1 berwertet mit 3, 1 mit 5 Sternen --> (5*4)+3+5 = 28, insgesamt haben 7 Besucher abgestimmt.
In dem obigen Beispiel (Link 2) sind alle Sternchen 25 Pixel breit. Bei der Anzeige musst du nur noch den Wert und die Gesamtbreite über alle Sterne errechnen.
in meinem Code steht die Gesamtzahl (hier 28) in $bildbewertung[0] und die Anzahl der Abstimmungen (hier 7) in $bildbewertung[1]
usw.$sternbreite = 25; $ausgabe .= "<ul class='star-rating'><li class='current-rating' sttyle='width:".@ceil(($bildbewertung[0]/$bildbewertung[1]*$sternbreite))."px;'></li>\n;
-
Sorry, ich meinte dasvon drafed map... man speichert doch keine zwischenwerte in einer Datenbank, wenn man die originaldaten hat... Mit so einem Vorgehen riskiert man eine inkonsistende Datenbank... und da ist im Prinzip der Super-GAU...
Sollte man sich als Grundsatz immer im Hinterkopf halten... hab schon richtig schlimme Datenbanken gesehen, vor allem auf Arbeit... wenn ihr wüsstet, um was für daten es sich handelt, würdet ihr ganz grün und blau werden... -
Ich speichere bei solchen Dingen immer alle Daten (z.B. Datum und IP des Users) in seperaten verknüpften Tabellen. Dazu gibt es 4 Gründe:
1. Nachträgliche Statistikentscheidungen: Wenn du dich im Laufe der Zeit dafür entscheidest, auch Tage- , Wochen- , Monats- und Jahres-Statistiken herauszugeben.
2. IP-Sperre: Willst du etwa, dass jemand ununterbrochen bewerten kann? So muss es immerhin pausen geben, und nach kurzer Zeit geht es dem Spammer auf die Nerven.
3. Technische Probleme: Wenn du einen Fehler im Script hast, der dir die Gesamtzahl verhaut, kann dir das bei einzelnen Werten nicht passieren, da die alten nie verändert werden.
4. Streitfälle: Behauptet der Ersteller eines Videos, er habe gestern noch eine völlig andere Statistik gehabt, kannst du ihm zeigen, und ihn auch nachrechnen lassen, wie das verlaufen ist. -
drafed-map schrieb:
Ich speichere bei solchen Dingen immer alle Daten (z.B. Datum und IP des Users) in seperaten verknüpften Tabellen. Dazu gibt es 4 Gründe:
1. Nachträgliche Statistikentscheidungen: Wenn du dich im Laufe der Zeit dafür entscheidest, auch Tage- , Wochen- , Monats- und Jahres-Statistiken herauszugeben.
2. IP-Sperre: Willst du etwa, dass jemand ununterbrochen bewerten kann? So muss es immerhin pausen geben, und nach kurzer Zeit geht es dem Spammer auf die Nerven.
3. Technische Probleme: Wenn du einen Fehler im Script hast, der dir die Gesamtzahl verhaut, kann dir das bei einzelnen Werten nicht passieren, da die alten nie verändert werden.
4. Streitfälle: Behauptet der Ersteller eines Videos, er habe gestern noch eine völlig andere Statistik gehabt, kannst du ihm zeigen, und ihn auch nachrechnen lassen, wie das verlaufen ist.
Wenn du es so fett aufziehen willst, solltest du allein für das bewertungssystem einen eigenen Hoster nehmen... wenn du mitloggen willst, wer wo gevotet hat, mit IP, Datum... rath fatz bist du bei meherern Millionen einträgen im Monat, je nach frequentierung der Seite... -
sebulon schrieb:
drafed-map schrieb:
Ich speichere bei solchen Dingen immer alle Daten (z.B. Datum und IP des Users) in seperaten verknüpften Tabellen. Dazu gibt es 4 Gründe:
1. Nachträgliche Statistikentscheidungen: Wenn du dich im Laufe der Zeit dafür entscheidest, auch Tage- , Wochen- , Monats- und Jahres-Statistiken herauszugeben.
2. IP-Sperre: Willst du etwa, dass jemand ununterbrochen bewerten kann? So muss es immerhin pausen geben, und nach kurzer Zeit geht es dem Spammer auf die Nerven.
3. Technische Probleme: Wenn du einen Fehler im Script hast, der dir die Gesamtzahl verhaut, kann dir das bei einzelnen Werten nicht passieren, da die alten nie verändert werden.
4. Streitfälle: Behauptet der Ersteller eines Videos, er habe gestern noch eine völlig andere Statistik gehabt, kannst du ihm zeigen, und ihn auch nachrechnen lassen, wie das verlaufen ist.
Wenn du es so fett aufziehen willst, solltest du allein für das bewertungssystem einen eigenen Hoster nehmen... wenn du mitloggen willst, wer wo gevotet hat, mit IP, Datum... rath fatz bist du bei meherern Millionen einträgen im Monat, je nach frequentierung der Seite...
Wenn er wirklich ein großes Projekt vorhat, wird er früher oder später seinen eigenen Server kaufen/Mieten. Des weiteren besteht ein Datum (wozu ich aus mehreren Gründen das Timestamp verwende) aus 10 Bytes. Die IP besteht aus maximal 15 Bytes, häufig aber weniger. Die Bewertung braucht nochmal ein Byte. Dann sind wir bei 26 Bytes. Weil MySQL ja auch die Spalten zuordnen muss nehmen wir mal 35 Bytes. Wenn jetzt 1.000 Leute eine Bewertung abgeben sind wir bei 35kb. Ist das so viel? -
drafed-map schrieb:
sebulon schrieb:
drafed-map schrieb:
Ich speichere bei solchen Dingen immer alle Daten (z.B. Datum und IP des Users) in seperaten verknüpften Tabellen. Dazu gibt es 4 Gründe:
1. Nachträgliche Statistikentscheidungen: Wenn du dich im Laufe der Zeit dafür entscheidest, auch Tage- , Wochen- , Monats- und Jahres-Statistiken herauszugeben.
2. IP-Sperre: Willst du etwa, dass jemand ununterbrochen bewerten kann? So muss es immerhin pausen geben, und nach kurzer Zeit geht es dem Spammer auf die Nerven.
3. Technische Probleme: Wenn du einen Fehler im Script hast, der dir die Gesamtzahl verhaut, kann dir das bei einzelnen Werten nicht passieren, da die alten nie verändert werden.
4. Streitfälle: Behauptet der Ersteller eines Videos, er habe gestern noch eine völlig andere Statistik gehabt, kannst du ihm zeigen, und ihn auch nachrechnen lassen, wie das verlaufen ist.
Wenn du es so fett aufziehen willst, solltest du allein für das bewertungssystem einen eigenen Hoster nehmen... wenn du mitloggen willst, wer wo gevotet hat, mit IP, Datum... rath fatz bist du bei meherern Millionen einträgen im Monat, je nach frequentierung der Seite...
Wenn er wirklich ein großes Projekt vorhat, wird er früher oder später seinen eigenen Server kaufen/Mieten. Des weiteren besteht ein Datum (wozu ich aus mehreren Gründen das Timestamp verwende) aus 10 Bytes. Die IP besteht aus maximal 15 Bytes, häufig aber weniger. Die Bewertung braucht nochmal ein Byte. Dann sind wir bei 26 Bytes. Weil MySQL ja auch die Spalten zuordnen muss nehmen wir mal 35 Bytes. Wenn jetzt 1.000 Leute eine Bewertung abgeben sind wir bei 35kb. Ist das so viel?
Oben war noch was mit username die rede... da kommen nochmal 20 byte dazu... und schon sind wir bei 55KB pro 1000 Votes... es sei denn, du machst ie user in eine andere spalte, dann reichen 4 Bytes für die Userid als...
ich hab übrigens von 1000000 gesprochen... da sieht es etwas anders aus... ich weiß, wie träge 6GB große datenbanken sind... wenn du es für mehrere Jahre speicherst, kommen solche Datenmengen zusammen... denn dann musst du es für die Lebenszeit der Objekte aufbewahren... -
sebulon schrieb:
drafed-map schrieb:
sebulon schrieb:
drafed-map schrieb:
Ich speichere bei solchen Dingen immer alle Daten (z.B. Datum und IP des Users) in seperaten verknüpften Tabellen. Dazu gibt es 4 Gründe:
1. Nachträgliche Statistikentscheidungen: Wenn du dich im Laufe der Zeit dafür entscheidest, auch Tage- , Wochen- , Monats- und Jahres-Statistiken herauszugeben.
2. IP-Sperre: Willst du etwa, dass jemand ununterbrochen bewerten kann? So muss es immerhin pausen geben, und nach kurzer Zeit geht es dem Spammer auf die Nerven.
3. Technische Probleme: Wenn du einen Fehler im Script hast, der dir die Gesamtzahl verhaut, kann dir das bei einzelnen Werten nicht passieren, da die alten nie verändert werden.
4. Streitfälle: Behauptet der Ersteller eines Videos, er habe gestern noch eine völlig andere Statistik gehabt, kannst du ihm zeigen, und ihn auch nachrechnen lassen, wie das verlaufen ist.
Wenn du es so fett aufziehen willst, solltest du allein für das bewertungssystem einen eigenen Hoster nehmen... wenn du mitloggen willst, wer wo gevotet hat, mit IP, Datum... rath fatz bist du bei meherern Millionen einträgen im Monat, je nach frequentierung der Seite...
Wenn er wirklich ein großes Projekt vorhat, wird er früher oder später seinen eigenen Server kaufen/Mieten. Des weiteren besteht ein Datum (wozu ich aus mehreren Gründen das Timestamp verwende) aus 10 Bytes. Die IP besteht aus maximal 15 Bytes, häufig aber weniger. Die Bewertung braucht nochmal ein Byte. Dann sind wir bei 26 Bytes. Weil MySQL ja auch die Spalten zuordnen muss nehmen wir mal 35 Bytes. Wenn jetzt 1.000 Leute eine Bewertung abgeben sind wir bei 35kb. Ist das so viel?
Oben war noch was mit username die rede... da kommen nochmal 20 byte dazu... und schon sind wir bei 55KB pro 1000 Votes... es sei denn, du machst ie user in eine andere spalte, dann reichen 4 Bytes für die Userid als...
ich hab übrigens von 1000000 gesprochen... da sieht es etwas anders aus... ich weiß, wie träge 6GB große datenbanken sind... wenn du es für mehrere Jahre speicherst, kommen solche Datenmengen zusammen... denn dann musst du es für die Lebenszeit der Objekte aufbewahren...
Ich möchte dich daran erinnern, dass es einen kleinen Unterscheid zwischen 35MB (ich denke, er will auch unregistrierte User voten lassen, wenn man nur registrierte lassen würde, währe das schlech für das Image der Seite, und die IP-Sperre währe überflüssig) und 6GB. Die 35 MB treten aber nur bei einer Million Votes ein, dazu braucht es einige tausend täglich aktive User, die muss man erstmal zusammen bekommen. Wenn man die hat, und keinen eigenen Server hat, fange ich an, mich zu fragen, die viele GB Traffic die Videos ziehen. Gut, Videos sind sehr unterscheidlich, aber wenn wir mal als Wert 10MB nehmen (das ist doch wirklich nicht zu viel, oder?), dann würde die Zahl der User, die 35MB Datenbank für das Voting braucht einen Traffic von 1TB ziehen. Und es bewertet bei weitem nicht jeder jedes Video, das er sich ansieht. Unter 10 TB Traffic kommt man da nicht weg. Und wenn 35MB einer Million User entsprechen, dann sind diese 6GB die du erwähnt hast schon mal 171 Mio User-Votings. Das sind dann entsprechend der Rechnung zuvor *rechen* 1.710 TB Traffic. Auf Lima. Das entspricht 8.965.325 mal dem 200MB Download-Server-Paket. Sorry, aber ich denke, du hast da einen logischen Fehler in deiner Rechnung.
Edit: Des Weiteren schlage ich vor, dass wir diese Diskussion -falls noch Diskussionsbedarf bestehen sollte- per PN, E-Mail oder Jabber weiterführen. Wir können das Diskussionsergebnis dann hier ins Forum schreiben, aber momentan weicht das sehr von der Fragestellung und damit der eigentlichen Diskussionsgrundlage dieses Themas ab.
Beitrag zuletzt geändert: 11.11.2009 18:05:41 von drafed-map -
So, ich möchte auch mal Stellung zu der Sache nehmen:
Ich gebe drafed-map vollständig und einschränkungslos Recht.
Ein Rating hat nicht manipulierbar zu sein. D.h., dass jede IP maximal ein Voting pro Video haben darf.
Ob die Datumsspeicherung notwendig ist, das bezweifle ich (außer in externen Tabellen als Flooding Schutz, direkt im Rating nicht unbedingt.)
Das würde für mich folgende Tabellenstruktur ergeben:
video_id als mediumint
rating als tinyint
ip als irgendwas (char ist ineffektiv, dafür einfacher zu handhaben)
Mit PRIMARY( video_id , ip ).
Dann, fürs auslesen:
SELECT AVG(rating) as avg
FROM ratings
GROUP BY video_id
HAVING video_id = 1
Oder, falls Anzahl gewünscht:
SELECT COUNT(rating) as numof
FROM ratings
GROUP BY video_id
HAVING video_id = 1
Also, sehr einfach.
Beitrag zuletzt geändert: 11.11.2009 18:22:26 von nikic -
an umt299:
brauchst du eigentlich so etwas kompliziertes mit datenbank oda geht auch .txt-datei? -
mhh kommt drauf an was man schneller hin bekommt.
Aber durch die zahlreichen antworten habe ich es auch schon geschaft.
Beitrag zuletzt geändert: 18.11.2009 14:09:44 von umt299 -
wenn man nur den durchschnitt checkt, ist es egal... dann wird das ne kleine geischte mit 2 werden... wird alles Protokolliert, kommen da wirklich unmengen an Daten zusammen... eine Datei ist ab mehreren hundert zeilen untragbar...
-
http://www.hotscripts.com/category/php/scripts-programs/polls-voting/ hilft dir das weiterr?
hat ma mein freund probiert -
Das das Problem scheinbar gelöst wurde und genug Ansätze gepostet wurden: geschlossen.
Bei Rückfragen -> PN. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage