Обработка и вывод рейтинга в PHP

В продолжении статьи о верстки рейтинга, рассмотрим PHP-скрипты системы отзывов и рейтинга в интернет-магазине.

Важно! Скрипты приведены для ознакомления и требуют болле детальной обработки входящих данных, также не стоит публиковать отзывы на сайте без модерации.

1

На странице товара, в форме клиент пишет отзыв и ставит рейтинг, тут понадобятся звезды для формы.

<h1>Оставьте отзыв о товаре</h1>

<form method="post" action="">
	<label>Ваша оценка</label>
	<div class="rating-area">
		<input type="radio" id="star-5" name="rating" value="5">
		<label for="star-5" title="Оценка «5»"></label>	
		<input type="radio" id="star-4" name="rating" value="4">
		<label for="star-4" title="Оценка «4»"></label>    
		<input type="radio" id="star-3" name="rating" value="3">
		<label for="star-3" title="Оценка «3»"></label>  
		<input type="radio" id="star-2" name="rating" value="2">
		<label for="star-2" title="Оценка «2»"></label>    
		<input type="radio" id="star-1" name="rating" value="1">
		<label for="star-1" title="Оценка «1»"></label>
	</div>
 
	<label>Ваше имя<label>
	<input type="text" name="name">
	
	<label>Отзыв</label>
	<textarea name="text">
HTML

Внешний вид формы:

В обработчике формы, отзыв с рейтингом добавляется в БД отдельной записью с привязкой к товару.

if (isset($_POST['send'])) {
	$form['prod_id'] = intval($_POST['prod_id']);  // ID товара
	$form['rating']  = intval($_POST['rating']);   // Оценка
	$form['name']    = $_POST['name'];             // Имя
	$form['text']    = $_POST['text'];             // Отзыв

	$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
	$sth = $dbh->prepare("
		INSERT INTO 
			`reviews` 
		SET 
			`prod_id` = :prod_id, 
			`rating`  = :rating,
			`name`    = :name,
			`text`    = :text,
			`date`    = UNIX_TIMESTAMP()
	");
	$sth->execute($form);
}
PHP
2

Итак, отзывы и оценки собираются формой, теперь нужно вывести результат. Обычно в верху страницы выводится общая среднеарифметическая оценка.

$sth = $dbh->prepare("SELECT * FROM `reviews` WHERE `prod_id` = ? AND `rating` > 0");
$sth->execute(array($prod_id));
$data = $sth->fetchAll(PDO::FETCH_ASSOC);

if (!empty($data)) {
	$rating = 0;
	$count = count($data);
	foreach ($data as $row) {
		$rating += $row['rating'];
	}
	$rating = $rating / $count;
	?>

	<p>Средний рейтинг <?php echo round($rating, 1); ?></p>
	<div class="rating-result">
		<span class="<?php if (ceil($rating) >= 1) echo 'active'; ?>"></span>	
		<span class="<?php if (ceil($rating) >= 2) echo 'active'; ?>"></span>    
		<span class="<?php if (ceil($rating) >= 3) echo 'active'; ?>"></span>  
		<span class="<?php if (ceil($rating) >= 4) echo 'active'; ?>"></span>    
		<span class="<?php if (ceil($rating) >= 5) echo 'active'; ?>"></span>
	</div>
	<p>На основе <?php echo $count; ?> оценок</p>
	
	<?php
}
PHP

Далее идет вывод отзывов клиентов с их оценками.

<h2>Отзывы</h2>
<a class="button frame" href="/form">Оставить отзыв</a>

<?php foreach ($data as $row): ?>
<div class="rating-items">
	<p><?php echo $row['text']; ?></p>	
	<div class="rating-mini">
		<span class="<?php if ($row['rating'] >= 1) echo 'active'; ?>"></span>	
		<span class="<?php if ($row['rating'] >= 2) echo 'active'; ?>"></span>    
		<span class="<?php if ($row['rating'] >= 3) echo 'active'; ?>"></span>  
		<span class="<?php if ($row['rating'] >= 4) echo 'active'; ?>"></span>    
		<span class="<?php if ($row['rating'] >= 5) echo 'active'; ?>"></span>
	</div>
	<p><?php echo $row['name']; ?> <?php echo date('d.m.Y', ['date']); ?></p>
</div>
<?php endforeach; ?>
PHP
3

Для вывода рейтинга в списке товаров понадобится мини версия звезд, а из данных общая оценка и количество отзывов.

<?php foreach ($prods as $prod): ?>
<div class="prod-item">
	<img src="http://site.ru/prod/<?php echo $prod['img']; ?>">
		
	<?php
	$sth = $dbh->prepare("
		SELECT 
			SUM(`rating`) AS `total`, 
			COUNT(`id`) AS `count` 
		FROM 
			`reviews` 
		WHERE 
			`prod_id` = ? 
			AND `rating` > 0
	");

	$sth->execute(array($prod['id']));
	$data = $sth->fetch(PDO::FETCH_ASSOC);
	$rating = ceil($data['rating'] / $data['count']);
	?>

	<div class="rating-mini">
		<span class="<?php if ($rating >= 1) echo 'active'; ?>"></span>	
		<span class="<?php if ($rating >= 2) echo 'active'; ?>"></span>    
		<span class="<?php if ($rating >= 3) echo 'active'; ?>"></span>  
		<span class="<?php if ($rating >= 4) echo 'active'; ?>"></span>    
		<span class="<?php if ($rating >= 5) echo 'active'; ?>"></span>
	</div>
	<span><?php echo $data['count']; ?></span>
		
	<a href="http://site.ru/prod/<?php echo $prod['url']; ?>">
		<?php echo $prod['name']; ?>
	</a>
</div>
<?php endforeach; ?>
HTML
4

Для удобства поиска товаров можно ввести сортировку по рейтингу по примеру SQL-запроса.

SELECT 
	*,
	(SELECT SUM(`rating`) / COUNT(`id`) FROM `reviews` WHERE `prod_id` = `prod`.`id`) AS `rating`
FROM
	`prod`
ORDER BY
	`rating` DESC
SQL
26.08.2019, обновлено 07.10.2020
20148

Комментарии 1

Татьяна NSP Татьяна NSP
7 февраля 2020 в 23:14
Правильно ли я поняла - этот код нужно дорабатывать? или он все таки готов?

, чтобы добавить комментарий.

Другие публикации

Поиск похожих текстов в базе данных MySQL + PHP
Один из вариантов поиска похожих статей в базе данных основан на схождении слов в двух текстах.
7273
+6
Постраничный вывод и базы данных
В SQL запросах, для ограничения количества строк в результате используется инструкция LIMIT, например следующий вернёт...
17147
0
Формирование файла sitemap.xml
Пример создания файла карты сайта (sitemap.xml) на PHP. Интеграция его на сайт и подключение его в robots.txt
24138
+3
Обновление таблицы БД из XML файлов
Два примера чтения xml файлов, которые обновляют цены и остатки в базе данных интернет магазина.
7739
+4
Примеры использования PDO MySQL
В статье приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и...
104250
+8
Генерация случайных буквенно-цифровых кодов в PHP
Несколько примеров, как сгенерировать случайные последовательности численных и буквенных строк заданной длины и...
11567
+4