2013-05-16 3 views
0

Я работаю над школьным проектом, где мне нужно разрешить пользователям голосовать на фотографиях. Пользователи могут видеть изображение вверх или вниз. Идея состоит в том, что они могут менять свой голос в любое время, но они не могут отменить свой голос, поэтому, как только они проголосовали, это либо вверх, либо вниз.Разрешить пользователям голосовать один раз в PHP

Я пробовал кое-что, но я не могу заставить его работать. Он работает, когда пользователь впервые нажал кнопку upvote, затем пользователь может изменить свой голос на нижний уровень. Но когда он пытается снова подняться, ничего не происходит, это уже давно подталкивает меня, я бы оценил любую помощь.

Вот мой код до сих пор:

if (isset($_SESSION['loggedin'])) { 
    $result = mysql_query("SELECT * FROM user2pics WHERE picid = $id AND userid = $user"); 
    if (mysql_num_rows($result) == 0) { 
     $votes_up = $cur_votes[0] + 1; 
     $resultaat = mysql_query("UPDATE pics SET likes = $votes_up WHERE picid = $id"); 
     if ($resultaat) { 
      $query = mysql_query("INSERT INTO user2pics (picid, userid, vote) VALUES ($id, $user, 1)"); 
      if ($query) { 
       $effectiveVote = getEffectiveVotes($id); 
       echo $effectiveVote . " votes"; 
      } elseif (!$query) { 
       echo "Failed!"; 
      } 
     } elseif (!$resultaat) { 
      echo "Failed insert in pics!"; 
     } 
    } else { 
     $row = mysql_fetch_array($result); 
     if ($row['vote'] == 0) { 
      $votes_down = $cur_votes[0] + 1; 
      $result = mysql_query("UPDATE pics SET likes = $votes_up WHERE picid = $id"); 
      if ($result) { 
       $resultaat = $mysqli -> prepare("UPDATE user2pics SET vote = 1 WHERE picid = $id AND userid = $user"); 
       $resultaat -> execute(); 
       $effectiveVote = getEffectiveVotes($id); 
       if ($resultaat -> affected_rows == 1) { 
        echo $effectiveVote . " votes"; 
       } 
      } 
     } else { 
      $effectiveVote = getEffectiveVotes($id); 
      echo $effectiveVote . " votes"; 
     } 
    } 
} else { 
    echo "Please login first!"; 
} 
} elseif ($action == 'vote_down'){ 
if (isset($_SESSION['loggedin'])) { 
    $result = mysql_query("SELECT * FROM user2pics WHERE picid = $id AND userid = $user"); 
    if (mysql_num_rows($result) == 0) { 
     $votes_down = $cur_votes[1] + 1; 
     $resultaat = mysql_query("UPDATE pics SET dislikes = $votes_down WHERE picid = $id"); 
     if ($resultaat) { 
      $query = mysql_query("INSERT INTO user2pics (picid, userid, vote) VALUES ($id, $user, 0)"); 
      if ($query) { 
       $effectiveVote = getEffectiveVotes($id); 
       echo $effectiveVote . " votes"; 
      } elseif (!$query) { 
       echo "Failed to dislike!"; 
      } 
     } elseif (!$resultaat) { 
      echo "Failed insert in pics!"; 
     } 
    } else { 
     $row = mysql_fetch_array($result); 
     if ($row['vote'] == 1) { 
      $votes_down = $cur_votes[1] + 1; 
      $result = mysql_query("UPDATE pics SET dislikes = $votes_down WHERE picid = $id"); 
      if ($result) { 
       $resultaat = $mysqli -> prepare("UPDATE user2pics SET vote = 0 WHERE picid = $id AND userid = $user"); 
       $resultaat -> execute(); 
       $effectiveVote = getEffectiveVotes($id); 
       if ($resultaat -> affected_rows == 1) { 
        echo $effectiveVote . " votes"; 
       } 
      } 
     } else { 
      $effectiveVote = getEffectiveVotes($id); 
      echo $effectiveVote . " votes"; 
     } 
    } 
} else { 
    echo "Please login first!"; 
} 
} 

$ cur_votes определяется как: $cur_votes = getAllVotes($id);

function getAllVotes($id) { 
$votes = array(); 
$q = "SELECT * FROM pics WHERE picid = $id"; 
$r = mysql_query($q); 
if (mysql_num_rows($r) == 1)//id found in the table 
{ 
    $row = mysql_fetch_assoc($r); 
    $votes[0] = $row['likes']; 
    $votes[1] = $row['dislikes']; 
} 
return $votes; 
} 

function getEffectiveVotes($id) { 
/** 
Returns an integer 
**/ 
$votes = getAllVotes($id); 
$effectiveVote = $votes[0] - $votes[1]; 
return $effectiveVote; 
} 
+3

Вы смешиваете функции 'mysql_ *' и 'mysqli_ *' – Fabio

+0

Нельзя смешивать функции 'mysql_ *' и 'mysqli_ *'. Просто используйте 'mysqli_ *' и связанные переменные в подготовленных операторах. – jeroen

+0

Где вы определяете '$ cur_votes'? – andrewsi

ответ

3

Вы дублирующие функциональность, сохраняя 'любит' в двух местах.

Я не смотрел на вашу слабую сущность (таблица для пользователей и голосов), поэтому предположим, что у нее будет три поля: user_id, item_id и vote TINYINT. Основной ключ на user_id и item_id, так что у одного и того же пользователя может быть только один голос за элемент.

Установить голосование 1 или -1 в зависимости от вверх или вниз, вместо того, чтобы хранить likes в таблице элементов, вычислить общий голос для элемента динамически, как это:

SELECT SUM(vote) FROM user_votes WHERE item_id = ?; 

Если вы хотите только положительные голоса, сделать это:

SELECT SUM(vote) FROM user_votes WHERE item_id = ? AND vote = 1; 

Когда пользователь хочет записать или изменить свой голос, вы можете использовать REPLACE INTO синтаксис (спасибо Anigel за предложение - я полностью пропустил), чтобы сохранить новый голос пользователя:

REPLACE INTO user_votes (user_id, item_id, vote) VALUES (?, ?, ?); 
+2

+1 для более надежного решения.Вы также можете просто использовать 'REPLACE INTO' вместо выбора, затем вставить/обновить, если у вас был первичный ключ в двух столбцах (' user_id', 'item_id') – Anigel

+0

Спасибо за ваш вклад, у меня уже есть такая таблица, называемая 'user2pics', я сохраняю как 1, а не нравится 0. Я буду рассматривать функцию суммы, поскольку она кажется намного проще, чем то, что я делаю сейчас. Спасибо! – Jef

+1

Анигель, совершенно не думал о «ЗАМЕНИТЬСЯ В», изменит мое предложение. –