【问题标题】:PHP UNIQUE user movie ratingPHP UNIQUE 用户电影评分
【发布时间】:2015-03-09 10:27:43
【问题描述】:

当用户登录时,在我的网站上,他们可以给一部电影打 1-5 分。

我想要做的是让数据库知道哪个用户给出了评分,如果他们再次点击它而不是创建一个新条目,则更新那里的评分,所以每个用户每部电影的评分不能超过一个。

表格:

登录 - id、用户、密码

电影 - id、movie_name、movie_year

user_movie_ratings - id、user_id、movie_id、评分

在您登录的那一刻,您会进入会员页面,会检查会话以确保您已登录,然后显示所有电影的列表,然后当您单击移动名称时,您会得到进入评分页面,您可以给它评分 1-5,然后您将返回电影页面,并且平均总评分显示在动作名称旁边。

用户可以继续这样做并错误地更改平均评分。

我想我知道我必须做什么我只是不知道该怎么做:

获取会话用户名与数据库用户名的比较

获取链接到该用户名的 id

发布带有评分的 id

以某种方式使用 UNIQUE KEY 和 ON DUPLICATE KEY UPDATE 以确保他们只能发布一次,否则会更新

电影.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>

【问题讨论】:

  • 你到底要什么?
  • 我在问如何根据用户名与会话用户名相同来获取用户 ID,然后将其与电影 ID 和评分一起发布,以便用户只能对电影评分一次
  • 为什么要将用户名存储到会话中,然后使用它来查找用户的 ID?为什么在用户登录后不存储用户 ID?然后您需要做的就是将user_id 列添加到user_movie_ratings 并从user_id, movie_id 中创建一个唯一键,瞧——任何用户都不能对一部电影多次评分。保持简单。

标签: php mysql unique-key


【解决方案1】:

我将列出你需要采取的步骤才能实现你想要的。

  • 将 USER_ID 与其用户名(或任何其他数据)一起存储到会话中。不要存储用户名然后每次查询以获取他们的ID。这没有意义

  • 添加唯一键 (user_id, movie_id),这是有趣的步骤 - 不要执行任何类型的检查,只需插入数据。如果用户为电影投票,则密钥将在那里,插入将失败。在 PHP 中,这将被解释为异常,这就是你想要的

  • 在失败的情况下捕获异常并通知用户他们已经投票。

  • 使用准备好的语句来避免任何潜在的 SQL 注入并加快处理速度(MySQL 在性能和准备好的语句方面表现出色)

总体而言,如果您遵循这些步骤,您可以减少逻辑和代码。

【讨论】:

  • 非常感谢我已经添加了我在上面使用的登录代码(如果这是一个愚蠢的问题,对 php 来说是很新的对不起)
  • 这不是一个愚蠢的问题,尤其是如果您是 PHP/SQL 新手。请记住,保持简单并享受编码的乐趣:)
  • 我似乎被卡住了我正在做$dbuserid=$row['id']; 然后$_SESSION['sess_userid']=$dbuserid; 但是当我尝试在电影页面上回应时我得到Undefined index: sess_userid
  • 嘿 N.B.很抱歉打扰你,但你知道我做错了什么吗?
  • 无法真正判断出什么问题,那里缺少太多信息。尝试检查用户登录后返回的行(var_dump),并尝试检查会话中的哪些键并从那里进行调试。
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 2013-06-02
  • 2020-10-20
  • 1970-01-01
  • 2021-09-27
  • 2014-04-05
相关资源
最近更新 更多