Ett "rösta på låt"-system i PHP

Permalänk
Medlem

Ett "rösta på låt"-system i PHP

Hej!

Jag har nu börjat klura på hur jag ska göra ett system där folk kan skicka in youtube-länkar, som sedan andra kan rösta på.

Jag hade tänkte att göra två stycken tables: latar och roster. I latar skulle jag ha följande fält: id, link, aktiv, namn, datum. I roster skulle jag ha: id, latarid, ip, poang, datum.

Ser min struktur bra ut?

Sen vill ja att användaren ska kunna se de länkar med bäst poäng. För att göra det kan man väll adderar alla poang under en länk med samma latarid och sedan dela den på antal röster. För att förhindra att folk röstar på samma låt flera gånger tänker jag spara ipadressen, för att sedan kolla i table roster om den finns, och om den inte finns ska "datan" skrivas in i tablen.

Hur skulle det här fungera?

Vilket kommando är bra för att plussa ihop alla siffror?

Tack på förhand!

Permalänk
Medlem

Nu har jag gjort tabellerna och även ett script för att lägga till låtar (ska testas senare). Jag har nu lagt till datan manuellt. Nu försöker jag göra ett script för att visa upp låtarna med betygen. Hittils har jag gjort så att låtarna dyker upp i en tabell (html), fast utan betyget. Jag har nämligen problem med betyget...

Nu har jag börjat med ett script som enbart skriver ut det sammanlagda betyget. Senare ska det divideras med antalet fält (numrows). Nu får jag följande felkod: "Parse error: syntax error, unexpected $end in C:\wamp\www\laddanermusikgratis\betyg.php on line 23". Vad betyder det? Här är koden: http://pastie.org/1985564

Permalänk
Inaktiv

Unexpected end är precis vad det står, din fil slutar för tidigt. I detta fallet har du för många {} och avslutar dom inte korrekt (Antalet öppna är inte samma som stängda).

Skulle rekommendera att du använder engelska namn på tabellerna och kolumnerna då det ofta är jobbigt att läsa utan å ä och ö.

För att lägga ihop siffror använder du funktionen SUM(), http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.htm....

Permalänk
Medlem
Skrivet av anon150287:

Unexpected end är precis vad det står, din fil slutar för tidigt. I detta fallet har du för många {} och avslutar dom inte korrekt (Antalet öppna är inte samma som stängda).

Skulle rekommendera att du använder engelska namn på tabellerna och kolumnerna då det ofta är jobbigt att läsa utan å ä och ö.

För att lägga ihop siffror använder du funktionen SUM(), http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.htm....

Tack, är lite trött så jag insåg inte att jag saknade en }. SUM() funktionen verkar smart, dock fungerar mitt bra nu.

Nu kommer jag till nästa problem. Hur relaterar jag mina betyg till länkarna? T.ex. om en länk har id 1 och 5 st poäng har latid 1? Förstår ni? Det här är en del av MySQL jag aldrig rört.

EDIT: Löste det första problemet, ger mig an resten nu.

EDIT2: Nu har jag vill jag alltså att scriptet ska skriva ut summan av alla betyg där betygens id är lika med länkars id. Just nu har jag två olika betyg med olika ids (latarid) i, dock skrivs det bara ut en rad med det sammanlagda värdet. Hur får jag scriptet att skriva ut betygen hos varje enskild låt? KOD: http://pastie.org/1985606

Permalänk
Inaktiv

Testa den här SQL frågan:

SELECT `songs`.*, `votes`.*, SUM(`votes`.`points`) AS `totalpoints` FROM `songs` INNER JOIN `votes` ON `songs`.`id` = `votes`.`songid` GROUP BY `songs`.`id`

Permalänk
Medlem
Skrivet av anon150287:

Testa den här SQL frågan:

SELECT `songs`.*, `votes`.*, SUM(`votes`.`points`) AS `totalpoints` FROM `songs` INNER JOIN `votes` ON `songs`.`id` = `votes`.`songid` GROUP BY `songs`.`id`

Fungerar inte riktigt, jag får följande fel: "Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\wamp\www\laddanermusikgratis\betyg1.php on line 14".

Jag använde din query, dock bytte jag tillbaka till mina svenska ord. Du skriver "totalpoints", vad menas med det? Är det någon ny variabel som skapas?

Här är min kod med din anpassade query: http://pastie.org/1985710

EDIT: Tydligen betyder det att queryn misslyckas... (?)

EDIT2: Vad gör AS i queryn?

Permalänk
Medlem

Testade nu ett nytt script, dock får jag samma error: "mysql_fetch_array() expects parameter 1 to be resource, boolean given in".

KOD: http://pastie.org/1985779

Vad betyder mitt error?

Permalänk
Medlem

