2013-02-26 99 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和轮询现有数据的状态。