2015-03-09 8 views
1

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

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

Таблицы:

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

фильмов - идентификатор, MOVIE_NAME, movie_year

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

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

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

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

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

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

сообщение, что идентификатор с рейтингом

Использование UNIQUE KEY и дублирование 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> 
+0

И что именно вы просите? – Kamiccolo

+0

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

+0

Зачем вам хранить имя пользователя а затем использовать это, чтобы найти идентификатор пользователя? Почему бы вам не сохранить идентификатор пользователя после входа в систему? Тогда все, что вам нужно сделать, это добавить столбец 'user_id' в' user_movie_ratings' и создать уникальный ключ из 'user_id, movie_id' и voila - ни один пользователь не может оценивать один фильм более одного раза. Держите вещи простыми. –

ответ

1

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

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

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

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

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

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

+0

Большое спасибо Я добавил код входа, который я использую выше (совершенно новый для php извините, если это был глупый вопрос) – McNoodles

+0

Это не глупый вопрос, особенно если вы новичок в PHP/SQL. Просто помните, все в порядке и получайте удовольствие от кодирования :) –

+0

Я, кажется, застреваю, я делаю '$ dbuserid = $ row ['id'];' then '$ _SESSION ['sess_userid'] = $ dbuserid;' but когда я пытаюсь повторить, что на одной странице фильма я получаю 'Undefined index: sess_userid' – McNoodles

 Смежные вопросы

  • Нет связанных вопросов^_^