• User Attivo

    Ajax star rater

    Salve a tutti,

    sto facendo un sito nel quale una giuria dovrà votare dei lavori.
    Per questo sto utilizzando l'ajax star rater trovato a questo link:

    masugadesign.com/the-lab/scripts/unobtrusive-ajax-star-rating-bar/

    Sono riuscita a integrarlo nelle mie pagine e tutto il resto, l'unica cosa però che non riesco a fare è che il codice controlla chi ha già votato o meno a seconda dell'ip.
    Io invece vorrei che lo script facesse un controllo sull'id dei giudici ($_SESSION[id_giuria]), e controllasse se quel giudice ha già votato o meno.
    Però non riesco a farlo, qualcuno può aiutarmi?


  • Super User

    Non conosco quell'applicazione, comunque sia, se utilizza il db per memorizzare il voto assegnato, basterebbe una semplice SELECT al db per controllare se esiste nella tabella VOTI una riga contenente l'ID del giudice corrente ( $_SESSION... ) e l'ID dell'elemento corrente da votare.

    Poi fare un IF se la query ha avuto esito positivo, ed in quel caso mostrare il risultato...


  • User Attivo

    Questa query è già presente nel codice, infatti ho provato a sostituire ovunque richiamava l'ip con l'id_giuria, ma ugualmente non va...
    Se qualcuno magari ha già scaricato e utilizzato questi codici e sa come funzionano...


  • User

    Hai fatto anche si che l'id viene assegnato alla riga corrispondente al voto anzichè l'ip ?

    Intendo, quando clicchi sulla stella per stabilire il voto.


  • User Attivo

    Si, purtroppo il fatto è che ci sono in mezzo anche le regular expression e allora a un certo punto non capisco più la funzione del codice...


  • User

    E' probabile che qualcuna di esse allora filtri il dato di modo da non far passare altro oltre l'ip.

    Prova a farci vedere i singoli passaggi, ovvero memorizzazione del dato e controllo di voto e il trattamento che subiscono i dati prima di passare alla query ovviamente.


  • User Attivo

    Questo è il codice:
    [php]function rating_bar($id,$units='',$static='') {
    require('_config-rating.php'); // get the db connection info

    //set some variables
    $ip = $_SERVER['REMOTE_ADDR'];
    // ci aggiunto l'id del giudice che vota
    $id_giuria = $_SESSION['id_giuria'];
    if (!$units) {$units = 10;}
    if (!$static) {$static = FALSE;}
    // get votes, values, ips for the current rating bar
    $query=mysql_query("SELECT total_votes, total_value, used_ips FROM $rating_dbname.$rating_tableName WHERE id='$id' ")or die(" Error: ".mysql_error());

    star-rating-bar/#comment-121
    if (mysql_num_rows($query) == 0) {
    $sql = "INSERT INTO $rating_dbname.$rating_tableName (id,total_votes, total_value, used_ips) VALUES ('$id', '0', '0', '')";
    $result = mysql_query($sql);
    }
    $numbers=mysql_fetch_assoc($query);

    if ($numbers['total_votes'] < 1) {
    $count = 0;
    } else {
    $count=$numbers['total_votes']; //how many votes total
    }
    $current_rating=$numbers['total_value']; //total number of rating added together and stored
    $tense=($count==1) ? "vote" : "votes"; //plural form votes/vote
    // determine whether the user has voted, so we know how to draw the ul/li
    $voted=mysql_num_rows(mysql_query("SELECT used_ips FROM $rating_dbname.$rating_tableName WHERE used_ips LIKE '%".$ip."%' AND id='".$id."' "));
    // now draw the rating bar
    $rating_width = @number_format($current_rating/$count,2)*$rating_unitwidth;
    $rating1 = @number_format($current_rating/$count,1);
    $rating2 = @number_format($current_rating/$count,2);

    if ($static == 'static') {
    $static_rater = array();
    $static_rater[] .= "\n".'<div class="ratingblock">';
    $static_rater[] .= '<div id="unit_long'.$id.'">';
    $static_rater[] .= '<ul id="unit_ul'.$id.'" class="unit-rating" style="width:'.$rating_unitwidth*$units.'px;">';
    $static_rater[] .= '<li class="current-rating" style="width:'.$rating_width.'px;">Currently '.$rating2.'/'.$units.'</li>';
    $static_rater[] .= '</ul>';
    $static_rater[] .= '<p class="static">'.$id.'. Rating: <strong> '.$rating1.'</strong>/'.$units.' ('.$count.' '.$tense.' cast) <em>This is 'static'.</em></p>';
    $static_rater[] .= '</div>';
    $static_rater[] .= '</div>'."\n\n";
    return join("\n", $static_rater);

    } else {
    $rater ='';
    $rater.='<div class="ratingblock">';
    $rater.='<div id="unit_long'.$id.'">';
    $rater.=' <ul id="unit_ul'.$id.'" class="unit-rating" style="width:'.$rating_unitwidth*$units.'px;">';
    $rater.=' <li class="current-rating" style="width:'.$rating_width.'px;">Currently '.$rating2.'/'.$units.'</li>';
    for ($ncount = 1; $ncount <= $units; $ncount++) { // loop from 1 to the number of units
    if(!$voted) { // if the user hasn't yet voted, draw the voting stars
    $rater.='<li><a href="db.php?j='.$ncount.'&q='.$id.'&t='.$ip.'&c='.$units.'" title="'.$ncount.' out of '.$units.'" class="r'.$ncount.'-unit rater" rel="nofollow">'.$ncount.'</a></li>';
    }
    }
    $ncount=0; // resets the count
    $rater.=' </ul>';
    $rater.=' <p';
    if($voted){ $rater.=' class="voted"'; }
    $rater.='>'.$id.' Rating: <strong> '.$rating1.'</strong>/'.$units.' ('.$count.' '.$tense.' cast)';
    $rater.=' </p>';
    $rater.='</div>';
    $rater.='</div>';
    return $rater;
    }
    }[/php]

    Poi c'è questo:

    [php]//getting the values
    $vote_sent = preg_replace("/[^0-9]/","",$_REQUEST['j']);
    $id_sent = preg_replace("/[^0-9a-zA-Z]/","",$_REQUEST['q']);
    $ip_num = preg_replace("/[^0-9.]/","",$_REQUEST['t']);
    $units = preg_replace("/[^0-9]/","",$_REQUEST['c']);
    $ip = $_SERVER['REMOTE_ADDR'];
    if ($vote_sent > $units) die("Sorry, vote appears to be invalid."); // kill the script because normal users will never see this.

    //connecting to the database to get some information
    $query = mysql_query("SELECT total_votes, total_value, used_ips FROM $rating_dbname.$rating_tableName WHERE id='$id_sent' ")or die(" Error: ".mysql_error());
    $numbers = mysql_fetch_assoc($query);
    $checkIP = unserialize($numbers['used_ips']);
    $count = $numbers['total_votes']; //how many votes total
    $current_rating = $numbers['total_value']; //total number of rating added together and stored
    $sum = $vote_sent+$current_rating; // add together the current vote value and the total vote value
    $tense = ($count==1) ? "vote" : "votes"; //plural form votes/vote
    // checking to see if the first vote has been tallied
    // or increment the current number of votes
    ($sum==0 ? $added=0 : $added=$count+1);
    // if it is an array i.e. already has entries the push in another value
    ((is_array($checkIP)) ? array_push($checkIP,$ip_num) : $checkIP=array($ip_num));
    $insertip=serialize($checkIP);
    //IP check when voting
    $voted=mysql_num_rows(mysql_query("SELECT used_ips FROM $rating_dbname.$rating_tableName WHERE used_ips LIKE '%".$ip."%' AND id='".$id_sent."' "));
    if(!$voted) { //if the user hasn't yet voted, then vote normally...
    if (($vote_sent >= 1 && $vote_sent <= $units) && ($ip == $ip_num)) { // keep votes within range, make sure IP matches - no monkey business!
    $update = "UPDATE $rating_dbname.$rating_tableName SET total_votes='".$added."', total_value='".$sum."', used_ips='".$insertip."' WHERE id='$id_sent'";
    $result = mysql_query($update);
    }
    } //end for the "if(!$voted)"
    // these are new queries to get the new values!
    $newtotals = mysql_query("SELECT total_votes, total_value, used_ips FROM $rating_dbname.$rating_tableName WHERE id='$id_sent' ")or die(" Error: ".mysql_error());
    $numbers = mysql_fetch_assoc($newtotals);
    $count = $numbers['total_votes'];//how many votes total
    $current_rating = $numbers['total_value'];//total number of rating added together and stored
    $tense = ($count==1) ? "vote" : "votes"; //plural form votes/vote
    // $new_back is what gets 'drawn' on your page after a successful 'AJAX/Javascript' vote
    $new_back = array();
    $new_back[] .= '<ul class="unit-rating" style="width:'.$units*$rating_unitwidth.'px;">';
    $new_back[] .= '<li class="current-rating" style="width:'.@number_format($current_rating/$count,2)*$rating_unitwidth.'px;">Current rating.</li>';
    $new_back[] .= '<li class="r1-unit">1</li>';
    $new_back[] .= '<li class="r2-unit">2</li>';
    $new_back[] .= '<li class="r3-unit">3</li>';
    $new_back[] .= '<li class="r4-unit">4</li>';
    $new_back[] .= '<li class="r5-unit">5</li>';
    $new_back[] .= '<li class="r6-unit">6</li>';
    $new_back[] .= '<li class="r7-unit">7</li>';
    $new_back[] .= '<li class="r8-unit">8</li>';
    $new_back[] .= '<li class="r9-unit">9</li>';
    $new_back[] .= '<li class="r10-unit">10</li>';
    $new_back[] .= '</ul>';
    $new_back[] .= '<p class="voted">'.$id_sent.'. Rating: <strong>'.@number_format($sum/$added,1).'</strong>/'.$units.' ('.$count.' '.$tense.' cast) ';
    $new_back[] .= '<span class="thanks">Thanks for voting!</span></p>';
    $allnewback = join("\n", $new_back);
    // ========================
    //name of the div id to be updated | the html that needs to be changed
    $output = "unit_long$id_sent|$allnewback";
    echo $output;[/php]

    E infine questo:

    [php]//getting the values
    $vote_sent = preg_replace("/[^0-9]/","",$_REQUEST['j']);
    $id_sent = preg_replace("/[^0-9a-zA-Z]/","",$_REQUEST['q']);
    $ip_num = preg_replace("/[^0-9.]/","",$_REQUEST['t']);
    $units = preg_replace("/[^0-9]/","",$_REQUEST['c']);
    $ip = $_SERVER['REMOTE_ADDR'];
    $referer = $_SERVER['HTTP_REFERER'];
    if ($vote_sent > $units) die("Sorry, vote appears to be invalid."); // kill the script because normal users will never see this.
    //connecting to the database to get some information
    $query = mysql_query("SELECT total_votes, total_value, used_ips FROM $rating_dbname.$rating_tableName WHERE id='$id_sent' ")or die(" Error: ".mysql_error());
    $numbers = mysql_fetch_assoc($query);
    $checkIP = unserialize($numbers['used_ips']);
    $count = $numbers['total_votes']; //how many votes total
    $current_rating = $numbers['total_value']; //total number of rating added together and stored
    $sum = $vote_sent+$current_rating; // add together the current vote value and the total vote value
    $tense = ($count==1) ? "vote" : "votes"; //plural form votes/vote
    // checking to see if the first vote has been tallied
    // or increment the current number of votes
    ($sum==0 ? $added=0 : $added=$count+1);
    // if it is an array i.e. already has entries the push in another value
    ((is_array($checkIP)) ? array_push($checkIP,$ip_num) : $checkIP=array($ip_num));
    $insertip=serialize($checkIP);
    //IP check when voting
    $voted=mysql_num_rows(mysql_query("SELECT used_ips FROM $rating_dbname.$rating_tableName WHERE used_ips LIKE '%".$ip."%' AND id='".$id_sent."' "));
    if(!$voted) { //if the user hasn't yet voted, then vote normally...

    if (($vote_sent >= 1 && $vote_sent <= $units) && ($ip == $ip_num)) { // keep votes within range
    $update = "UPDATE $rating_dbname.$rating_tableName SET total_votes='".$added."', total_value='".$sum."', used_ips='".$insertip."' WHERE id='$id_sent'";
    $result = mysql_query($update);
    }
    header("Location: $referer"); // go back to the page we came from
    exit;
    } //end for the "if(!$voted)"[/php]


  • User

    Nel secondo sorgente che hai postato c'è questa procedura:
    [PHP]
    //IP check when voting
    $voted=mysql_num_rows(mysql_query("SELECT used_ips FROM $rating_dbname.$rating_tableName WHERE used_ips LIKE '%".$ip."%' AND id='".$id_sent."' "));
    if(!$voted) { //if the user hasn't yet voted, then vote normally...
    if (($vote_sent >= 1 && $vote_sent <= $units) && ($ip == $ip_num)) { // keep votes within range, make sure IP matches - no monkey business!
    $update = "UPDATE $rating_dbname.$rating_tableName SET total_votes='".$added."', total_value='".$sum."', used_ips='".$insertip."' WHERE id='$id_sent'";
    $result = mysql_query($update);
    }
    }[/PHP]

    Questo è la parte che si occupa di aggiornare il voto in caso lo user ancora deve farlo e controlla solo per ip ed id_sent (quest'ultimo penso si tratti del'id primario della tabella e, quindi, penso si riferisca a localizzare la votazione)
    Indi per cui devi togliere il controllo per ip ed aggiungere quello per id giuria che al momento non salvi neanche all'atto effettivo del voto (la seconda query mostrata nello spezzone copiato).

    ps: hai creato un campo dedicato nella tabella in questione per salvare anche l'id giuria ?


  • User Attivo

    Grazie, stasera ci provo (ora sono a lavoro!)
    Una curiosità però...
    nella seconda parte c'è questo:

    [PHP]
    $ip_num = preg_replace("/[^0-9.]/","",$_REQUEST['t']);
    [/PHP]

    che credo c'entri con la parte che devo modificare io, ma non so come funzionano le regular expression...
    devo modificare anche questo o no?


  • User

    Se elimini i controlli per ip, quello non ti servirà più a nulla: a quanto ho capito dal codice lui per ogni user si segna più ip e con quello riconosce degli ip che gli vengono passati in qualche maniera ma non so ne come ne quando.

    In sostanza comunque se rimpiazzi nelle clausole di ricerca delle query il match per ip includendo invece, al loro posto, quello per id giuria e non ti dovrebbe dare grossi problemi, inoltre hai il vantaggio di avere id giuria in una variabile superglobale per cui non ti serve sostituirla da qualche parte o farla influenzare dai controlli di altre variabili, puoi "innestare" direttamente tutto nella query con la concatenazione delle stringe:
    [php]$sql = "SELECT blaa bla bla bla WHERE id_giuria = '".$_SESSION['id_giuria']."' id = ...... ";[/php]
    Spero di aver portato più chiarezza, tienimi aggiornato in caso di sviluppi 😉


  • User Attivo

    Mmm... quest'ultima cosa che hai scritto mi mette in crisi... "variabile superglobale" e "concatenazione delle stringhe"... mmm...
    Sembrava più facile! 🙂
    Comunque ok, ci proverò stasera... Ora finchè non provo ti faccio perdere solo tempo con domande inutili!
    Grazie mille davvero, domattina ti farò sapere!


  • User

    No-Problem: per me è un piacere 🙂

    Per variabile superglobale s'intende semplicemente un particolare tipo di variabile che può essere richiamata in ogni contesto.

    Per concatenazione delle stringhe, s'intende la possibilità di unire più stringhe tra loro usando il puntino.

    example:
    [php]$someday = "Domenica";
    $text = "Oggi è ".$someday; // aggiungiamo il contenuto di someday alla frase "Oggi è "

    echo $text; // e stamperemo "Oggi è Domenica"[/php]Molto concettualmente questo, inoltre puoi concatenare la stringa sia tra due testi, che tra due variabili ed in qualsiasi posizione.

    another example:
    [php]$text = "Ciao, "."mi chiamo"." Salvatore";

    echo $text; // stamperà "Ciao, mi chiamo Salvatore"

    $who = "Mario, ";
    $what = "segnati questo numero di telefono";

    $text = $who.$what;

    echo $text; // stamperà "Mario, segnati questo numero di telefono"
    [/php]


  • User Attivo

    Salve a tutti.
    Anche io sto usando aiax star rater v122 e vorrei capire una cosa.
    Il codice che vedete postato sopra non permette di effettuare più voti da parte dello stesso utente.
    Questo vincolo però vale per tutti i computer che si collegano sulla stessa linea adsl. Quindi se voto con un computer, non potrò rivotare con un altro computer di casa.
    Come posso modificare questa funzione e far si che non si possa votare più di una volta solo se si usa lo stesso computer?

    Rosanna