Обучение/Помощь новичкам | вопрос о рейтинге
всем привет у меня есть в блогах поставить оценку поста, в виде звезд, как сделать что бы когда я ставлю рейтинг, сами звезды не пропадали ? это все дело в запросе , хочу что бы вот лайкнул и звезды остались
php
if(isset($user) && $user['id']!=$us['id'] && mysql_result(mysql_query("SELECT COUNT(*) FROM `diary_rating` WHERE `id_diary` = '$diary[id]' AND `id_user`='$user[id]' LIMIT 1"),0)==0) { echo '<div class="start"> <div class="rating" data-rating="0">'; echo '<a href="/blog/'.$diary['name'].'/?plus=5" title="Повысить рейтинг дневника на 1"><span class="star" data-value="5">★</span></a>'; echo '<a href="/blog/'.$diary['name'].'/?plus=4" title="Повысить рейтинг дневника на 2"><span class="star" data-value="4">★</span></a>'; echo '<a href="/blog/'.$diary['name'].'/?plus=3" title="Повысить рейтинг дневника на 3"><span class="star" data-value="3">★</span></a>'; echo '<a href="/blog/'.$diary['name'].'/?plus=2" title="Повысить рейтинг дневника на 4"><span class="star" data-value="2">★</span></a>'; echo '<a href="/blog/'.$diary['name'].'/?plus=1" title="Повысить рейтинг дневника на 5"><span class="star" data-value="1">★</span></a>'; echo "</div><span class='rating-value'>0</span></div>"; } } else { echo'<b>Дневник пользователя могут читать только друзья</b>'; } У тебя проблема не в “пропадающих звездах”, а в том, что ты используешь COUNT(*) , который просто проверяет наличие записи, а не хранит сам рейтинг. Из-за этого: — ты не знаешь, какую оценку поставил пользователь — не можешь отобразить выбранные звезды — визуально рейтинг всегда = 0
Как сделать нормально: 1. Таблица рейтинга
php
CREATE TABLE diary_rating ( id INT AUTO_INCREMENT PRIMARY KEY, id_diary INT, id_user INT, rating INT ); 2. Сохранение рейтинга
php
if(isset($_GET['plus'])) { $rating = (int)$_GET['plus']; $diary_id = (int)$diary['id']; $user_id = (int)$user['id']; $check = mysql_query("SELECT * FROM diary_rating WHERE id_diary='$diary_id' AND id_user='$user_id'"); if(mysql_num_rows($check) > 0) { mysql_query("UPDATE diary_rating SET rating='$rating' WHERE id_diary='$diary_id' AND id_user='$user_id'"); } else { mysql_query("INSERT INTO diary_rating (id_diary, id_user, rating) VALUES ('$diary_id', '$user_id', '$rating')"); } } 3. Получение рейтинга
php
$res = mysql_query("SELECT rating FROM diary_rating WHERE id_diary='{$diary['id']}' AND id_user='{$user['id']}'"); $row = mysql_fetch_assoc($res); $current_rating = $row ? (int)$row['rating'] : 0; 4. Отображение звезд
php
echo '<div class="rating">'; for($i = 5; $i >= 1; $i--) { $active = ($i <= $current_rating) ? 'style="color:gold;"' : ''; echo '<a href="/blog/'.$diary['name'].'/?plus='.$i.'"> <span class="star" '.$active.'>★</span> </a>'; } echo '</div>'; ________
посл. ред. 14.05.2026 в 21:19; всего 1 раз(а); by nazaruk
Твоя идея с COUNT(*) — это костыль. Он не хранит значение, поэтому у тебя и “пропадают” звезды.
Если хочешь по уму:
— храни rating
— обновляй его
— и отрисовывай на основе этого значения
Если хочешь по уму:
— храни rating
— обновляй его
— и отрисовывай на основе этого значения
Ооо ИИ подъехало
Ану блесни своими знаниями
Лень ноутбук доставать. И я не даю бесплатных консультаций)))
Структура базы данных Форма для оценки (HTML + JavaScript) PHP: Обработка оценки (rate.php PHP: Получение среднего рейтинга (get_rating.php)
sql
CREATE TABLE ratings ( id INT AUTO_INCREMENT PRIMARY KEY, post_id INT NOT NULL, user_id INT NOT NULL, rating INT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); html
<div class="rating" data-post-id="1"> <i class="star" data-value="1">★</i> <i class="star" data-value="2">★</i> <i class="star" data-value="3">★</i> <i class="star" data-value="4">★</i> <i class="star" data-value="5">★</i> </div> <script> document.querySelectorAll('.star').forEach(star => { star.addEventListener('click', function() { const postId = this.closest('.rating').dataset.postId; const value = this.dataset.value; fetch('rate.php', { method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `post_id=${postId}&rating=${value}` }).then(() => { // После успешной оценки обновляем отображение updateStars(postId); }); }); }); function updateStars(postId) { fetch(`get_rating.php?post_id=${postId}`) .then(r => r.json()) .then(data => { const stars = document.querySelectorAll(`.rating[data-post-id="${postId}"] .star`); stars.forEach((star, i) => { if (i < Math.round(data.avg)) { star.style.color = 'gold'; } else { star.style.color = 'gray'; } }); }); } // При загрузке страницы обновляем звезды для всех постов document.querySelectorAll('.rating').forEach(div => { updateStars(div.dataset.postId); }); </script> php
<?php session_start(); // Подключение к БД $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'user', 'pass'); $post_id = (int)$_POST['post_id']; $rating = (int)$_POST['rating']; $user_id = $_SESSION['user_id'] ?? $_SERVER['REMOTE_ADDR']; // или IP // Проверка, не оценивал ли уже этот пользователь $stmt = $pdo->prepare("SELECT * FROM ratings WHERE post_id = ? AND user_id = ?"); $stmt->execute([$post_id, $user_id]); if ($stmt->rowCount() > 0) { echo json_encode(['error' => 'Вы уже оценивали этот пост']); exit; } // Сохраняем оценку $pdo->prepare("INSERT INTO ratings (post_id, user_id, rating) VALUES (?, ?, ?)") ->execute([$post_id, $user_id, $rating]); echo json_encode(['success' => true]); ?> php
<?php $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'user', 'pass'); $post_id = (int)$_GET['post_id']; $stmt = $pdo->prepare("SELECT AVG(rating) as avg FROM ratings WHERE post_id = ?"); $stmt->execute([$post_id]); $result = $stmt->fetch(PDO::FETCH_ASSOC); echo json_encode([ 'avg' => $result['avg'] ?: 0, 'count' => $stmt->rowCount() ]); ?>