Пользовательский рейтинг фильмов PHP UNIQUE

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

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

Таблицы:

логин - id, пользователь, пароль

фильмы - id, название_фильма, год_фильма

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

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

Пользователь может просто продолжать делать это снова и неправильно изменять средний рейтинг.

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

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

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

Опубликуйте этот идентификатор с рейтингом

Используйте 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>

person McNoodles    schedule 09.03.2015    source источник
comment
А что именно Ты просишь?   -  person Kamiccolo    schedule 09.03.2015
comment
Я спрашиваю, как мне получить идентификатор пользователя на основе имени пользователя, совпадающего с именем пользователя сеанса, а затем опубликовать его вместе с movie_id и рейтингом, чтобы пользователь мог оценить фильм только один раз.   -  person McNoodles    schedule 09.03.2015
comment
Зачем вам хранить имя пользователя в сеансе, а затем использовать его для поиска идентификатора пользователя? Почему бы вам не сохранить идентификатор пользователя после входа в систему? Затем все, что вам нужно сделать, это добавить столбец user_id к столбцу user_movie_ratings и создать уникальный ключ из user_id, movie_id и вуаля — пользователи не могут оценивать один фильм более одного раза. Держите вещи простыми.   -  person N.B.    schedule 09.03.2015


Ответы (1)


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

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

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

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

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

В целом, вы можете сократить свою логику и код, если выполните следующие действия.

person N.B.    schedule 09.03.2015
comment
Большое спасибо, я добавил код входа, который я использую выше (совершенно новый для php, извините, если это был глупый вопрос) - person McNoodles; 09.03.2015
comment
Это не глупый вопрос, особенно если вы новичок в PHP/SQL. Просто помните, будьте проще и получайте удовольствие от кодирования :) - person N.B.; 09.03.2015
comment
я, кажется, застрял, я делаю $dbuserid=$row['id'];, затем $_SESSION['sess_userid']=$dbuserid;, но когда я пытаюсь повторить это на одной из страниц фильмов, я получаю Undefined index: sess_userid - person McNoodles; 09.03.2015
comment
Эй, Н.Б. извините за беспокойство, но вы знаете, что я делаю неправильно? - person McNoodles; 09.03.2015
comment
Не могу точно сказать, что не так, слишком много информации отсутствует. Попробуйте проверить, какие строки вы получите обратно после входа пользователя в систему (var_dump), и попробуйте проверить, какие ключи находятся в вашем сеансе, и отладьте оттуда. - person N.B.; 09.03.2015
comment
Хорошо, я добираюсь туда. Я получил идентификатор пользователя, отправленный в базу данных, все, что мне нужно сделать сейчас, это сделать его уникальным, а затем обновить его рейтинг, если они снова щелкнут по нему. Я просто устанавливаю уникальные поля в базе данных или делаю что-то еще? - person McNoodles; 09.03.2015
comment
Вы создаете уникальный индекс из обоих ключей (user_id и movie_id). Если вам нужно обновить голос пользователя за определенный фильм, изучите синтаксис MySQL ON DUPLICATE KEY UPDATE. Технически вы можете сделать это голосование в одном запросе. Кроме того, убедитесь, что вы осведомлены о PDO или mysqli, поскольку функции mysql_ устарели (и прямой запрос без экранирования пользовательского ввода небезопасен). - person N.B.; 09.03.2015
comment
Спасибо, у меня все получилось, вы были очень полезны, переходя к следующему шагу, выбирая фильмы из списка на основе их рейтинга. - person McNoodles; 09.03.2015