Loading...
Обучение/Помощь новичкам | вопрос о рейтинге
всем привет у меня есть в блогах поставить оценку поста, в виде звезд, как сделать что бы когда я ставлю рейтинг, сами звезды не пропадали ? это все дело в запросе , хочу что бы вот лайкнул и звезды остались
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
— обновляй его
— и отрисовывай на основе этого значения
Ооо ИИ подъехало .ыы.
)(aOS (14 мая 2026, в 21:25)
Ооо ИИ подъехало .ыы.
Ану блесни своими знаниями .smoke_sm.
nazaruk (15 мая 2026, в 14:34)
Ану блесни своими знаниями .smoke_sm.
Лень ноутбук доставать. И я не даю бесплатных консультаций)))
Структура базы данных
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 + JavaScript)
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: Обработка оценки (rate.php
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: Получение среднего рейтинга (get_rating.php)
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() ]); ?>   
Онлайн: 3
Время:
Gen. 0.0998
(c) Bym.Guru 2010-2026