- Обработка и вывод рейтинга в PHP
- Форма добавления отзыва
- Оставьте отзыв о товаре
- Внешний вид формы:
- Вывод рейтинга в товаре
- Отзывы
- Рейтинг в листинге товаров
- Сортировка по рейтингу
- Скрипт для рейтинга
- Характеристика скрипта:
- Похожие записи
- Mysql php скрипт рейтинг
- Пишем простой «рейтинг со звёздочками» для сайта
Обработка и вывод рейтинга в PHP
В продолжении статьи о верстки рейтинга, рассмотрим PHP-скрипты системы отзывов и рейтинга в интернет-магазине.
Важно! Скрипты приведены для ознакомления и требуют болле детальной обработки входящих данных, также не стоит публиковать отзывы на сайте без модерации.
Форма добавления отзыва
На странице товара, в форме клиент пишет отзыв и ставит рейтинг, тут понадобятся звезды для формы.
Оставьте отзыв о товаре
Внешний вид формы:
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); >
Вывод рейтинга в товаре
Итак, отзывы и оценки собираются формой, теперь нужно вывести результат. Обычно в верху страницы выводится общая среднеарифметическая оценка.
$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; ?>Средний рейтинг
= 1) echo 'active'; ?>"> = 2) echo 'active'; ?>"> = 3) echo 'active'; ?>"> = 4) echo 'active'; ?>"> = 5) echo 'active'; ?>">На основе оценок
Отзывы
Оставить отзыв
Рейтинг в листинге товаров
Для вывода рейтинга в списке товаров понадобится мини версия звезд, а из данных общая оценка и количество отзывов.
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']); ?>= 1) echo 'active'; ?>"> = 2) echo 'active'; ?>"> = 3) echo 'active'; ?>"> = 4) echo 'active'; ?>"> = 5) echo 'active'; ?>">">
Сортировка по рейтингу
SELECT *, (SELECT SUM(`rating`) / COUNT(`id`) FROM `reviews` WHERE `prod_id` = `prod`.`id`) AS `rating` FROM `prod` ORDER BY `rating` DESC
Скрипт для рейтинга
Автор: Роман Чернышов Опубликовано: 20 ноября 2010
Сегодня я хочу поделиться с вами одним очень интересным на мой взгляд скриптом рейтинга на PHP, который вы можете разместить в любом месте своего сайта затратив на это минимум времени. В результате вы с легкостью получите рейтинг пользователей, рейтинг фотографий и т.д. Более того форма для голосования за рейтинг выглядит в виде пяти звезд, при на ведении на которые они меняют цвет. Как дополнительное преимущество это то, что скрипт можно интегрировать в любую CMS.
Характеристика скрипта:
- скрипт работает на php 3,4,5 и использует бд mySQL
- запоминание IP пользователя, проголосовавшего за рейтинг
- возможность работы скрипта с применением Ajax, без перезагрузки страницы
- настраиваемые стили
- достаточно привлекателен интерфейс, в виде звезд
- вывод информации, о количестве проголосовавших и текущем рейтинге
И так для работы скрипта рейтинга, вам необходимо скачать архив со скриптами, стилями и картинками. Затем его содержимое залить на свой сервер, предварительно поменяв настройки подключения к БД mySQL в файле confrate.php
Затем создать или импортировать (из файла table.sql) таблицу в базу данных в которой будут храниться данные рейтинга все участников, запрос самой таблицы:
CREATE TABLE IF NOT EXISTS `ratings` ( `id` varchar(30) NOT NULL, `total_votes` int(11) NOT NULL default '0', `total_value` int(11) NOT NULL default '0', `used_ips` longtext, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Далее в том месте файла где вы хотите выводить форму рейтинга вам необходимо вставить следующие строки:
$userrating="TestID"; // имя пользователя за которого голосуем, или ID ?> div id="reting-block$userrating?>"> require('form.php'); echo rating_bar($userrating,5); ?> div>
Для подключения Ajax необходимо в начало кода страницы между тегами вставить следующую строку:
script type="text/javascript" src="rating.js">script>
Также для работы скрипта, должна быть подключена библиотека JQiery:
script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js">script>
Скрипт рейтинга готов к работе.
П.С, В процессе тестирования работы скрипта были замечены небольшие глюки в нашем всеми любимом браузере IE6, при включенном Ajax форма рейтинга при выставлении оценки пользователем иногда подвисала.
PHP
php, рейтинг, скрипт
Похожие записи
Mysql php скрипт рейтинг
БлогNot. Пишем простой «рейтинг со звёздочками» для сайта
Пишем простой «рейтинг со звёздочками» для сайта
На многих сайтах вы видели систему «рейтинга со звёздочками», позволяющего вашим посетителям легко оценить тот или иной материал одним кликом мыши.
Напишем собственную, по возможности, простейшую форму такого рейтинга.
Предполагается, что Вы умеете работать с локальным хостом, исходниками на HTML и PHP, а также подключаться к серверу баз данных MySQLi, если это не так, почитайте сначала материалы для начинающих.
вид рейтинга со звёздочками в браузере
Создадим на локальном хосте папку stars для файлов скрипта. Весь код будем писать в файле index.html в кодировке Юникода UTF-8 с таким вот обрамлением HTML5:
Это корректный код с точки зрения стандартного валидатора разметки. На самом деле кусочки HTML- и Javascript-кода, которые мы сейчас напишем, могут быть включены куда угодно в ваши файлы типа .html или .php .
Перед закрывающей частью подключим библиотеку JQuery. Для нашей цели хватит возможностей первой её версии, так что не будем гнаться за самой новой:
Внутри тега поместим форму для добавления звёздочек и вывода текущего рейтинга материала:
Важно, что в реальном скрипте идентификатор db_1 должен формироваться программно и получать после префикса db_ номер записи (идентификатор) некоторой страницы, на которой расположен рейтинг и которая сейчас оценивается.
То есть, id этого элемента получает, например, значение db_999 для записи моего блога с идентификатором 999.
Как правило, при использовании базы данных идентификатор записи Вы уже получали, формируя текущую страницу, если предположить, что он хранится в переменной с именем $id , то строчка последнего листинга изменится на
Внутри тега опишем, как должны выглядеть элементы, его можно поместить сразу после :
#rating < width: 400px; height: 32px; border-radius: 6px; box-shadow: 0 0 1px 1px #999999; margin: 8px auto; padding: 8px; text-align: center; >#rating div < float: left; >#rating p < margin: 0; padding: 0; >#rating_id < font-size: 14px; text-align: right; >.comment < width: 180px; font-size: 14px; margin: 0 14px 0 0; text-align: right; >.comment, .rating < line-height: 28px; >.stars < background: url(stars.png); >.stars, .progress < width: 130px; height: 28px; cursor: pointer; >.progress < background: #FFFF00; >.rating
Здесь многие размеры подогнаны не очень тщательно, можно сделать лучше. Сами пять звёздочек будут фоновой картинкой, расположенной в папке приложения на локальном хосте. «Внутренность» звёздочек при этом прозрачна, а фон изображения — белый.
картинка со звёздочками, файл stars.png
За картинкой мы поместим абзац с id=»progress_id» и жёлтым фоном, а потом будем динамически менять ширину этого абзаца в ситуациях, когда мышь находится поверх звёздочек.
Клик по звёздочкам вызовет выполнение серверного скрипта, где наш выбор будет либо сохранён в базе, либо проигнорирован, если мы уже голосовали.
Внешний вид скрипта готов, можно выполнить в браузере ссылку http://localhost/stars/ и увидеть это.
Теперь добавим логику приложения, которая будет реализована в виде яваскрипта, его также можно добавить перед после тега подключения JQuery:
Как видно из листинга, при клике на выбранном количестве звёздочек скрипт обратится к серверной части rating.php , которая зафиксирует выбор пользователя в базе данных и покажет среднюю текущую оценку материала.
Шаг по оценке равен 0.5, то есть, можно выставить 0 баллов, 0.5, 1, и так далее до 5.
Прежде, чем двигаться дальше, запустим сервер баз данных ( в Denwer — ссылка http://localhost/tools/phpmyadmin ) и создадим в любой удобной для нас базе две таблицы, которые понадобятся нашему серверному скрипту.
Имена таблиц будут starvotes и starballs , а кодировка базы может быть любой, ведь все поля — цифровые.
Кроме того, вторая таблица необязательна, вы можете просто добавить столбцы points и votes в ту таблицу, откуда берутся оцениваемые материалы и их идентификаторы, такие как db_1 выше в коде.
Вот SQL-запрос, который нужно выполнить к выбранной базе:
CREATE TABLE `starvotes` ( `id` int(10) unsigned NOT NULL auto_increment, `date` int(10) unsigned NOT NULL, `dbid` int(10) unsigned NOT NULL, `ip` int(10) unsigned NOT NULL, `rating` float unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1; CREATE TABLE `starballs` ( `id` int(10) unsigned NOT NULL auto_increment, `dbid` int(10) unsigned NOT NULL, `points` float unsigned NOT NULL, `votes` int(10) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1;
Наконец, напишем серверный скрипт rating.php и разместим его в папке приложения.
Чтобы не переполнять базу, «очень старые» записи будем стирать, за это отвечает настройка DAYS_LIMIT_TO_REPEAT , в остальном имеем обычный скрипт для работы с БД. Вот его полный листинг, разумеется, на реальном хостинге настройки подключения к базе данных придётся поменять (для удобства они собраны в начале файла в виде констант).
$dbid = intval($_POST["id"]); $myball = floatval($_POST["rating"]); if ($dbid 5) < die('Неверный вызов PHP [2]'); >$time = $_SERVER['REQUEST_TIME']; $ip = get_ip(); $mysql_id = mysqli_connect (DB_HOST,DB_LOGIN,DB_PASSWORD,DB_NAME) or die (sprintf("Ошибка подключения: %s\n", mysqli_connect_error())); mysqli_set_charset ($mysql_id, DB_ENCODING) or die (sprintf("Ошибка установки кодировки: %s\n", mysqli_error($mysql_id))); mysqli_select_db ($mysql_id, DB_NAME) or die (sprintf("Ошибка выбора таблицы: %s\n", mysqli_error($mysql_id))); $sql = 'DELETE FROM '.VOTES_NAME.' WHERE date else < $result .= 'Вы уже голосовали'; >if ($updater) < $sql = 'SELECT dbid,points,votes FROM '.BALLS_NAME.' WHERE dbid='.$dbid; $res1 = mysqli_query ($mysql_id,$sql) or die ('Ошибка SQL: ['.$sql.']; '.mysqli_error($mysql_id)); if (mysqli_num_rows ($res1)) < $sql = 'UPDATE '.BALLS_NAME. ' SET points=(points+'.$myball.'),votes=(votes+1) WHERE dbid='.$dbid.' LIMIT 1'; $res = mysqli_query ($mysql_id,$sql) or die ('Ошибка SQL: ['.$sql.']; '.mysqli_error($mysql_id)); >else < $sql = 'INSERT INTO '.BALLS_NAME.' (dbid,points,votes) values ('.$dbid.','.$myball.',1)'; $res = mysqli_query ($mysql_id,$sql) or die ('Ошибка SQL: ['.$sql.']; '.mysqli_error($mysql_id)); >> $sql = 'SELECT dbid,points,votes FROM '.BALLS_NAME.' WHERE dbid='.$dbid; $res1 = mysqli_query ($mysql_id,$sql) or die ('Ошибка SQL: ['.$sql.']; '.mysqli_error($mysql_id)); $row = mysqli_fetch_assoc ($res1); $ball = round ($row['points'] / $row['votes'],2); echo "$result#$ball#".$row['votes']; function get_ip () < if( getenv('HTTP_X_FORWARDED_FOR') != '' ) < $client_ip = ( !empty($_SERVER['REMOTE_ADDR']) ) ? $_SERVER['REMOTE_ADDR'] : ( ( !empty($_ENV['REMOTE_ADDR']) ) ? $_ENV['REMOTE_ADDR'] : $REMOTE_ADDR ); $entries = explode(',', getenv('HTTP_X_FORWARDED_FOR')); reset($entries); foreach ($entries as $entrykey=>$entry) < $entry = trim($entry); if ( preg_match("/^(3+\.5+\.1+\.3+)/", $entry, $ip_list) ) < $private_ip = array('/^0\./', '/^127\.0\.0\.1/', '/^192\.168\..*/', '/^172\.((18)|(21)|(31))\..*/', '/^10\..*/', '/^224\..*/', '/^240\..*/'); $found_ip = preg_replace($private_ip, $client_ip, $ip_list[1]); if ($client_ip != $found_ip) < $client_ip = $found_ip; break; >> > > else < $client_ip = ( !empty($_SERVER['REMOTE_ADDR']) ) ? $_SERVER['REMOTE_ADDR'] : ( ( !empty($_ENV['REMOTE_ADDR']) ) ? $_ENV['REMOTE_ADDR'] : $REMOTE_ADDR ); >return $client_ip; > ?>
Вы можете посмотреть, что у нас получилось, по ссылке, а также использовать эти наработки для своих скриптов, которые нужно сделать ещё умнее и красивей 🙂
Чтобы не было проблем с Юникодом на Денвере, не забудем добавить в папку скрипта волшебный файл .htaccess
Ну а я себе в блог добавлять такой рейтинг не буду, не хочу каждый раз подгружать JQuery 🙂 Впрочем, помните, что всегда можно переписать код без него, это всего лишь библиотека, а не язык программирования.
31.01.2019, 16:15 [9094 просмотра]