Ännu ett script som bör fungera: http://pastie.org/1985813

Får upp:

Unknown column 'roser.latarid' in 'where clause'

Vad betyder det?

EDIT: Fy vad skönt löste det, hade glömt ett t på roser. Jag är verkligen för trött idag :).

Permalänk
Inaktiv
Skrivet av csmannen:

Ännu ett script som bör fungera: http://pastie.org/1985813

Får upp:

Unknown column 'roser.latarid' in 'where clause'

Vad betyder det?

EDIT: Fy vad skönt löste det, hade glömt ett t på roser. Jag är verkligen för trött idag :).

Hehe, allt funkar som det ska nu då?

Permalänk
Medlem
Skrivet av anon150287:

Hehe, allt funkar som det ska nu då?

Ja, eller inte riktigt. Nu får jag upp alla röster, eller bara 1 resultat med alla röster tillsammans. Jag har inte än dividerat de totala rösterna på antal nummer (numrows). Dock skulle jag vilja kunna se alla olika låtar med respektive poängsumma.

Koden: http://pastie.org/1985813

Hur får jag så att den echoar ut alla låtar för sig själv med sina "egna"/respektive totala poäng.

Permalänk
Inaktiv

Kör med den frågan jag skrev innan, den du använder nu gör inte riktigt vad du vill.

SELECT `songs`.*, `votes`.*, `votes`.`id` AS `voteid` SUM(`votes`.`points`) AS `totalpoints` FROM `songs` INNER JOIN `votes` ON `songs`.`id` = `votes`.`songid` GROUP BY `songs`.`id`

"totalpoints" är en variabel som är summan av alla poäng på länken du tar ut.
Tex. kommer du få en rader som ser ut såhär:

Array ( 'id', 'link', 'aktiv', 'namn', 'datum', Array ( 'rostid', 'latarid', 'ip', 'poäng' ) Array ( 'rostid', 'latarid', 'ip', 'poäng' ) 'datum', 'totalpoang' )

I detta fallet är det då en länk med 2 röster.

Permalänk
Medlem
Skrivet av anon150287:

Kör med den frågan jag skrev innan, den du använder nu gör inte riktigt vad du vill.

SELECT `songs`.*, `votes`.*, `votes`.`id` AS `voteid` SUM(`votes`.`points`) AS `totalpoints` FROM `songs` INNER JOIN `votes` ON `songs`.`id` = `votes`.`songid` GROUP BY `songs`.`id`

"totalpoints" är en variabel som är summan av alla poäng på länken du tar ut.
Tex. kommer du få en rader som ser ut såhär:

Array ( 'id', 'link', 'aktiv', 'namn', 'datum', Array ( 'rostid', 'latarid', 'ip', 'poäng' ) Array ( 'rostid', 'latarid', 'ip', 'poäng' ) 'datum', 'totalpoang' )

I detta fallet är det då en länk med 2 röster.

Nu har jag gjort om min databas till engelska ord enligt din query. Dock fungerar inte det, hur ska jag nu echo ut arraysen för mina två länkar enligt din metod?

Nu med din query får jag error: "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 'SUM(`votes`.`points`) AS `totalpoints` FROM `songs` INNER JOIN `votes` ON `songs' at line 1"

Permalänk
Inaktiv

Glömt ett komma tecken mellan `voteid` och SUM(`votes`.`points`).
Skriv ut raderna såhär så kan du se vad som finns i arrayen:

<pre> <?php print_r($row); ?> </pre>

Permalänk
Medlem
Skrivet av anon150287:

Glömt ett komma tecken mellan `voteid` och SUM(`votes`.`points`).
Skriv ut raderna såhär så kan du se vad som finns i arrayen:

<pre> <?php print_r($row); ?> </pre>

Nu printas allt ut. Ska fortsätta imrorgon med att göra det snyggt och göra så att man ser snittbetyget.

KOD: http://pastie.org/1986813

Nu skrivs det ut bra, låtens namn till vänster i en länk och summan av poängen till höger. Dock vill jag ha snittbetyget. För att göra det hade jag tänkt att räkna raderna med numrows för att sedan dividera med totala summan för att få snittet.

Mitt stora problem är att göra själva dividering och skriva ut den, hur görs det? Ska läsa lite osv.

Nu har jag börjat experimentera med numrows. Problemet är att den skriver ut alla rader. Jag tror att jag måste göra en till query där jag väljer alla röster med samma id osv. Det kanske är jätte simpelt att göra, men kan man på nått sätt skriva in i queryn att den tar ut alla rader där t.ex. songid är lika dant? Återkommer imorgon!

Permalänk
Inaktiv

Du kan använda COUNT() funktionen ungefär på samma sätt som SUM().
Kanske detta kan funka till och med:

