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.
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ä.
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..
Tee äänestäminen sallituksi vain sisäänkirjaantuneille.
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.
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..
Aseta keksi? Voithan sinä luoda ip ja selaimen tiedoista hashin, ja käyttää sitä tarkisteena..
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' ); }); });
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.
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!
Tuolla funktiolla ei ole oikein mitään arvoa, ja sitä paitsi se on PHP:tä eikä JS:ää.
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
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ä.
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.
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.
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 } ?>
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.
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.
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).
ahaa.. no täytyy lukea tarkemmin ensi kerralla.. eli unoque key olisi tavallaan ip+leffa,, otaksun
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ä.
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ä.!!
Aihe on jo aika vanha, joten et voi enää vastata siihen.