2013-02-26 123 views
0

我想爲我的網站做一個投票系統。我不確定如何設置數據庫表,以便1個用戶可以喜歡或不喜歡某個帖子(他可以喜歡/不喜歡任何其他帖子(但只有一次 - 不喜歡/不喜歡帖子不止一次))。php投票系統 - 數據庫問題

我有一個用戶表,其中'用戶名'是主鍵。
然後我有以下列的帖子表:post_text,timestamp,post_id(這是主鍵),user_name(FK是來自users表的用戶名),category,posvotes,negvotes
last table is votes table:username(FK is username來自users表),post_id(FK是post_id,來自posts表),votedpos,voteedneg。
我真的不確定表是否設置正確,以使其工作。

這裏是我的PHP代碼:(這是一箇舊的代碼,查詢將改爲mysqli的報表,所以不介意棄用MySQL的語句)
$ POST_ID和$ USER_NAME是否正常工作,並有當前用戶名和POST_ID。

$post_id = $_SESSION['post_id']; 
$user_name = $_SESSION['user_name']; 
if(mysql_query("SELECT * FROM posts WHERE post_id='".$post_id."' AND user_name='".$user_name."' AND(SELECT * FROM votes WHERE post_id='".$post_id."' AND votedpos=0)")) 
{ 
$vote = "UPDATE posts SET posvotes=posvotes+1 WHERE post_id='".$post_id."'"; 
$runvote = mysql_query($vote) or die("error"); 
$safe = "UPDATE votes SET votedpos=1 WHERE post_id='".$post_id."'"; 
$runsafe = mysql_query($safe); 
if(mysql_query("SELECT * FROM posts WHERE post_id='".$post_id."' AND user_name='".$user_name."' AND(SELECT * FROM votes WHERE votedpos>0 AND username='".$user_name."')"))  //if u +voted, then fail 
{ 
    echo "cant vote twice"; 
} 
else 
{ 
    if(mysql_query("SELECT * FROM posts WHERE post_id='".$post_id."' AND user_name='".$user_name."' AND (SELECT * FROM votes WHERE negvotes>0 AND username='".$user_name."')"))  //if u negvoted previously, change your vote to plusvote 
    { 
     $vote = "UPDATE posts SET posvotes=posvotes+1 WHERE post_id='".$post_id."'"; 
     $runvote = mysql_query($vote); 
     mysql_query("UPDATE posts SET negvotes=negvotes-1 WHERE post_id='".$post_id."'"); 
     mysql_query("UPDATE votes SET votedneg=0 WHERE post_id='".$post_id."'"); 
     $safe = "UPDATE votes SET votedpos=1 WHERE post_id='".$post_id."'"; 
     $runsafe = mysql_query($safe); 
    } 
} 
} 

對於不喜歡一個帖子我也有同樣的腳本(除了其中正票是消極因素會)。但我不能讓這個工作,不知道我的表設置是錯誤的還是我的PHP編碼。

+5

[**請不要在新代碼中使用'mysql_ *'函數**](http://bit.ly/phpmsql)。他們不再被維護[並被正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。如果你選擇PDO,[這裏是一個很好的教程](http://j.mp/PoWehJ)。 – j0k 2013-02-26 23:11:18

+2

我喜歡它如何在代碼中擁有'safe',而它確實不是:) – PeeHaa 2013-02-26 23:13:56

+0

哦。它應該被命名爲保存:) – user1902427 2013-02-26 23:16:55

回答

0

如果您更改您的投票表使用用戶名和post_id作爲主鍵與投票值的枚舉(vote_up,neutral,vote_down)然後它似乎解決問題,而無需將邏輯推入到PHP和輪詢現有數據的狀態。