Php 如何规划投票系统?
我刚刚开始自学php。 我给自己微型项目来推动自己 到目前为止,我有一个通过php表单创建的MYSQL数据库。一列是为业力。 我将数据库表的值显示在一个html表中,在每行的末尾,我希望单击一个超链接,比如一个加号,将该行的业力级别提高1。然后加号就会消失Php 如何规划投票系统?,php,mysql,counter,increment,Php,Mysql,Counter,Increment,我刚刚开始自学php。 我给自己微型项目来推动自己 到目前为止,我有一个通过php表单创建的MYSQL数据库。一列是为业力。 我将数据库表的值显示在一个html表中,在每行的末尾,我希望单击一个超链接,比如一个加号,将该行的业力级别提高1。然后加号就会消失 我希望每一行都有一个自动递增的整数作为主键。对于这个例子,让我们假设您对这么多答案进行投票。这将需要至少三个表: 用户,答案,投票 投票表将保存所有历史记录: voteid | userid | answerid | value ------
我希望每一行都有一个自动递增的整数作为主键。对于这个例子,让我们假设您对这么多答案进行投票。这将需要至少三个表: 用户,答案,投票 投票表将保存所有历史记录:
voteid | userid | answerid | value
----------------------------------
1 | 12 | 383 | 1
2 | 28 | 383 | -1 (negative number would require signed values)
在这个例子中,我们看到记录了两票。用户12和28都对答案383进行了投票。用户12喜欢它,并在其支持中添加了1。用户28不喜欢它,从它的支持中减去1
每当用户投票时,您都应该首先检查该用户是否已经对该特定问题进行了投票。如果他们有,您可以拒绝任何进一步的投票尝试,或用新的投票覆盖他们的旧投票
SELECT *
FROM votes
WHERE (userid = 12)
AND (answerid = 383)
这是一个非常简单的示例查询,它将告诉您用户是否已经投票。如果它返回记录,你就知道他们已经投票了。您可以用一条非常友好的“对不起,您已经投票了”消息来回应,或者您可以覆盖它:
UPDATE votes
SET value = $votevalue
WHERE (userid = 12)
AND (answerid = 383)
话虽如此,让我们看看SO是如何做到这一点的:
单击向上投票箭头时,SO会向url发出请求,如下所示:
http://stackoverflow.com/posts/1303528/vote/2
就个人而言,我喜欢乔纳森的回答。 然而,如果你觉得你可能需要更多的信息,我可能会提供帮助 作为一个小型项目,我尝试为我的大学建立一个类似bash.org的报价数据库。
它是使用MySql和PHP开发的,它的发布/投票功能与您试图实现的功能非常相似
这绝不是一个设计良好的web应用程序。然而,它可能会让你朝着正确的方向前进 现场测试现场:(温柔一点!) GitHub上的代码: 我会看一看这个,这个,还有这个
代码的前言相当简单明了。需要注意的是“过滤输入”,这些函数来自PHP库,用于清理用户输入以防止SQL注入 真正的问题在哪里?嗯,也许你想要AJAX。缓存投票计数也是个好主意,尤其是对于流行问题。 vote.php?answerid=383&vote=1
if ($_GET) {
$userid = $_SESSION["userid"]; // assumes the user is logged in via SESSIONS
$answerid = $_GET["answerid"];
$votetype = $_GET["vote"];
$query = "SELECT *
FROM votes
WHERE (userid = {$userid})
AND (answerid = {$answerid})";
$result = mysql_query($query) or die(mysql_error());
if (mysql_num_rows($result) > 0) {
# User has voted
print "Sorry, you are only allowed one vote.";
} else {
# User has not voted, cast the vote
$query = "INSERT INTO votes (userid, answerid, votevalue)
VALUES({$userid},{$answerid},{$vote})";
$result = mysql_query($query) or die(mysql_error());
if (mysql_affected_rows($result) > 0) {
print "Your vote has been recorded.";
}
}
}