如何阻止用户对电影进行多次评分?
How do I stop a user from rating a movie more than once?
在我的网站上,当用户登录后,他们可以给电影打 1-5 分。
我想做的是让数据库知道哪个用户给出了评分,并在他们再次点击时更新评分,而不是创建一个新条目,这样每个用户不能有超过一个评分电影。
表格:
登录 - id、用户、密码
电影 - id,movie_name,movie_year
user_movie_ratings - id, user_id, movie_id, 评分
当您登录时,您会被带到一个会员页面,会检查会话以确保您已登录,然后会显示所有电影的列表,然后当您单击电影名称时你会进入一个评分页面,你可以在其中给它评分 1-5,然后你会被带回电影页面,平均总评分显示在动作名称旁边。
用户可以继续重复此操作并错误地更改平均评分。
<!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';
$query = $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
GROUP BY movies.id
");
$movieTitle = array();
while($row = $query->fetch_object()) {
$movieTitle[] = $row;
}
?>
<head>
<title>Members</title>
</head>
<body>
<div id="wrapper">
<div id="header">
<div id="login">
<?php include 'loginCheck.php';?>
</div>
</div>
<div class="content">
<?php foreach($movieTitle as $movie):?>
<div class = "movies">
<h3>
<a href="movie.php?id=<?php echo $movie->id; ?>">
<?php echo $movie->movie_name; ?></a>
</h3>
<div class="movie-rating">
Rating: <?php echo round($movie->rating); ?>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<div id="footer"> This is the Footer</div>
</div>
</body>
</html>
我会用 user_id
和 movie_id
做一个单独的 table。
Table - users
id
username
...
Table - movies
id
title
...
Table - ratings
id
(自动)
movie_id
user_id
[编辑]
如果你对movie_id
和user_id
都做唯一索引,数据库只会接受每个用户投once/movie。如果同一用户多次尝试对同一部电影投票,将产生 SQL-错误,除非您使用 INSERT IGNORE
或 ON DUPLICATE KEY UPDATE
(如果您想接受该用户更改评级)。
[再次编辑 - 重要]
你需要在同一个unique-index中创建两个id:s,如果你创建一个index/id,每个用户ID只会被接受一次,电影也是如此。 (你不想要那个)
(如果我错了有人纠正我吗?)
在我的网站上,当用户登录后,他们可以给电影打 1-5 分。
我想做的是让数据库知道哪个用户给出了评分,并在他们再次点击时更新评分,而不是创建一个新条目,这样每个用户不能有超过一个评分电影。
表格:
登录 - id、用户、密码
电影 - id,movie_name,movie_year
user_movie_ratings - id, user_id, movie_id, 评分
当您登录时,您会被带到一个会员页面,会检查会话以确保您已登录,然后会显示所有电影的列表,然后当您单击电影名称时你会进入一个评分页面,你可以在其中给它评分 1-5,然后你会被带回电影页面,平均总评分显示在动作名称旁边。
用户可以继续重复此操作并错误地更改平均评分。
<!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';
$query = $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
GROUP BY movies.id
");
$movieTitle = array();
while($row = $query->fetch_object()) {
$movieTitle[] = $row;
}
?>
<head>
<title>Members</title>
</head>
<body>
<div id="wrapper">
<div id="header">
<div id="login">
<?php include 'loginCheck.php';?>
</div>
</div>
<div class="content">
<?php foreach($movieTitle as $movie):?>
<div class = "movies">
<h3>
<a href="movie.php?id=<?php echo $movie->id; ?>">
<?php echo $movie->movie_name; ?></a>
</h3>
<div class="movie-rating">
Rating: <?php echo round($movie->rating); ?>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<div id="footer"> This is the Footer</div>
</div>
</body>
</html>
我会用 user_id
和 movie_id
做一个单独的 table。
Table - users
id
username
...
Table - movies
id
title
...
Table - ratings
id
(自动)
movie_id
user_id
[编辑]
如果你对movie_id
和user_id
都做唯一索引,数据库只会接受每个用户投once/movie。如果同一用户多次尝试对同一部电影投票,将产生 SQL-错误,除非您使用 INSERT IGNORE
或 ON DUPLICATE KEY UPDATE
(如果您想接受该用户更改评级)。
[再次编辑 - 重要]
你需要在同一个unique-index中创建两个id:s,如果你创建一个index/id,每个用户ID只会被接受一次,电影也是如此。 (你不想要那个)
(如果我错了有人纠正我吗?)