Avatar billede pitzen Nybegynder
07. juni 2007 - 16:09 Der er 16 kommentarer og
1 løsning

Unikt stemmesystem

Hej!

På min side http://bodystarz.dk (indhold kan virke stødende på sarte sjæle) har jeg et stemmesystem, hvor man kan afgive en stemme fra 1 til 10.

Men spørgsmål lyder; hvordan registrerer jeg lettets folks stemmer så de ikke kan stemme to gange. Jeg har forsøgt mig med Cookies - uden held..

Nogle gode ideer?
Avatar billede michael_stim Ekspert
07. juni 2007 - 16:20 #1
Hvad med ip adresse? Det sätter jo visse begränsninger (f ex at kun en comp. bag en router kan stemme). Men det burde ikke väre et större problem, man må jo ikke kigge på sådanne sider fra arbejde, og det er ikke mange hjem hvor der er flere personer der kigger på sådanne sider på hver sin comp. (Det skulle lige väre far og gammel sön ;o))
Avatar billede pitzen Nybegynder
07. juni 2007 - 18:13 #2
Hej Michael..

IP er selvfølgelig oplagt og klart den bedste løsning. Mit problemet ligger også mest i hvordan jeg registrere hvilke billeder der er blevet stemt på. Jeg havde overvejet et Array, men ved ik om det er smart!?

Hvert billede har et ID og det skal vel bare skrives til DB'en.. Men hvordan gør jeg det lettest, med henblik på at hente den oplysning igen?
Avatar billede jakobdo Ekspert
07. juni 2007 - 18:26 #3
serialize() dit array og gem det i db eller cookie.
Du kan aldrig blive 100% sikker.
Cookies kan slettes.
Flere besøgende kan komme fra samme ip.
Avatar billede pitzen Nybegynder
07. juni 2007 - 19:52 #4
Hej igen..

Arrays er helt nyt for mig. Håber i kan hjælpe med at få sat det ind i denne sammenhæng:

if($_POST[rating])
{
    $prev_rating = $_POST[rating];
    $prev_id = $_POST[id];
   
    $getcount = mysql_query("SELECT * FROM bryster where id='$prev_id'");

    while ($result=mysql_fetch_array($getcount))
    {
        $new_num_votes = ($result[num_votes] + 1);
        $old_total = ($result[rating] * $result[num_votes]);
        $new_total = ($old_total + $prev_rating);
        $new_rating = ($new_total / $new_num_votes);
        $new_rating2 = number_format($new_rating, 2, '.', '');                    
        $update_rating = mysql_query("UPDATE bryster SET rating='$new_rating2',num_votes='$new_num_votes' where id='$prev_id'");                 
    }
}

I DB'en har jeg oprettet en table der hedder "id_reg", med felterne "IP" og "IDs"...
Avatar billede leif Seniormester
07. juni 2007 - 20:58 #5
Vil du have unikt system, så kræv login og analyser de forskellige Brugere der oprettes
Avatar billede pitzen Nybegynder
07. juni 2007 - 21:04 #6
Det behøver ikke være SÅ unikt ;)

Det skal bare forhindre folk i at spamme stemmer.. Og samtidig kan man også sørge for at de samme billeder ikke dukker op igen og igen!
Avatar billede pitzen Nybegynder
07. juni 2007 - 21:14 #7
Derfor tænkte jeg, at hvis man havde et array el. der så således ud:

(3,5,7,613,45,288)

altså indeholdte de ID'er man har stemt på, så kunne man blot tjekke om de pågældende ID figurerede i array'et før man afgav stemme..
Avatar billede michaelthomassen Nybegynder
09. juni 2007 - 00:49 #8
Lav din id_reg tabel om til at indeholde IP (varchar(50)), ID (int) og Vote (tinyint), så kan du også vise fordelingen af stemmerne på hvert billede. Fjern rating og num_votes fra bryster tabellen.

