我有以下PHP脚本:
<?php
$vote_type = $_GET['type'];
$book = $_GET['book'];
$id = $_GET['id'];
include 'pagehead.php';
$tracker_table = $book.'VoteTrack';
$username = $_SESSION['username'];
session_start();
if ($_SESSION['username'] == null) {
echo 'You must be logged in to vote';
echo '<br>';
echo '<a href="lesson.php?book='.$book.'&id='.$id.'">';
echo 'Return to lesson';
echo '</a>';
die();
}
include 'mysqlserver.php';
$con = mysql_connect($mysql_host, $mysql_username, $mysql_password);
if (!$con){
die ('Failed to connect to the database');
}
mysql_select_db("a6595899_s", $con);
$data_query = "SELECT * FROM $book WHERE id=$id";
$lesson_data = mysql_query($data_query);
$lesson_array = mysql_fetch_assoc($lesson_data);
$vote_cop_query = "SELECT * FROM $tracker_table WHERE user='$username' AND id=$id";
$vote_cop_data = mysql_query($vote_cop_query);
$vote_cop = mysql_fetch_assoc($vote_cop_data);
if (mysql_num_rows($vote_cop_data) != 0 && $vote_type == 'up' && $vote_cop['has'] == 1) {
echo 'You have already upvoted this lesson.';
echo '<br>';
echo '<a href="lesson.php?book='.$book.'&id='.$id.'">';
echo 'Return to lesson';
echo '</a>';
die();
} elseif (mysql_num_rows($vote_cop_data) != 0 && $vote_type == 'down' && $vote_cop['has'] == 2) {
echo 'You have already downvoted this lesson.';
echo '<br>';
echo '<a href="lesson.php?book='.$book.'&id='.$id.'">';
echo 'Return to lesson';
echo '</a>';
die();
}
$vote_count = $lesson_array['votes'];
if ($vote_type == 'up') {
$vote_count++;
$has_type = 1;
} elseif ($vote_type == 'down') {
$vote_count--;
$has_type = 2;
} else {
die('Vote type not specified.');
}
$new_or = mysql_num_rows($vote_cop_data);
if ($new_or == 0) {
$track_query = "INSERT INTO $tracker_table (user, id, has)
VALUES ('$username', $id, $has_type)";
} else {
$track_query = "UPDATE $tracker_table SET has=$has_type WHERE user='$username' AND id=$id";
}
mysql_query($track_query);
//actually cast vote..
$update_query = "UPDATE $book SET votes=$vote_count WHERE id=$id";
mysql_query($update_query);
echo 'Your vote has been submitted!';
echo '<br>';
echo '<a href="lesson.php?book='.$book.'&id='.$id.'">';
echo 'Return to lesson';
echo'</a>';
?>
这是一个非常简单的投票/投票系统。不幸的是,它在某些情况下会崩溃。假设我正在读一堂我觉得很好的课程,所以我就投票了。后来,我意识到这一课实际上很糟糕,所以我将其投票。在我第一次投票之后,课程有一点。在我投票之后,它再次为0。逻辑规定我应该能够再次投票,给它-1分。我的代码不允许这样做,因为我的脚本只是说连续两次不允许相同的操作。 我用什么数学来解决这个问题?
答案 0 :(得分:8)
问题出现在这里,你在对自己的upvote进行了投票后更新了用户的活动。
$track_query = "UPDATE $tracker_table SET has=$has_type WHERE user='$username' AND id=$id";
你应该做的是从表中删除记录而不是更新它,然后继续修改你已经存在的分数。这样,你做的下一次投票就是你已经完成的“第一次”投票。
或者,您可以使用第三种称为“nullify”或“撤销”的vote_cop类型,然后相应地修改投票警察。
请参阅下面的建议:
$hasVotedBefore = mysql_num_rows($vote_cop_data) != 0;
if ($hasVotedBefore) {
switch ($vote_cop_data['has']) {
case 0:
$vote_cop_type = 'revoked'; // Not really neccessary to do this, but just here for show.
break;
case 1:
$vote_cop_type = 'up';
break;
case 2:
$vote_cop_type = 'down';
break;
default:
break;
if ($vote_type == $vote_cop_type) { // We're here because we voted before and our new vote is the same as the old one.
if ($vote_type == 'up') {
echo 'You have already upvoted this lesson.';
echo '<br>';
echo '<a href="lesson.php?book='.$book.'&id='.$id.'">';
echo 'Return to lesson';
echo '</a>';
die();
} elseif ($vote_type == 'down') {
echo 'You have already downvoted this lesson.';
echo '<br>';
echo '<a href="lesson.php?book='.$book.'&id='.$id.'">';
echo 'Return to lesson';
echo '</a>';
die();
}
} else { // Were here because we've voted before, and our new vote is the opposite of the old vote.
// Update vote_cop row in the database so the 'has' column is 0 (value of a revoked vote)
// This way, for future votes, we know the user has voted before, but revoked their vote.
$track_query = "UPDATE $tracker_table SET has=0 WHERE user='$username' AND id=$id";
mysql_query($track_query);
}
} else { // We're here because we never voted before.
$track_query = "INSERT INTO $tracker_table (user, id, has) VALUES ('$username', $id, $vote_type)";
mysql_query($track_query);
}
// TODO: actually cast vote..