用PHP、MySQL、Jquery和Ajax创建五星评级系统

用PHP、MySQL、Jquery和Ajax创建五星评级系统,php,jquery,mysql,ajax,rating-system,Php,Jquery,Mysql,Ajax,Rating System,我已经下载了本教程,但出现以下错误: 注意:第37行C:\xampp\htdocs\rating\rating.php中的未定义变量:rat 注意:第41行C:\xampp\htdocs\rating\rating.php中的未定义变量:v <?php include("settings.php"); connect(); $ids=array(1,2,3); ?> <html> <head> <script src="jquery.js" type="

我已经下载了本教程,但出现以下错误:

注意:第37行C:\xampp\htdocs\rating\rating.php中的未定义变量:rat

注意:第41行C:\xampp\htdocs\rating\rating.php中的未定义变量:v

<?php
include("settings.php");
connect();
$ids=array(1,2,3);
?>
<html>
<head>
<script src="jquery.js" type="text/javascript"></script>
    <link rel="stylesheet" href="rating.css" />
<script type="text/javascript" src="rating.js"></script>
</head>
<body>
 <?php
 for($i=0;$i<count($ids);$i++)
{
    $rating_tableName     = 'ratings';
 $id=$ids[$i];
 $q="SELECT total_votes, total_value FROM $rating_tableName WHERE id=$id";
$r=mysql_query($q);
if(!$r) echo mysql_error();
while($row=mysql_fetch_array($r))
{
$v=$row['total_votes'];
$tv=$row['total_value'];
$rat=$tv/$v;

}



$j=$i+1;
$id=$ids[$i];
echo'<div class="product">
       Rate Item '.$j.'
        <div id="rating_'.$id.'" class="ratings">';
            for($k=1;$k<6;$k++){
                if($rat+0.5>$k)$class="star_".$k."  ratings_stars ratings_vote";
                else $class="star_".$k." ratings_stars   ratings_blank";
                echo '<div class="'.$class.'"></div>';
                }
            echo' <div class="total_votes"><p class="voted"> Rating:     <strong>'.@number_format($rat).'</strong>/5 ('.$v. '  vote(s) cast) 
        </div>
    </div></div>';}
 ?>
</body></html>

问题在于这些变量的作用域。当您试图在while循环之外回显这些变量时;PHP无法找到变量,因为它们是在循环中创建(和分配)的。要解决此问题,只需为外部的两个变量指定一个空白值:

if(!$r) echo mysql_error();
$rat = 0;
$v = 1;    // In case there are no records.
while($row=mysql_fetch_array($r))
{
    $v = $row['total_votes'];
    $tv = $row['total_value'];
    $rat = $tv/$v;
}

$rat
$v
正在
while
循环的范围内定义

如果全局声明它们(在循环之外),那么代码的其余部分将识别它们

$rat = 0;
$v = 1;
while($row=mysql_fetch_array($r))
{
    $v=$row['total_votes'];
    $tv=$row['total_value'];
    $rat=$tv/$v;
}

在代码开头的第行添加此项,以避免代码中出现错误

error_reporting(E_ALL ^ E_NOTICE);
大多数情况下,通知错误不会影响程序。 如果您的投票未被记录,请删除您的Cookie并尝试从不同的IP地址进行投票。此脚本具有不接受来自同一IP或vistitor的投票的功能,以避免同一用户对同一产品进行多次投票。

请参阅此处:

这结合了一个Javascript代码,该代码生成了不同评级的URL,以及评级前后星星显示的变化

在给出评级后会显示一个叠加DIV,这样就不会立即给出相同的评级。它还将用户的IP地址与评级提交一起存储,以防止来自一个用户的多个评级

这是一个简单易用的脚本,仅使用Javascript和PHP进行星级评定。

var cname=document.getElementById(id).className;
  var cname=document.getElementById(id).className;
  var ab=document.getElementById(id+"_hidden").value;
  document.getElementById(cname+"rating").innerHTML=ab;

  for(var i=ab;i>=1;i--)
  {
     document.getElementById(cname+i).src="star2.png";
  }
  var id=parseInt(ab)+1;
  for(var j=id;j<=5;j++)
  {
     document.getElementById(cname+j).src="star1.png";
  }
var ab=document.getElementById(id+“_hidden”).value; document.getElementById(cname+“rating”).innerHTML=ab; 对于(变量i=ab;i>=1;i--) { document.getElementById(cname+i).src=“star2.png”; } var-id=parseInt(ab)+1; 对于(var j=id;j

.明星{
字号:x大号;
宽度:50px;
显示:内联块;
颜色:灰色;
}
明星:最后一个孩子{
右边距:0;
}
明星:以前{
内容:'\2605';
}
星空{
颜色:红色;
}
半:之后{
内容:'\2605';
颜色:红色;
位置:绝对位置;
左边距:-20px;
宽度:10px;
溢出:隐藏;
}

无论何时,请不要忘记提及您正在使用的框架(我编辑了这个问题的标签以反映您的问题)。这一点很重要,因为stackoverflow的标记过滤系统依赖于此。谢谢。您可以回送
$q
并确认是否有返回行吗?
$rat
如果记录集为空,则不会初始化。
$v
)我做到了,它向我展示了:从id=1Ok的评分中选择total_votes,total_value,我想你也在mysql客户端中手动检查了这个查询?我认为这些变量应该被初始化,即使没有找到任何记录。明白我的意思吗?是的,我在关注你,感谢你的帮助,它现在工作很酷,它工作了,但它不是t记录投票,我该怎么做?很酷,它起作用了,但它没有记录投票,我该怎么做?–@John更多地阅读了有关恒星系统的内容。虽然这段代码可能回答了这个问题,但提供了关于如何和/或为什么解决问题的额外上下文将提高答案的长期价值。
<style>
.star {
    font-size: x-large;
    width: 50px;
    display: inline-block;
    color: gray;
}
.star:last-child {
    margin-right: 0;
}
.star:before {
    content:'\2605';
}
.star.on {
    color: red;
}
.star.half:after {
    content:'\2605';
    color: red;
    position: absolute;
    margin-left: -20px;
    width: 10px;
    overflow: hidden;
}
</style>
<div class="stars"> 
<?php 
    $enable = 5.5;  //enter how many stars to enable
    $max_stars = 6; //enter maximum no.of stars
    $star_rate = is_int($enable) ? 1 : 0;
    for ($i = 1; $i <= $max_stars; $i++){ ?>
    <?php if(round($enable) == $i && !$star_rate) { ?>
            <span class="<?php echo 'star half'; ?>"></span>
    <?php } elseif(round($enable) >= $i) { ?>
            <span class="<?php echo 'star on'; ?>"></span>
    <?php } else { ?>
        <span class="<?php echo 'star'; ?>"></span>
    <?php } 
    }?>
</div>