Обучение/Помощь новичкам | вопрос о рейтинге
всем привет
у меня есть в блогах поставить оценку поста, в виде звезд, как сделать что бы когда я ставлю рейтинг, сами звезды не пропадали ? это все дело в запросе ,
хочу что бы вот лайкнул и звезды остались
у меня есть в блогах поставить оценку поста, в виде звезд, как сделать что бы когда я ставлю рейтинг, сами звезды не пропадали ? это все дело в запросе ,
хочу что бы вот лайкнул и звезды остались
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 + 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()
]);
?>