Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Yksi ääni/ IP-osoite

Sivun loppuun

latenleffahylly [06.03.2012 16:15:42]

#

Hei,

Olen rakentanut "Star Rating" -sovellusta omille web-sivuilleni. Äänestäminen toimii ja näyttää hyvältä.

- Miten rajoittaa käyttäjää antamaan vain 1 kerran arvio / elokuva ?

------------------------------------------------------

Olen yrittänyt löytää netistä javascript/jquery -koodia jolla tarkistaa käyttäjän IP-osoite - - - aina kun hän klikkaa antaakseen arvosanan (1-5 tähteä). Onko putkassa opasta tähän tai jotain vanhaa keskustelua, kiitos.

Metabolix [06.03.2012 16:22:03]

#

Selain ei tiedä omaa osoitettaan. Osoitteen saa helpoiten palvelimen puolella, esimerkiksi PHP:ssä $_SERVER["REMOTE_ADDR"]. Muista kuitenkin, että esimerkiksi taloyhtiöt, koulut, yliopistot ym. saattavat käyttää yhtä IP-osoitetta suurelle määrälle koneita ja vastaavasti asiakseen tuloksia vääristelevät henkilöt voivat hyödyntää välityspalvelimia, joten IP-osoitteen perusteella tunnistaminen ei ole kovin käytännöllistä.

latenleffahylly [06.03.2012 16:28:31]

#

Olen kuullut tuosta, mutta nyt sovelluksessani ei ole mitään järkeä kun käyttäjä voi klikata yhdelle elokuvalle vaikka 20 x 5 tähteä...

Joku nopea tsekkaus riittäisi, joten varmaan sitten PHP.. eikö ole mitään javascript koodin pätkää joka vaan nopeasti tsekkaisi jos juuri annettu ääni..

Lebe80 [06.03.2012 16:29:13]

#

Tee äänestäminen sallituksi vain sisäänkirjaantuneille.

Metabolix [06.03.2012 16:31:29]

#

Jos kerran jQuerylla lähetät äänen, voit saman tien jQuerylla poistaa koko lomakkeen.

var lomake = $("form#aanestyslomake");
lomake.remove();
// tai lomake.replaceWith("<p>Kiitos äänestäsi!</p>");

Tämä tietenkin estää vain käyttäjää vahingossa naputtamasta äänestystä; jos oikeasti haluaa äänestää monta kertaa, voi ladata sivun uudestaan. Ainoa tapa estää väärinkäytökset on vaatia kirjautuminen ja säilyttää tietokannassa tieto jokaisen käyttäjän äänistä, jotta voi tarvittaessa poistaa väärinkäyttäjien äänet jälkikäteen. Lisäksi pitäisi vaatia rekisteröitymisen yhteydessä tunnistautumista vaikka pankkitunnuksilla, jotta sama henkilö ei voisi tehdä useita tunnuksia.

latenleffahylly [06.03.2012 16:38:08]

#

Noniin..

palataan hieman taaksepäin eli kyseessä on omat elokuva-aiheiset web-sivuni.

- nyt käyttäjä voi klikkailla leffan kohdalla loputtomiin ja haluaisin estää tämän.

Olisi mukava jotenkin tsekata että ei voi klikata heti perään uutta ääntä. Ymmärrän pointtinne, mutta voiko jotenkin tsekata esim. ip-osoitteen tai jonkun hmm.. evästeen että se ei ole sama kuin sekunti sitten..

qeijo [06.03.2012 16:42:22]

#

Aseta keksi? Voithan sinä luoda ip ja selaimen tiedoista hashin, ja käyttää sitä tarkisteena..

latenleffahylly [06.03.2012 16:45:01]

#

no kysynkö seuraavaksi miten se tehdään tain onko jossain ohjeet.. omat taitoni ovat rajalliset niin siksi halusin kysyä teiltä neuvoa.

Olen tehnyt ITSE erittäin paljon, mutta nyt tuli rajat vastaan.. monet oppaat ehdottavat jonkin tyyppistä php-tarkistusta

Lisäys:

..okei,

    // This actually records the vote
    $('.ratings_stars').bind('click', function() {
        var star = this;
        var widget = $(this).parent();

        var clicked_data = {
            clicked_on : $(star).attr('class'),
            widget_id : $(star).parent().attr('id')
        };
        $.post(
            'http://.../ratings.php',
            clicked_data,
            function(INFO) {
                widget.data( 'fsr', INFO );
                set_votes(widget);
            },
            'json'
        );
    });



});

