Система рейтинга

peretc001

Новичок
Добрый день.

Помогите сделать рейтинг.

У меня есть форма которая записывает кол-во голосов:
PHP:
<form action="inc/otziv.php" method="post">
	<input type="hidden" name="id" value="123"/>
	<p>Имя: <input type="text" name="username"/>
	<p>Ваша оценка:</p>
	<ul>
		<li><input type="radio" name="total_value" value="1">1
		<li><input type="radio" name="total_value" value="2">2
		<li><input type="radio" name="total_value" value="3">3
		<li><input type="radio" name="total_value" value="4">4
		<li><input type="radio" name="total_value" value="5">5
	</ul>
	<br>
	<p>Отзыв: <textarea rows="5" cols="5" name="msg"></textarea>
	<input name="button" type="submit" value="Добавить">
</form>

Есть скрипт который записывает в базу:
PHP:
INSERT INTO otziv (id, username, total_value, total_votes, msg) VALUES ('$_POST[id]', '$_POST[username]', '$_POST[total_value]', '1', '$_POST[msg]' )
Вопрос как посчитать общий рейтинг? Я так думаю SUM(total_value) / SUM(total_votes). Но тогда значение может быть не целое, а например 4.5, тогда возникает второй вопрос, как вывести 4.5 звездочки
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Нарисовать половинки звездочки и вывести 4 целых и одну половинку, либо хитро залить градиентом, либо еще 100500 возможных вариантов, но тебе бы разобраться с тем, что у тебя в коде творится, а не звездочки рисовать
 

peretc001

Новичок
Вывожу рейтинг одного проголосовавшего:
PHP:
<dl class="star-rating">
	<ol>
		<?php  if ($row['total_value'] == '1' ) { echo '<li class="current" style="width:20px"><span>Ужасно</span></li>'; } else { echo '<li><span>Ужасно</span></li>'; } ?>
		<?php  if ($row['total_value'] == '2' ) { echo '<li class="current" style="width:40px"><span>Плохо</span></li>'; } else { echo '<li><span>Плохо</span></li>'; } ?>
		<?php  if ($row['total_value'] == '3' ) { echo '<li class="current" style="width:60px"><span>Нормально</span></li>'; } else { echo '<li><span>Нормально</span></li>'; } ?>
		<?php  if ($row['total_value'] == '4' ) { echo '<li class="current" style="width:80px"><span>Хорошо</span></li>'; } else { echo '<li><span>Хорошо</span></li>'; } ?>
		<?php  if ($row['total_value'] == '5' ) { echo '<li class="current" style="width:100px"><span>Отлично</span></li>'; } else { echo '<li><span>Отлично</span></li>'; } ?>
	</ol>
</dl>
 

peretc001

Новичок
А вот как вывести общий рейтинг пока не пойму. Ведь может быть (4+5+5)/(1+1+1) = 4.66
Допустим 4.66 это четыре целых и чуть больше половины, допустим width:96. Только как это все записать в php не пойму.
 

peretc001

Новичок
решил, коряво но работает:

PHP:
<?php $query=mysql_query("SELECT SUM(total_value) as sum, SUM(total_votes) as vote  FROM gb WHERE url = '$url'  "); 
	#где SUM(total_value) сумма голосов
	#где SUM(total_votes) количество проголосовавших
	$query=mysql_fetch_assoc($query); 
		$totals = $query['sum']/$query['vote'];
		$total =  substr($totals, 0, 3); 
?>
<dl class="star-rating">
	<dt><b>Рейтинг: (Отзывов: <?php echo $query['vote'];  ?>)</b></dt>
	<ol>
		<?php  if ($total > 0 && $total <= 1 ) { echo '<li class="current" style="width:'. $total*20 .'px"><span>Ужасно</span></li>'; } else { echo '<li><span>Ужасно</span></li>'; } ?>
		<!-- $total*20 - умножаем общий рейтинг на 20px -->
		<?php  if ($total > 1 && $total <= 2 ) { echo '<li class="current" style="width:'. $total*20 .'px"><span>Плохо</span></li>'; } else { echo '<li><span>Плохо</span></li>'; } ?>
		<?php  if ($total > 2 && $total <= 3 ) { echo '<li class="current" style="width:'. $total*20 .'px"><span>Нормально</span></li>'; } else { echo '<li><span>Нормально</span></li>'; } ?>
		<?php  if ($total > 3 && $total <= 4 ) { echo '<li class="current" style="width:'. $total*20 .'px"><span>Хорошо</span></li>'; } else { echo '<li><span>Хорошо</span></li>'; } ?>
		<?php  if ($total > 4 && $total <= 5 ) { echo '<li class="current" style="width:'. $total*20 .'px"><span>Отлично</span></li>'; } else { echo '<li><span>Отлично</span></li>'; } ?>
	</ol>
</dl>
Подскажите как такой код:
PHP:
<?php  if ($total > 0 && $total <= 1 ) { echo '<li class="current" style="width:'. $total*20 .'px"><span>Ужасно</span></li>'; } else { echo '<li><span>Ужасно</span></li>'; } ?>
<?php  if ($total > 1 && $total <= 2 ) { echo '<li class="current" style="width:'. $total*20 .'px"><span>Плохо</span></li>'; } else { echo '<li><span>Плохо</span></li>'; } ?>
<?php  if ($total > 2 && $total <= 3 ) { echo '<li class="current" style="width:'. $total*20 .'px"><span>Нормально</span></li>'; } else { echo '<li><span>Нормально</span></li>'; } ?>
<?php  if ($total > 3 && $total <= 4 ) { echo '<li class="current" style="width:'. $total*20 .'px"><span>Хорошо</span></li>'; } else { echo '<li><span>Хорошо</span></li>'; } ?>
<?php  if ($total > 4 && $total <= 5 ) { echo '<li class="current" style="width:'. $total*20 .'px"><span>Отлично</span></li>'; } else { echo '<li><span>Отлично</span></li>'; } ?>
заменить на одно строку, может оператором for как-нибудь?
 

peretc001

Новичок
Подправил немного:
PHP:
<?php $query=mysql_query("SELECT SUM(total_value) as sum, SUM(total_votes) as vote  FROM gb WHERE url = '$url'  "); 
	#где SUM(total_value) сумма голосов
	#где SUM(total_votes) количество проголосовавших
	$query=mysql_fetch_assoc($query); 
		$totals = $query['sum']/$query['vote']; #вычисляем общий рейтинг
		$total =  substr($totals, 0, 3); #обрезаем до 1 знака после точки
?>
<dl class="star-rating">
	<dt><b>Рейтинг: (Отзывов: <?php echo $query['vote'];  ?>)</b></dt>
	<ol>
		 <?php 
			echo '<li class="current" style="width:'. $total*20 .'px"><span>&nbsp;</span></li>'; #$total*20 - умножаем общий рейтинг на 20px
		?>
	</ol>
</dl>
 

hell0w0rd

Продвинутый новичок
Зачем писать такое ветвление:
PHP:
if(a<=b){}elseif(b>a && c>d)....
в elseif заведомо 1 условие всегда выполнено
 
Сверху