Seite 1 von 1
Ajax Star Rating - IP Sperre raus nehmen
Verfasst: 29.09.2011, 11:13
von pwehrmann
Moin, hab mir gestern auf meiner Seite das Ajax Star Rating installiert.
Jetzt ist aber das Problem, das jede IP nur einmal bewerten darf. Was natürlich blöd ist, da ich das Script als Foto-Bewertung nehme und möchte, das jedes Bild einmal bewertet werden darf.
Rausgefunden hab ich bisher, das die Sperre in der rpc.php definiert ist. Den Codeblock komplett rausnehmen bringt nix.
Hat da jemand Erfahrung mit?
Soll ich hier mal den kompletten Code der rpc.php posten zum drüber gucken?
Gruss
Verfasst:
von
SEO Consulting bei
ABAKUS Internet Marketing Erfahrung seit 2002
- persönliche Betreuung
- individuelle Beratung
- kompetente Umsetzung
Jetzt anfragen:
0511 / 300325-0.
Verfasst: 29.09.2011, 11:57
von Synonym
Soll ich hier mal den kompletten Code der rpc.php posten zum drüber gucken?
Was sicherlich nicht verkehrt wäre... ich hab hier eine rpc.php, die hat mit Sternen und Bewertungen aber nichts zu tun

Verfasst: 29.09.2011, 12:14
von pwehrmann
Okidoki

Hab bisher ein wenig rumprobiert, wie z.B. das statt der IP eine Zufallszahl eingetragen wird, aber selbst dann kann man nur einmal voten. Also nur ein einziges Bild von meinen ca 1200 Bildern.
Code: Alles auswählen
<?php
/*
Page: rpc.php
Created: Aug 2006
Last Mod: Mar 18 2007
This page handles the 'AJAX' type response if the user
has Javascript enabled.
---------------------------------------------------------
ryan masuga, masugadesign.com
ryan@masugadesign.com
Licensed under a Creative Commons Attribution 3.0 License.
http://creativecommons.org/licenses/by/3.0/
See readme.txt for full credit details.
--------------------------------------------------------- */
header("Cache-Control: no-cache");
header("Pragma: nocache");
require('_config-rating.php'); // get the db connection info
//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;
?>

Verfasst: 29.09.2011, 13:34
von Synonym
ok, da komme ich so auch nicht weiter. Ich würde sagen, dass man da durchaus mehrfach vote kann, zumindest erklärt sich mir das "WHERE used_ips LIKE '%".$ip."%' AND id='".$id_sent."' "" so. Die IP ist da erst mal egal, wenn id_sent ein anderer Wert ist.
Doch der kommt aus $_REQUEST['q'] und davon ist im Script nichts zu sehen. Wäre also die Frage, wie das andere Script aussieht, das die Daten sendet. Das hier empfängt ja nur.
Verfasst: 29.09.2011, 14:09
von pwehrmann
Hm, grad mall alle Dateien durchgeschaut, da ist nix wirklich drin.
Als ID wird immer der Name des Bildes genommen. So sieht die Datenbank aus für die Bewertung:

Verfasst: 29.09.2011, 14:20
von pwehrmann
Edit: Falsch, hier kommen die Daten her
Code: Alles auswählen
<?php
/*
Page: _drawrating.php
Created: Aug 2006
Last Mod: Mar 18 2007
The function that draws the rating bar.
---------------------------------------------------------
ryan masuga, masugadesign.com
ryan@masugadesign.com
Licensed under a Creative Commons Attribution 3.0 License.
http://creativecommons.org/licenses/by/3.0/
See readme.txt for full credit details.
--------------------------------------------------------- */
function rating_bar($id,$units='',$static='') {
require('_config-rating.php'); // get the db connection info
//set some variables
$ip = $_SERVER['REMOTE_ADDR'];
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());
// insert the id in the DB if it doesn't exist already
// see: http://www.masugadesign.com/the-lab/scripts/unobtrusive-ajax-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"> ('.$count.' '.$tense.') <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.='> ('.$count.' '.$tense.')';
$rater.=' </p>';
$rater.='</div>';
$rater.='</div>';
return $rater;
}
}
?>
Verfasst: 30.09.2011, 07:34
von Synonym
Als ID wird immer der Name des Bildes genommen.
So hatte ich das auch verstanden. Also müsste man verschiedene Bilder mit der gleichen IP bewerten können, denn die ID wird bei der SQL-Abfrage berücksichtigt.
Aber so kommen wir nicht weiter, zumindest ich nicht. Aus dem ersten File sind die ganzen $_REQUEST unbekannt. Irgendwo müssen die gesendet werden.
Das zweite Script für auch zu keiner Sperre, wenn IP oder ID verschieden sind. Aber auch hier sieht man nicht, wo die ID her kommt und wie die dann aussieht.
Irgendwo muss die Funktion "function rating_bar($id,$units='',$static='')" aufgerufen werden und da kommt auch die ID dann her.
Verfasst: 30.09.2011, 07:41
von Synonym
Nachtrag:
Da kommen die $_REQUESTS her:
Code: Alles auswählen
$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>';
IP wird ermittelt
ncoutn wird berechnet
id wird von Dir an die Funktion übergeben
units ist Systemvorgabe oder auch der Funktion übergeben
1. Also sehe ich da nur zwei Punkte. Das Script hat Fehler.
oder
2. Du übergibst falsche Werte an die Funktion
Verfasst: 30.09.2011, 07:45
von Synonym
Klickt man auf einen Stern, dann geht der Request an die db.php. Dort werden die Daten ausgewertet und dann mit der DB verglichen:
$voted=mysql_num_rows(mysql_query("SELECT used_ips FROM $rating_dbname.$rating_tableName WHERE used_ips LIKE '%".$ip."%' AND id='".$id_sent."' "));
Und hier müssen IP und ID wieder beide stimmen, sonst zählt der Voter als neuer und wird gewertet. Also kann ich mir da nur vorstellen, dass Du eine falsche ID sendest.
Verfasst: 30.09.2011, 10:47
von pwehrmann
Also irgendwie komm ich da gar nicht weiter, mittlerweile können nicht mal andere User voten, ohne das ich was geändert habe. Die ID kann man doch irgendwie gar nicht falsch übergeben, sie wird in der Datenbank ja auch richtig zugeordnet. Das komische, ich hatte vor längerer Zeit dieses Script schon mal problemlos auf einer anderen Seite genutzt, da ging es problemlos.
https://masugadesign.com/software/unobt ... ating-bar/
Verfasst: 30.09.2011, 11:59
von Synonym
Ich habe mir das Script schon angesehen. Aber ohne die Informationen (die immer noch fehlen) kann ich keine Antwort geben.
"Die ID kann man doch irgendwie gar nicht falsch übergeben"
Das ist keine Antwort. Denn ich vermute genau hier den Fehler. Das Update des Datensatzes braucht nur die ID und die IP. Also muss davon was falsch sein oder die DB Verbindung geht nicht - dann könnte man aber gar nicht voten - auch nicht einmal.
"Also irgendwie komm ich da gar nicht weiter, mittlerweile können nicht mal andere User voten"
Das spricht noch mehr für einen Benutzerfehler.
Scripte funktionieren oder funktionieren nicht. Die suchen sich das aber nicht nach belieben aus - zumindest nicht so einfache.
Nenn doch einfach schon mal die Seite, auf der das Script eingebunden ist - dann kann man sich das schon mal ansehen.
Dann einen DB-Export mit mehr als einem Datensatz. 5-10 wären da schon sinnvoll.
Auch möglich: Du hast keine IP aus dem IPv4-Bereich, sondern aus v6, dann könnte das Script durchaus Probleme machen. Es erwartet bei der IP nämlich eine Ziffernfolge aus 0 bis 9.
Verfasst: 30.09.2011, 18:53
von pwehrmann
Danke für deine Geduld erstmal
Ich setz mich Montag wieder mit dem Script auseinander. Jetzt übers Wochenende ist schlecht, Besuche und so und mal den Kopf frei kriegen:
Habs auch erstmal ausgebaut, aber ich schick dir gleich per PN ein paar Infos.
Verfasst: 01.10.2011, 07:55
von Synonym
Habs auch erstmal ausgebaut, aber ich schick dir gleich per PN ein paar Infos.
Ah, danke... Auf den beiden Seiten war ich schon gestern mittag. Auf der einen ist ein Script, aber ein anderes, auf der anderen Seite hatte ich gar keine Bewertungen gefunden. Nun auch nicht.
Aber ist ja ausgebaut. Das ist natürlich gut zu wissen und die beste Voraussetzung, sich das live anzusehen.
Ach ja, in der PM stand davon aber nichts. Hätte ich mir die letzten 30 Minuten ja auch sparen können. Dachte ich wäre blind und sehe es nur nicht.