Metabolix [06.03.2012 16:55:36]

#

JavaScriptilla tai evästeillä on ihan turha tehdä tällaista tarkistusta, koska sen voi kuka tahansa kiertää. Jos sinusta JS on riittävä ratkaisu, mikset käytä äsken ehdottamaani tapaa, jossa äänestyslomake korvataan kiitostekstillä tai vaikka äänestyksen tuloksella? (Vai onko sivulla jo tällainen?)

Jos haluat jollain tavalla luotettavan tarkistuksen, tee se PHP:llä. Kerroin jo, mistä IP-osoite löytyy. Tarkista aina ennen äänen lisäystä, ettei samaa osoitetta ole äskettäin käytetty, ja tallenna sitten osoite ja uusi aikaleima tietokantaan seuraavia tarkistuksia varten.

latenleffahylly [06.03.2012 16:59:12]

#

Kokeilen tuota, että otan IP-osoitteen talteen. Yritän verrata sitä sitten..


Nyt kun käyttäjä antaa äänen niin systeemi laskee keskiarvon ja näyttää sen numerona ja tähden muodossa.

Lisäys:

So here is a simple function in PHP to find the real IP address of the client’s machine. There are extra Server variable which might be available to determine the exact IP address of the client’s machine in PHP, they are HTTP_CLIENT_IP and HTTP_X_FORWARDED_FOR.

function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

Mod. korjasi oikeat kooditagit!

Metabolix [06.03.2012 17:03:41]

#

Tuolla funktiolla ei ole oikein mitään arvoa, ja sitä paitsi se on PHP:tä eikä JS:ää.

latenleffahylly [06.03.2012 17:10:09]

#

tuota MB.. kun katson tuon $_SERVER["REMOTE_ADDR"] esim. php.net niin ei saa mitään selvää.

miten löytäisi ohjeet josta ymmärtää jotain esim. Tizag

Blaze [06.03.2012 17:13:01]

#

latenleffahylly kirjoitti:

So here is a simple function in PHP to find the real IP address of the client’s machine.

Jos nyt hetken aikaa leikittäis, että tuo toimis, niin ois tosiaan kiinnostavaa tietää, kuinka monta konetta löytyy, joitten osote on 192.168.0.1 tai 10.0.0.1 :)

Tarinan opetus: IP-osote ei yksilöi konetta, ja vielä vähemmän ihmistä.

makumaku [06.03.2012 17:16:45]

#

Onko arvosanat menossa tietokantaan?
Määrittele ip vaikka UNIQUE kentäksi tauluun, ja sitten tallennat vain arvosanat tietokantaan systeemillä

INSERT INTO table (ip, arvosana, leffa) VALUES ($_SERVER["REMOTE_ADDR"], y, z) ON DUPLICATE KEY UPDATE arvosana = y;

Näin käyttäjät pystyvät halutessaan myös vaihtamaan äänestystulosta.
Ja en ole kokeillut edellistä, mutta tuli vaan idea mieleen, miten itse lähtisin tekemään.

Metabolix [06.03.2012 17:20:57]

#

latenleffahylly kirjoitti:

miten löytäisi ohjeet josta ymmärtää jotain esim. Tizag

Siis mikä ihmeen ongelma sitä on ymmärtää? Se on muuttuja, jossa on IP-osoite. Se ei eroa mitenkään muista muuttujista. Jos haluat, voit sijoittaa sen toiseen muuttujaan:

$x = $_SERVER["REMOTE_ADDR"];

Nyt $x on muuttuja, jossa on IP-osoite.

makumaku kirjoitti:

Määrittele ip vaikka UNIQUE kentäksi tauluun

Selvästikin UNIQUE-avaimena pitäisi olla esimerkissäsi (ip, leffa), jotta sama käyttäjä voisi kuitenkin arvostella useamman elokuvan.

latenleffahylly [06.03.2012 17:23:24]

#

Kiitän kiitän suuresti teitä.. taas opin uutta.


NYT koodi tämä - ja sitä lähden muuttamaan:

<?php


    $rating = new ratings($_POST['widget_id']);


    isset($_POST['fetch']) ? $rating->get_ratings() : $rating->vote();