<?php
    function GetUserIP() {
        if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
            $ip = getenv("HTTP_CLIENT_IP");
        else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
            $ip = getenv("REMOTE_ADDR");
        else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
            $ip = $_SERVER['REMOTE_ADDR'];
        else
            $ip = "unknown";
        return($ip);
    }

    if ((isset($_POST['rating'])) && (preg_match('/^[0-9]+$/', $_POST['rating']))) {
        if ((isset($_POST['id'])) && (preg_match('/^[0-9]+$/', $_POST['id']))) {
            $rating = $_POST['rating'];
            $id = $_POST['id'];   
            $result = mysql_query('SELECT * FROM bryster WHERE ID = ' . $id);    //går ud fra id er unik
            if (mysql_num_rows($result) == 1) {
                $result = mysql_query('SELECT * FROM id_reg WHERE IP = "' . GetUserIP() . '" AND ID = ' . $id);
                if (mysql_num_rows($result) == 0) {
                    mysql_query('INSERT INTO id_reg (IP, ID, Vote) VALUES ("' . GetUserIP() . '", ' . $id . ', ' . $vote . ')');
                } else {
                    mysql_query('UPDATE id_reg SET Vote = ' . $vote . ' WHERE ID = ' . $id . ' AND IP = "' . GetUserIP() . '"');
                }
            } else {
                echo 'Billedet ikke fundet';
                die();
            }
        }
    }

    $result = mysql_query('SELECT AVG(Vote) AS Average, COUNT(*) AS Total FROM id_reg WHERE ID = ' . $id);
    $row = mysql_fetch_array($result);
    echo 'Ny rating: ' . $row['Average'] . '<br>';
    echo 'Antal stemmer: ' . $row['Total'] . '<br>';
?>

Denne løsning kræver dog at du laver om i din kode hvor du viser gennemsnit og antal stemmer på hvert enkelt billede. Her kan du bruge den sidste SQL sætning til at finde tallene i stedet for i bryster tabellen.
Avatar billede jakobdo Ekspert
09. juni 2007 - 09:24 #9
IP gemmer man da ikke som varchar().
Du gemmer ip som: INT UNSIGNED og bruger funktionen: inet_aton()
Avatar billede pitzen Nybegynder
20. juli 2007 - 15:17 #10
Jeg har fået systemet til at virke omsider, ved hjælp af din kode Michael.

Hvordan kan jeg lave en top 25 af dette?
Avatar billede pitzen Nybegynder
20. juli 2007 - 15:18 #11
I "gamle dage" sorterede jeg bare efter rating når jeg kaldte databasen, men nu skal jeg jo først tælle op.. Hvorn klarer jeg den?
Avatar billede michaelthomassen Nybegynder
20. juli 2007 - 15:30 #12
Noget i retning af;

mysql_query('SELECT id, AVG(Vote) AS Average FROM id_reg GROUP BY id ORDER BY Average LIMIT 0,25');
Avatar billede olebole Juniormester
20. juli 2007 - 16:57 #13
<ole>

jakobdo har fuldstændig ret, bortset fra, at jeg tror, han mener funktionen: ip2long()

Man kan også bruge funktionen: inet_pton() - men den returnerer en streng

/mvh
</bole>
Avatar billede jakobdo Ekspert
20. juli 2007 - 21:34 #14
olebole: Den funktion skulle nu være ok. (det er en mysql funktion)

Copy/paste fra mysql/Dev/doc

#

INET_ATON(expr)

Given the dotted-quad representation of a network address as a string, returns an integer that represents the numeric value of the address. Addresses may be 4- or 8-byte addresses.

mysql> SELECT INET_ATON('209.207.224.40');
        -> 3520061480

The generated number is always in network byte order. For the example just shown, the number is calculated as 209×2563 + 207×2562 + 224×256 + 40.

INET_ATON() also understands short-form IP addresses:

mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1');
        -> 2130706433, 2130706433

Note: When storing values generated by INET_ATON(), it is recommended that you use an INT UNSIGNED column. If you use a (signed) INT column, values corresponding to IP addresses for which the first octet is greater than 127 cannot be stored correctly. See Section 11.2, “Numeric Types”.
#

INET_NTOA(expr)

Given a numeric network address (4 or 8 byte), returns the dotted-quad representation of the address as a string.

mysql> SELECT INET_NTOA(3520061480);
        -> '209.207.224.40'
Avatar billede pitzen Nybegynder
17. september 2007 - 09:43 #15
Smider du et svar michaelthomassen?

Mange tak for hjælpen!
Avatar billede michaelthomassen Nybegynder
17. september 2007 - 13:08 #16
Alrighty then :)
Avatar billede michaelthomassen Nybegynder
17. september 2007 - 13:08 #17
Doh !
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester