5 Star Rating System
Maeggi
- php
Hallo leute,
ich habe ein problem mit dem 5 Star Rating System. Das rating system wird richtig angezeigt alles okay. nur wenn man auf rate drück springt er auf die startseite um und bewertet auch nicht. Kann mir jemand sagen wie ich das ändern kann? könnt ihr hier selber testen.
auf meiner HP http://www.lachen-garantiert.de/ und dann oben rechts auf test.
hier habe ich den php script her. da ist auch der code des scripts.
http://gr0w.com/articles/code/php_5_star_rating_system_using_hreview/
ich hoffe mir kann jemand sagen woran das liegt.
wünsche euch noch ein wunder schönen abend.
mfg maeggi
also das rating besteht aus. 2 php dateien und die eine also die rater.php ist die haupt php. ich poste die hier mal. ist vieleicht einfacher.
rater.php
<?
// User settings
$rater_ip_voting_restriction = true; // restrict ip address voting (true or false)
$rater_ip_vote_qty=1; // how many times an ip address can vote
$rater_already_rated_msg="You have already rated this item. You were allowed ".$rater_ip_vote_qty." vote(s).";
$rater_not_selected_msg="You have not selected a rating value.";
$rater_thankyou_msg="Thankyou for voting.";
$rater_generic_text="this item"; // generic item text
$rater_end_of_line_char="\n"; // may want to change for different operating systems
if(!isset($rater_id)) $rater_id=1;
if(!isset($rater_item_name)) $rater_item_name=$rater_generic_text;
// DO NOT MODIFY BELOW THIS LINE
$rater_filename='item_'.$rater_id.".rating";
$rater_rating=0;
$rater_stars="";
$rater_stars_txt="";
$rater_rating=0;
$rater_votes=0;
$rater_msg="";
// Rating action
if(isset($_REQUEST["rate".$rater_id])){
if(isset($_REQUEST["rating_".$rater_id])){
while(list($key,$val)=each($_REQUEST["rating_".$rater_id])){
$rater_rating=$val;
}
$rater_ip = getenv("REMOTE_ADDR");
$rater_file=fopen($rater_filename,"a+");
$rater_str="";
$rater_str = rtrim(fread($rater_file, 1024*8),$rater_end_of_line_char);
if($rater_str!=""){
if($rater_ip_voting_restriction){
$rater_data=explode($rater_end_of_line_char,$rater_str);
$rater_ip_vote_count=0;
foreach($rater_data as $d){
$rater_tmp=explode("|",$d);
$rater_oldip=str_replace($rater_end_of_line_char,"",$rater_tmp[1]);
if($rater_ip==$rater_oldip){
$rater_ip_vote_count++;
}
}
if($rater_ip_vote_count > ($rater_ip_vote_qty - 1)){
$rater_msg=$rater_already_rated_msg;
}else{
fwrite($rater_file,$rater_rating."|".$rater_ip.$rater_end_of_line_char);
$rater_msg=$rater_thankyou_msg;
}
}else{
fwrite($rater_file,$rater_rating."|".$rater_ip.$rater_end_of_line_char);
$rater_msg=$rater_thankyou_msg;
}
}else{
fwrite($rater_file,$rater_rating."|".$rater_ip.$rater_end_of_line_char);
$rater_msg=$rater_thankyou_msg;
}
fclose($rater_file);
}else{
$rater_msg=$rater_not_selected_msg;
}
}
// Get current rating
if(is_file($rater_filename)){
$rater_file=fopen($rater_filename,"r");
$rater_str="";
$rater_str = fread($rater_file, 1024*8);
if($rater_str!=""){
$rater_data=explode($rater_end_of_line_char,$rater_str);
$rater_votes=count($rater_data)-1;
$rater_sum=0;
foreach($rater_data as $d){
$d=explode("|",$d);
$rater_sum+=$d[0];
}
$rater_rating=number_format(($rater_sum/$rater_votes), 2, '.', '');
}
fclose($rater_file);
}else{
$rater_file=fopen($rater_filename,"w");
fclose($rater_file);
}
// Assign star image
if ($rater_rating <= 0 ){$rater_stars = "./img/00star.gif";$rater_stars_txt="Not Rated";}
if ($rater_rating >= 0.5){$rater_stars = "./img/05star.gif";$rater_stars_txt="0.5";}
if ($rater_rating >= 1 ){$rater_stars = "./img/1star.gif";$rater_stars_txt="1";}
if ($rater_rating >= 1.5){$rater_stars = "./img/15star.gif";$rater_stars_txt="1.5";}
if ($rater_rating >= 2 ){$rater_stars = "./img/2star.gif";$rater_stars_txt="2";}
if ($rater_rating >= 2.5){$rater_stars = "./img/25star.gif";$rater_stars_txt="2.5";}
if ($rater_rating >= 3 ){$rater_stars = "./img/3star.gif";$rater_stars_txt="3";}
if ($rater_rating >= 3.5){$rater_stars = "./img/35star.gif";$rater_stars_txt="3.5";}
if ($rater_rating >= 4 ){$rater_stars = "./img/4star.gif";$rater_stars_txt="4";}
if ($rater_rating >= 4.5){$rater_stars = "./img/45star.gif";$rater_stars_txt="4.5";}
if ($rater_rating >= 5 ){$rater_stars = "./img/5star.gif";$rater_stars_txt="5";}
// Output
echo '<div class="hreview">';
echo '<form method="post" action="'.$_SERVER["PHP_SELF"].'">';
echo '<h3 class="item">Rate <span class="fn">'.$rater_item_name.'</span></h3>';
echo '<div>';
echo '<span class="rating"><img src="'.$rater_stars.'?x='.uniqid((double)microtime()*1000000,1).'" alt="'.$rater_stars_txt.' stars" /> Ave. rating: '.$rater_stars_txt.'</span> from <span class="reviewcount"> '.$rater_votes.' votes</span>.';
echo '</div>';
echo '<div>';
echo '<label for="rate5_'.$rater_id.'"><input type="radio" value="5" name="rating_'.$rater_id.'[]" id="rate5_'.$rater_id.'" />Excellent</label>';
echo '<label for="rate4_'.$rater_id.'"><input type="radio" value="4" name="rating_'.$rater_id.'[]" id="rate4_'.$rater_id.'" />Very Good</label>';
echo '<label for="rate3_'.$rater_id.'"><input type="radio" value="3" name="rating_'.$rater_id.'[]" id="rate3_'.$rater_id.'" />Good</label>';
echo '<label for="rate2_'.$rater_id.'"><input type="radio" value="2" name="rating_'.$rater_id.'[]" id="rate2_'.$rater_id.'" />Fair</label>';
echo '<label for="rate1_'.$rater_id.'"><input type="radio" value="1" name="rating_'.$rater_id.'[]" id="rate1_'.$rater_id.'" />Poor</label>';
echo '<input type="hidden" name="rs_id" value="'.$rater_id.'" />';
echo '<input type="submit" name="rate'.$rater_id.'" value="Rate" />';
echo '</div>';
if($rater_msg!="") echo "<div>".$rater_msg."</div>";
echo '</form>';
echo '</div>';
?>
und hier die andere php datei test.php womit man den bewertungsscript einbindet.
test.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
</head>
<body>
<?
$rater_id=1;
$rater_item_name='Item 1';
include("rater.php");
?>
<?
$rater_id=2;
$rater_item_name='Item 2';
include("rater.php");
?>
</body>
</html>
ich hhoffe ihr könnt damit was anfangen. mein problem ist ja nur das er das nciht speichert, weil wenn man auf den rate button klick, die startseite geladen wird. ich habe in den php dateien nichts gefunden damit ich das ändern kann. mus auch sagen das meine php kenntnisse noch in der sandkiste liegen. ich habe den script auch mit joomla eingebunden, vieleicht liegt das auch daran. was ich eher auch glaube. aber bin mir halt nicht sicher. sonst würde ich mein problem ja nicht hier posten und würde das alleine machen *G* ich hoffe mir kann jemand dabei helfen.
mfg maeggi
Ich habe mein Porblem behoben. man muss in der rater.php vor
echo '</form>';
diesen code einbinden.
if(isset($_REQUEST["option"])) echo '<input type="hidden" name="option" value="'.$_REQUEST["option"].'" />';
if(isset($_REQUEST["task"])) echo '<input type="hidden" name="task" value="'.$_REQUEST["task"].'" />';
if(isset($_REQUEST["id"])) echo '<input type="hidden" name="id" value="'.$_REQUEST["id"].'" />';
if(isset($_REQUEST["Itemid"])) echo '<input type="hidden" name="Itemid" value="'.$_REQUEST["Itemid"].'" />';
dann funkioniert es.
habe aber noch ein problem. ich möchte den button rate unter die wertung setzen in moment ist der button neben bewertung schlecht.Und ich möchte den button zentriert darnter setzen. weiß jemand wie ich das anstelle?
mfg maeggi
Du antwortest Dir ja immer brav selbst. Warum sollten wir Dir also helfen?
;-)
Den Button bekommst du am einfachsten natuerlich mit einem <br>eine Zeile runter. Das ist aber unschoen und noch lange nicht zentriert. Also lassen wir das.
Es sieht ja so aus, als ob Du mehrere der Ratings auf einer Seite hast. Deshalb kannst Du deinen 'Buttons' (eigentlich sind es ja Inputs) eine Klasse geben. Dieser Klasse verpasst Du per CSS einen Block und mit Margin die Zentrierung. Schon rutscht der Button eine Zeile runter und zentriert in dem Div, dass um das Rating rumliegt, aber natuerlich nicht automatisch unter den Checkboxen. Die Zeile mit den Checkboxen kann ja kuerzer sein, als das Div, das ja automatisch die ganze, zur Verfuegung stehende, Breite nutzt.
hallo,
danke das mit dem css hat wunderbar funkioniert. hat ein bissel gedauert aber es klappt. habe da noch eine frage. das rating system speichert das bewerten ja in einem dokument. das heist ich muss für jeden neuen bewertungs typ. also zb.
rating id 1
rating id 2
rating id 3
usw. immer ein neues dokument erstellen mit der id. also:
item_1
item_2
item_3
usw.
kann man das nicht so machen das er das in einem dokument speichert?ist nähmlich sehr umständlich. ich möchte nähmlich mehr bewerten als nur so ca. 10 mal am ende komme ich so ca an 1000 mal und das ist schon umständlich wenn ich da 1000 mal ein dokument erstellen muss. und die denn noch alle aufm server habe. ich weiß das man das machen kann. nur habe ich leider nicht die efahrung in php um das selber zu realisieren. ich danke euch für eure hilfe.
wünsche euch noch einen schönen tag.
mfg maeggi
Hi.
Warum hast Du was gegen n Dokumente?
Ja sicher geht das. Du muesstest den Code so schreiben, dass er den Inhalt der Datei so markiert, dass er die Bewertungen auseinanderhalten kann. Dann muesstest Du noch dafuer sorgen, dass er beim Lesen und schreiben der Bewertungen das ganze Dokument nach der entsprechenden Bewertung durchsucht und beim Schreiben auch noch die Daten irgendwie einfuegen statt einfach zu speichern. Alles in allem ein Mehraufwand fuer dich und den Server.
1000 Dokumente sind auch nicht viel schlimmer als 1 Dokument mit 1000x Inhalt. Ich wuerde sogar soweit gehen, dass Dein Server lieber ein kleines von 1000 Dokumenten bearbeitet als in einem grossen ein paar Daten zu suchen oder ersetzen. Du muesstest jedesmal ein riesiges Dokument neu schreiben. (Worauf eventuell erst alle User warten muessen, die auch grad Bewertungen abrufen oder abgeben wollen - oder du bekommst ein ziemeliches Durcheinander weil alle die anderen ueberschreiben.)
Dafuer hat man Datenbanken erfunden. Die sind darauf spezialisiert genau das zu machen.
Solltest Du keine Datenbank zur Verfuegung haben, tendiere ich eher zu folgender Loesung: Du laesst die 1000 kleinen Dokumente und schreibst Dir ein kleines Tool, das bei Bedarf die n Dokumente fuer dich zusammenfasst. Da kannste dann auch gleich fuer lesbaren Output uns eventuell noetige Zusammenfassungen sorgen.