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.0967
(c) Bym.Guru 2010-2026