SUM(`votes`.`points`) / COUNT(`votes`) AS `meanvalue`

EDIT: Kan dock vara bättre att köra divisionen i PHP då du inte får dividera med 0.

Permalänk
Medlem
Skrivet av anon150287:

Du kan använda COUNT() funktionen ungefär på samma sätt som SUM().
Kanske detta kan funka till och med:

SUM(`votes`.`points`) / COUNT(`votes`) AS `meanvalue`

EDIT: Kan dock vara bättre att köra divisionen i PHP då du inte får dividera med 0.

Det där såg grymt smart ut. Dock kommer problemet när det blir 0 röster. Dock borde det kunna fixas om man skriver något i stile med WHERE votes>0, inte sant?

EDIT: Hm, jag får "Undefined index: meanvalue", vilket är lite konstigt då queryn fungerar. Vad kan det bero på? (FIXAT NU)

EDIT2: Nu får jag istället det här: "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 'SUM(`votes`.`points`) / COUNT(`votes`) AS `meanvalue`' at line 1" Något är alltså fel i queryn, jag ska leta noggrannare nu.

QUERY:

$dividequery = "SUM(`votes`.`points`) / COUNT(`votes`) AS `meanvalue` FROM `votes`";

Permalänk
Inaktiv

Nej nej, sätt in den biten i den andra queryn du hade.
Tror tom. du kan göra såhär:

IF COUNT(`votes`) > 0 THEN SUM(`votes`.`points`) / COUNT(`votes`) AS `meanvalue` END IF

Permalänk
Medlem
Skrivet av anon150287:

Nej nej, sätt in den biten i den andra queryn du hade.
Tror tom. du kan göra såhär:

IF COUNT(`votes`) > 0 THEN SUM(`votes`.`points`) / COUNT(`votes`) AS `meanvalue` END IF

Jag ska alltså ha en query? Kan jag verkligen ha IF i queryn, jag testar.

Nu ser min query ut så här:

$query = "SELECT `songs`.*, `votes`.*, `votes`.`id` AS `voteid`, SUM(`votes`.`points`) AS `totalpoints` FROM `songs` INNER JOIN `votes` ON `songs`.`id` = `votes`.`songid` GROUP BY `songs`.`id` IF COUNT(`votes`) > 0 THEN SUM(`votes`.`points`) / COUNT(`votes`) AS `meanvalue` END IF ";

och jag får följande fel: "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 'IF COUNT(`votes`) > 0 THEN SUM(`votes`.`points`) / COUNT(`votes`) AS `meanvalue`' at line 1"

Permalänk
Inaktiv

Nej, du ska byta ut SUM(`votes`.`points`) AS `totalpoints` mot IF satsen.

Permalänk
Medlem

Havsmonstret, tack så hemskt mycket för all hjälp hittills!

Query:

$query = "SELECT `songs`.*, `votes`.*, `votes`.`id` AS `voteid`, IF COUNT(`votes`) > 0 THEN SUM(`votes`.`points`) / COUNT(`votes`) AS `meanvalue` END IF FROM `songs` INNER JOIN `votes` ON `songs`.`id` = `votes`.`songid` GROUP BY `songs`.`id`";

Stämmer det nu? Jag får fortfarande fel...

Permalänk
Inaktiv
Skrivet av csmannen:

Havsmonstret, tack så hemskt mycket för all hjälp hittills!

Query:

$query = "SELECT `songs`.*, `votes`.*, `votes`.`id` AS `voteid`, IF COUNT(`votes`) > 0 THEN SUM(`votes`.`points`) / COUNT(`votes`) AS `meanvalue` END IF FROM `songs` INNER JOIN `votes` ON `songs`.`id` = `votes`.`songid` GROUP BY `songs`.`id`";

Stämmer det nu? Jag får fortfarande fel...

Blev lite fel i det jag skrev innan, testa den här queryn:

SELECT `songs`.*, `votes`.*, `votes`.`id` AS `voteid`, IF(COUNT(`votes`) > 0,SUM(`votes`.`points`) / COUNT(`votes`),SUM(`votes`.`points`) / 1) AS `meanvalue` FROM `songs` INNER JOIN `votes` ON `songs`.`id` = `votes`.`songid` GROUP BY `songs`.`id`

Permalänk
Medlem
Skrivet av anon150287:

Blev lite fel i det jag skrev innan, testa den här queryn:

SELECT `songs`.*, `votes`.*, `votes`.`id` AS `voteid`, IF(COUNT(`votes`) > 0,SUM(`votes`.`points`) / COUNT(`votes`),SUM(`votes`.`points`) / 1) AS `meanvalue` FROM `songs` INNER JOIN `votes` ON `songs`.`id` = `votes`.`songid` GROUP BY `songs`.`id`

