Создание 5-звездочной рейтинговой системы с помощью PHP, MySQL, Jquery и Ajax

Я скачал этот учебник http://megarush.net/5-star-rating-system-with-php-mysql-jquery-and-ajax/, но я получаю следующие ошибки:

Примечание. Неопределенная переменная: rat в C:\xampp\htdocs\rating\rating.php в строке 37.

Примечание. Неопределенная переменная: v в C:\xampp\htdocs\rating\rating.php в строке 41.

<?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>

person John    schedule 08.06.2013    source источник
comment
Пожалуйста, не забывайте упоминать структуру, с которой вы работаете, всякий раз, когда вы это делаете (я отредактировал теги этого вопроса, чтобы отразить ваши). Это важно, поскольку на этом основана система фильтрации тегов stackoverflow. Спасибо.   -  person Sebas    schedule 09.06.2013
comment
Не могли бы вы повторить $q и подтвердить, есть ли возвращенные строки? $rat не будет инициализирован, если набор записей пуст. (то же относится и к $v)   -  person Sebas    schedule 09.06.2013
comment
Я сделал это, и это показывает мне это: SELECT total_votes, total_value FROM ratings WHERE id=1   -  person John    schedule 09.06.2013
comment
Хорошо, я полагаю, вы также вручную проверили этот запрос в своем клиенте MySQL? Я думаю, что эти переменные должны быть инициализированы в любом случае, даже если запись не найдена. Видите мою точку зрения?   -  person Sebas    schedule 09.06.2013
comment
да, я слежу за тобой, спасибо за помощь, теперь все работает   -  person John    schedule 09.06.2013


Ответы (5)


Проблема связана с областью действия этих переменных. Когда вы пытаетесь повторить эти переменные вне цикла 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;
}
person hjpotter92    schedule 08.06.2013
comment
круто, заработало, но голоса не записываются, что делать? – - person John; 09.06.2013
comment
@John Прочтите еще немного о звездной системе. - person hjpotter92; 09.06.2013

$rat и $v определяются в рамках вашего цикла while.

Если вы объявите их глобально (вне цикла), остальная часть вашего кода распознает их.

$rat = 0;
$v = 1;
while($row=mysql_fetch_array($r))
{
    $v=$row['total_votes'];
    $tv=$row['total_value'];
    $rat=$tv/$v;
}
person faide    schedule 08.06.2013
comment
круто, заработало, но голоса не записываются, что делать? - person John; 09.06.2013

См. здесь: http://bgallz.org/988/javascript-php-star-rating-script/

Это сочетает в себе код Javascript, который генерирует URL-адрес для различных оценок, а также изменение отображения звезд до и после присвоения оценки.

Оверлей DIV отображается после присвоения рейтинга, поэтому он не может дать немедленных рейтингов. Он также сохраняет IP-адрес пользователя с отправкой рейтинга, чтобы предотвратить несколько рейтингов от одного пользователя.

Это простой и легкий в использовании скрипт, содержащий только Javascript и PHP для звездного рейтинга.

person bgallz    schedule 30.09.2013

Добавьте это в начале строки, чтобы заметить ошибку в вашем коде.

error_reporting(E_ALL ^ E_NOTICE);

В большинстве случаев ошибка уведомления не влияет на программу. В случае, если ваши голоса не записываются, удалите файлы cookie и попробуйте проголосовать с другого IP-адреса. В этом скрипте есть функция, позволяющая не принимать голоса с одного и того же IP-адреса или посетителя, чтобы избежать нескольких голосов одними и теми же пользователями по одному и тому же продукту.

person amit    schedule 09.06.2013

  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";
  }

Код с http://talkerscode.com/webtricks/star-rating-system-using-php-and-javascript.php

person rahul    schedule 26.02.2016
comment
Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. - person mech; 26.02.2016