class ratings {

    var $data_file = './ratings.data.txt';
    private $widget_id;
    private $data = array();


function __construct($wid) {

    $this->widget_id = $wid;

    $all = file_get_contents($this->data_file);

    if($all) {
        $this->data = unserialize($all);
    }
}
public function get_ratings() {
    if($this->data[$this->widget_id]) {
        echo json_encode($this->data[$this->widget_id]);
    }
    else {
        $data['widget_id'] = $this->widget_id;
        $data['number_votes'] = 0;
        $data['total_points'] = 0;
        $data['dec_avg'] = 0;
        $data['whole_avg'] = 0;
        echo json_encode($data);
    }
}
public function vote() {

    # Get the value of the vote
    preg_match('/star_([1-5]{1})/', $_POST['clicked_on'], $match);
    $vote = $match[1];

    $ID = $this->widget_id;
    # Update the record if it exists
    if($this->data[$ID]) {
        $this->data[$ID]['number_votes'] += 1;
        $this->data[$ID]['total_points'] += $vote;
    }
    # Create a new one if it doesn't
    else {
        $this->data[$ID]['number_votes'] = 1;
        $this->data[$ID]['total_points'] = $vote;
    }

    $this->data[$ID]['dec_avg'] = round( $this->data[$ID]['total_points'] / $this->data[$ID]['number_votes'], 1 );
    $this->data[$ID]['whole_avg'] = round( $this->data[$ID]['dec_avg'] );


    file_put_contents($this->data_file, serialize($this->data));
    $this->get_ratings();
}

# ---
# end class
}

?>

qeijo [06.03.2012 18:04:22]

#

Selvitä alkuperäinen nic/mac - osoite paluu pingillä, tai reittiä seuraamalla. :)

5 min later..
Hetken sulatettua ehdotustani huomasin sen olevan melko haastava, miltei mahdoton toteuttaa.

latenleffahylly [06.03.2012 20:48:53]

#

Metabolix kirjoitti:

Selvästikin UNIQUE-avaimena pitäisi olla esimerkissäsi (ip, leffa), jotta sama käyttäjä voisi kuitenkin arvostella useamman elokuvan.

- Nyt käyttäjä voi arvioida 1 elokuvan 1 kerran. Muita elokuvia ei voi enää arvioida koska IP-osoite on uniikki tieto.

Metabolix [06.03.2012 20:51:36]

#

Niin, koska teit väärin, kuten makumaku vahingossa neuvoi. Jos tekisit oikein, kuten itse neuvoin juuri tuossa lainaamassasi kohdassa, käyttäjä voisi arvioida jokaista elokuvaa. Poista taulusta väärä UNIQUE KEY ja lisää siihen UNIQUE KEY (ip, leffa).

latenleffahylly [06.03.2012 21:14:29]

#

ahaa.. no täytyy lukea tarkemmin ensi kerralla.. eli unoque key olisi tavallaan ip+leffa,, otaksun

makumaku [06.03.2012 21:28:37]

#

Kyllä.
Tosiaan tuo minun aikaisempi kirjoitus antaa arvostella vain yhden elokuvan, koska ip-kenttä yksinään on unique, eli taulussa saa olla vain kerran sama ip (kaikilla riveillä), ja ei ole merkitystä mikä elokuva_id rivillä sattuu olemaan.
Jotta käyttäjä voisi arvostella jokaisen elokuvan kerran täytyy uniqueksi määritellä ip:n ja elokuvan yhdistelmä. Eli taulussa saa olla vain kerran sellainen rivi jossa ip ja elokuva_id on sama. UNIQUE key (index) voi siis olla monenkin eri kentän yhdistelmä.

latenleffahylly [06.03.2012 23:54:18]

#

Nyt toimii täydellisesti. Mukava myös tutkia tietokannasta IP-osoitteita. Jälleen kerran tuhannet kiitokset kaikki tietävälle Metabolixille, jota ilman ei tämäkään sovellus olisi mennyt eteenpäin.

Myös makumaku suurkiitokset avusta. Tavallaan vaikka tällaisia "virheitä" tulee niin ainakin niistä tuntuu oppivan parhaiten. Minulle oli uusi tieto mm. se että UNIQUE arvo voi olla ip+leffa.. erittäin hyödyllistä.!!


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta