mysql — PHP UNIQUE рейтинг фильмов пользователя

На моем сайте, когда пользователь вошел в систему, они могут дать оценку 1-5 на фильм.

Я хочу сделать так, чтобы база данных знала, какой пользователь дал оценку, и обновляла там оценку, если они щелкают ее снова, а не создают новую запись, чтобы у каждого пользователя не могло быть более одного рейтинга на фильм.

Таблицы:

логин — идентификатор, пользователь, пароль

фильмы — идентификатор, имя_ фильма, год_ фильма

user_movie_ratings — id, user_id, movie_id, рейтинг

В тот момент, когда вы входите в систему, вы попадаете на страницу участников, сеанс проверяется, чтобы убедиться, что вы вошли в систему, а затем отображается список всех фильмов, а затем, когда вы щелкаете по имени перемещения, вы получаете переход к Страница оценки, где вы можете присвоить ей оценку 1-5, затем вы вернетесь на страницу фильма, и рядом с именем движения отобразится средняя оценка.

Пользователь может просто продолжать делать это и неправильно изменять среднюю оценку.

Я думаю, что знаю, что я должен сделать, я просто не знаю, как это сделать:

Получить имя пользователя сеанса сравнить с именем пользователя базы данных

Получить идентификатор, связанный с этим именем пользователя

Разместить этот идентификатор с рейтингом

Используйте UNIQUE KEY и ON DUPLICATE KEY UPDATE, чтобы убедиться, что они могут публиковать сообщения только после обновления.

movie.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" type="text/css" href="styles.css" />

<?php
require_once 'sessionCheck.php';
require_once 'init.php';

$movie = null;

if(isset($_GET['id']))
{
$id = (int)$_GET['id'];

$movie = $con->query
("SELECT movies.id, movies.movie_name, AVG(user_movie_ratings.rating) AS rating
FROM movies
LEFT JOIN user_movie_ratings
ON movies.id = user_movie_ratings.movie_id
WHERE movies.id = {$id}
")->fetch_object();

}

?><head>
<title>Movies</title>
</head>

<body>
<div id="wrapper">

<div id="header">

<div id="login">
<?php include 'loginCheck.php';?>
</div>
</div>

<div class="content"><?php if ($movie): ?>

<div class="movie">

Movie Name: <?php echo $movie->movie_name; ?>.

<div class="movie_rating">
Rating: <?php echo round($movie->rating); ?>/5
</div>

<div class="movie-rate">
Rate this movie:
<?php foreach(range(1, 5) as $rating): ?>
<a href="rate.php?movie=<?php echo $movie->id; ?>&rating=<?php echo $rating; ?>"><?php echo $rating; ?></a>

<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
</div>
<div id="footer"> This is the Footer</div>
</div>
</body>
</html>

rate.php

<?php

require_once 'init.php';

if(isset($_GET['movie'], $_GET['rating'])) {

$movie = (int)$_GET['movie'];
$rating = (int)$_GET['rating'];

if(in_array($rating, array(1, 2, 3, 4, 5))) {

$exists = $con->query("SELECT id FROM movies WHERE id = {$movie}")->num_rows ? true : false;

if ($exists) {
$con->query("INSERT INTO user_movie_ratings (movie_id, rating) VALUES ({$movie}, {$rating} )");
}
}
header('Location: movie.php?id=' . $movie);
}

авторизоваться

<!doctype html>
<html>
<body>

<p><a href="reg.php">Register</a></p>
<form action="" method="POST">
Username: <input type="text" name="user"><br />
Password: <input type="password" name="pass"><br />
<input type="submit" value="Login" name="submit" />
</form>

<?php
if(isset($_POST["submit"])){

if(!empty($_POST['user']) && !empty($_POST['pass']))
{
$user=$_POST['user'];
$pass=$_POST['pass'];

require_once 'init.php';

$query=mysql_query("SELECT * FROM login WHERE username='".$user."' AND password='".$pass."'");
$numrows=mysql_num_rows($query);
if($numrows!=0)
{
while($row=mysql_fetch_assoc($query))
{
$dbusername=$row['username'];
$dbpassword=$row['password'];
}

if($user == $dbusername && $pass == $dbpassword)
{
session_start();
$_SESSION['sess_user']=$user;

/* Redirect browser */
header("Location: member.php");
}
}
else
{
echo "Invalid username or password!";
}

}
else
{
echo "All fields are required!";
}
}
?>

</body>
</html>

1

Решение

Я перечислю шаги, которые вы должны предпринять, чтобы достичь того, чего вы хотите.

  • Сохраните USER_ID для сеанса вместе с их именем пользователя (или любыми другими данными). Не храните имя пользователя, а затем каждый раз запрашивайте его идентификатор. Это бессмысленно

  • Добавить уникальный ключ (user_id, movie_id) и это забавный шаг — не выполняйте никаких проверок, просто вставьте данные. Если пользователь проголосовал за фильм, ключ будет там, и вставка не удастся. В PHP это будет интерпретироваться как исключение, и это то, что вы хотите

  • Поймать исключение в случае сбоя и уведомить пользователя, что они уже проголосовали.

  • Используйте подготовленные операторы, чтобы избежать любых потенциальных SQL-инъекций и ускорить процесс (MySQL хорошо сочетается с производительностью и подготовленными операторами)

В целом, вы можете уменьшить свою логику и код, если будете следовать этим шагам.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]