Tack så hemskt mycket, dock får jag nu upp "Unknown column 'votes' in 'field list'", vilket betyder att votes inte finns i en min databas. Dock anser jag att votes enbart har används i query som namn till tabellen, har jag fel? I så fall, vad ska ersättas?

Fördmodligen är det något fel i COUNT-delen med votes.

Permalänk
Inaktiv

Ska vara `votes`.`id` istället för bara `votes` i COUNT().

Permalänk
Medlem
Skrivet av anon150287:

Blev lite fel i det jag skrev innan, testa den här queryn:

SELECT `songs`.*, `votes`.*, `votes`.`id` AS `voteid`, IF(COUNT(`votes`) > 0,SUM(`votes`.`points`) / COUNT(`votes`),SUM(`votes`.`points`) / 1) AS `meanvalue` FROM `songs` INNER JOIN `votes` ON `songs`.`id` = `votes`.`songid` GROUP BY `songs`.`id`

Skrivet av anon150287:

Ska vara `votes`.`id` istället för bara `votes` i COUNT().

Tack, jag såg det faktiskt själv :). Dock byte jag ut vote mot points, och det fungerar ypperligt.

Om jag sedan vill kunna godkänna alla låtar som skickas in genom att ändra active från 0 till 1 och kolla i queryn så att enbart låtar som är aktiva visas. För att göra det tänkte jag kolla om active = 1 i queryn genom att säga något i stil med where active ==1, skulle det fungerar? Och hur?

Åter igen, tack!

EDIT2: Kan man på något sätt bestämma hur många decimaler som skrivs ut?

Permalänk
Inaktiv

Lägg bara till WHERE `songs`.`active` = 1 sist i queryn.
Kolla på PHPs funkioner: round, floor, ceil och number_format.
http://php.net/

Permalänk
Medlem
Skrivet av anon150287:

Lägg bara till WHERE `songs`.`active` = 1 sist i queryn.
Kolla på PHPs funkioner: round, floor, ceil och number_format.
http://php.net/

Tack, dock fungerar inte queryn.

Query:

$query = "SELECT `songs`.*, `votes`.*, `votes`.`id` AS `voteid`, IF(COUNT(`points`) > 0,SUM(`votes`.`points`) / COUNT(`points`),SUM(`votes`.`points`) / 1) AS `meanvalue` FROM `songs` INNER JOIN `votes` ON `songs`.`id` = `votes`.`songid` GROUP BY `songs`.`id` WHERE `songs`.`active` = 1";

Error:

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 'WHERE `songs`.`active` = 1' at line 1

Ceil fungerade utmärkt!

Permalänk
Medlem

det finns en funktion i MySQL som heter AVG() som beräknar medelvärdet av talen i en kolumn.
du borde alltså kunna byta ut
IF(COUNT(`points`) > 0,SUM(`votes`.`points`) / COUNT(`points`),SUM(`votes`.`points`) / 1) AS `meanvalue`
mot
AVG(`votes`.`points`) AS `meanvalue`.

WHERE måste komma innan GROUP BY. se SELECT Syntax

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Inaktiv

Ja det kan man ju såklart göra, tänkte inte på det alls.

Permalänk
Medlem
Skrivet av jovnas:

det finns en funktion i MySQL som heter AVG() som beräknar medelvärdet av talen i en kolumn.
du borde alltså kunna byta ut
IF(COUNT(`points`) > 0,SUM(`votes`.`points`) / COUNT(`points`),SUM(`votes`.`points`) / 1) AS `meanvalue`
mot
AVG(`votes`.`points`) AS `meanvalue`.

WHERE måste komma innan GROUP BY. se SELECT Syntax

Skrivet av havsmonstret:

Ja det kan man ju såklart göra, tänkte inte på det alls.

Tack så hemskt mycket! Nu har jag lärt mig mycket om querys och "inmatning" i querys.

En schysst funktion jag kom på skulle vara om man kunde skriva något i stil med WHERE `roster`.`unix` > `$chosedtime`

Och chosed time beräknas med: X antal dagar * 86400. Produkten man då får är alltså hur hur många sekunder X antal dagar är. Och på min sida skulle då användaren kunna klicka på en länk, och sen ska det vara något i stil med sida.php?chosedtime=7, och då ska de låtar som har högst medelbetyg under den här veckan visas. Förstår ni? Skulle det fungera?

Permalänk
Medlem

$chosedtime= $_POST ['chosedtime'];
$chosedtime= stripslashes($chosedtime);
$chosedtime= mysql_real_escape_string($chosedtime);

$chosedtimeX= time(); - $chosedtime * 86400;

Är det där ett korrekt och säkert sätt att räkna ut unixet - X*86400? Hur gör jag sen i queryn?