PHP唯一用户电影评级
在我的网站上,当用户登录时,他们可以对一部电影给予1-5的评级 我想做的是使数据库知道哪个用户给出了评级,并在再次单击时更新那里的评级,而不是创建一个新条目,这样每个用户对每部电影的评级不能超过一个 表: 登录-id、用户、密码 电影-id、电影名称、电影年份 用户电影分级-id,用户id,电影id,分级 当您登录时,您将被带到一个会员页面。检查会话以确保您已登录,然后显示所有电影的列表,然后当您单击移动名称时,您将被带到一个分级页面,您可以将其分级为1-5,然后,您将返回到电影页面,平均总评级显示在移动名称旁边 用户可以继续这样做,并错误地更改平均额定值 我想我知道我必须做什么我只是不知道怎么做: 获取会话用户名与数据库用户名的比较 获取链接到该用户名的id 发布带有评级的id 以某种方式使用唯一密钥和重复密钥更新,以确保它们只能在更新后发布 movie.phpPHP唯一用户电影评级,php,mysql,unique-key,Php,Mysql,Unique Key,在我的网站上,当用户登录时,他们可以对一部电影给予1-5的评级 我想做的是使数据库知道哪个用户给出了评级,并在再次单击时更新那里的评级,而不是创建一个新条目,这样每个用户对每部电影的评级不能超过一个 表: 登录-id、用户、密码 电影-id、电影名称、电影年份 用户电影分级-id,用户id,电影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';
$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>
影视
电影名称:。
评级:/5
评价这部电影:
这是页脚
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);
}
我将列出您需要采取的步骤,以实现您的目标
- 将用户ID及其用户名(或任何其他数据)存储到会话中。不要存储用户名,然后每次查询以获取其ID。这没有意义
- 添加一个唯一的键
(用户id,电影id)
,这是一个有趣的步骤-不要执行任何类型的检查,只需插入数据即可。如果用户投票支持该电影,则密钥将在那里,插入将失败。在PHP中,这将被解释为异常,这就是您想要的
- 捕获失败时的异常,并通知用户他们已经投票
- 使用准备好的语句来避免任何潜在的SQL注入并加快速度(MySQL可以很好地处理性能和准备好的语句)
总的来说,如果遵循这些步骤,您可以减少逻辑和代码。您到底想要什么?我想问的是,如何根据与会话用户名相同的用户名获取用户id,然后将其与电影id和评级一起发布,以便用户只能对电影进行一次评级。为什么要将用户名存储到会话中会话,然后使用该会话查找用户ID?为什么不在用户登录后也存储其ID?然后,您需要做的就是将user\u id
列添加到user\u movie\u ratings
中,并从user\u id、movie\u id
和voila中创建一个唯一的键-任何用户都不能对一部电影进行多次评级。简单一点。非常感谢。我已经添加了我在上面使用的登录代码(对php来说很新,如果这是一个愚蠢的问题,很抱歉),这不是一个愚蠢的问题,特别是如果你是php/SQL新手的话。请记住,保持简单并享受编码乐趣:)我似乎被困在我正在做的$dbuserid=$row['id']
然后$\u会话['sess\u userid']=$dbuserid
但是当我尝试在电影页面上重复这一点时,我得到了未定义的索引:sess_userid
嘿,N.B.很抱歉打扰你,但是你知道我做错了什么吗?真的不知道是什么错了,那里缺少太多的信息。尝试检查用户登录后返回的行(var_dump),并尝试检查会话中有哪些键,然后从中进行调试。
<!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>