简单的PHP投票系统

时间:2012-05-07 10:32:02

标签: php mysql

我有一个简单的应用程序,允许用户提交“问题”,然后对它们发表评论。我试图建立一个简单的投票系统,这样用户就可以“投票”出问题,这反过来会把他们推到一个清单上面。我有一些PHP的基本知识,到目前为止一切正常,我只是无法弄清楚如何让它工作。

我已经在线阅读了一个教程,到目前为止我已经在我的problem.php页面上了...

if (isset($_GET['vote'], $_GET['id'])){
        add_problem_vote($_GET['id]'], $_GET['vote']);
    }

<a href="?vote=up&amp;id=<?php echo $problemID; ?>">Vote</a>

在我的functions.php页面上......

function add_problem_vote($problemID, $vote){

    $problemID = (int)$problemID;

    $vote = ($vote === 'up') ? '+' : '-';

    $sql = "UPDATE `problems` SET `votes` = `votes` {$vote} 1 WHERE `id` = {$problem_id}";

    mysql_query($sql);
}

我的所有表格字段都是正确命名的。我知道在会议结束后有很多事情要考虑重新投票,但只要我表明这个想法就不一定是完美的。在点击链接的那一刻,它会重定向到一个页面,但是在mysql表中投票不会改变。

9 个答案:

答案 0 :(得分:1)

$sql = "UPDATE `problems` SET `votes` = `votes` ".$vote." 1 WHERE `id` = ".$problem_id;
mysql_query($sql) or die(mysql_error());

检查你得到了什么错误?

答案 1 :(得分:0)

这不起作用,因为你没有建立与数据库的MYSQL连接,我想。

对于我的PHP项目,我(重新)使用我曾经每次编写的类,包装所有这些函数,并进行适当的错误处理等。

也许你应该考虑这样的事情,或者你至少需要在执行查询之前添加mysql_connect

希望有所帮助。

答案 2 :(得分:0)

试试这个:

"UPDATE `problems` SET `votes` = `votes` ".mysql_real_escape_string($vote)." 1 WHERE `id` = ".mysql_real_escape_string($problem_id);

答案 3 :(得分:0)

对此完全不确定,但是:

$problemID = (int)$problemID;

应该是:

$problemID = intval($problemID);

每当某些东西停止工作时,我总是添加一个

echo $sql;

在调用mysql_query()之前;这样我就可以将结果复制并粘贴到SQL浏览器中,看看它是否正确。

编辑:看了一下,因为有些人之前已经逃脱了SQL语句,我认为值得一提的是尝试:

$sql = "UPDATE `problems` SET `votes` = `votes` {$vote} 1 WHERE `id` = {$problem_id}";

要:

$sql = "UPDATE `problems` SET `votes` = `votes` {".$vote."} 1 WHERE `id` = {$problem_id}";

但如果所有SQL正在进行,那么为什么不尝试:

$sql = "UPDATE `problems` SET `votes` = `votes`+1 WHERE `id` = {$problem_id}";

因为它正是你正在做的事情,所以不需要传递$ vote参数。

其他简单的调试选项包括:

print_r($_POST); // to show all the POSTED variables from a form
print_r($_GET);  // to show all the parameters from the URL 

BBloke

答案 4 :(得分:0)

首先查询不正确

$sql = "UPDATE `problems` SET `votes` = `votes` {$vote} 1 WHERE `id` = {$problem_id}";

校正

$sql = "update `problems` set `votes` = '$vote' where `id` = '$problem_id'";

我会建议另一种方式。 用这些列表投票: - 用户(用户的ID) - 问题(需要投票的东西的ID) - 投票(或数字(例如:0到4)或选项(a,b,c ......))

主键=用户,问题

现在您可以轻松插入/更新投票

mysql_query("replace into votes values ( $userid, $question, $vote )");

DONE!并且您可以轻松获得平均值(如果您选择了投票作为数字)或投票数(如果您选择了选项)!

答案 5 :(得分:0)

我很抱歉我的英语不好。我希望你能理解:) 所以首先要更好地使用 mysqli 或pdo。 如果你创建新表进行投票,你将来会有更多的选择(加入用户排名,平均具体用户排名,验证用户之前是否已投票,......)

灵感: 用户端(发送使用jquery - ajax):

<a href="IDOFPROBLEM" title="VoteUp" class="voteUp">VoteUp</a>
    <script>
        $(document).ready(function() {
            $(".voteUp").click(function(e) {
                e.preventDefault();

                var id = $(this).attr("href");

                $.ajax({
                    type: "POST",
                    //This is destination of php script
                    url: "YOURVOTEUPFILE.php?vote=up",
                    data: {id: id}
                })
                        .done(function(msg) {
                    //msg contains data from php script so you can show message to user good or bad :)
                    alert(msg);
                });
            });
        });
    </script>

服务器端:

final class manageVote {

    /**
     * Id of problem
     * @var int|string 
     */
    private $voteFor;
    /**
     * Id of user
     * @var int|string 
     */
    private $whoVote;

    /**
     * Mysqli
     * @var \mysqli 
     */
    private $database;

    /**
     * Construct - initialize variable
     * @param int|string $voteFor
     * @param int|string $whoVote
     * @param \mysqli $db
     */
    public function __construct($voteFor, $whoVote, &$db) {

        $this->voteFor = $voteFor;
        $this->whoVote = $whoVote;
        $this->database = $db;
    }

    /**
     * Try to make vote
     * @param string $upOrDown "up" or "down"
     * @return boolean
     */
    public function vote($upOrDown) {
        if (!$this->verifyIfUserCannote() || ($upOrDown != "up" && $upOrDown != "down"))
            return false;
        //Change database name to your name
        //Better solution is sql table for all ranks
        //And you need "whoVote" because I think one problem - one vote for one user
        /*
         * Table could be:
         * idvote PK NN AI
         * vote INT NN
         * idproblems FK NN
         * whoVote FK NN
         */
        $sql = "INSERT INTO `DATABASENAME`.`problems` (`idproblems`, `vote`, `whoVote`) VALUES('" . $this->voteFor . "', '" .
                ($upOrDown == "up" ? 1 : -1) . "', '" . $this->whoVote . "')";
        $query = $this->database->query($sql);
        if (!$query)
            return false;
        return true;
    }


    private function verifyIfUserCannote() {
        $sql = "SELECT COUNT(*) AS 'cnt' FROM `DATABASENAME`.`problems` WHERE `idproblems` = '" . $this->voteFor . "' AND `whoVote` = '" . $this->whoVote . "'";

        $query = $this->database->query($sql);

        if (!$query)
            return false;

        $result = mysqli_fetch_array($query);

        return ($result["cnt"] == 0 ? true : false);
    }

}

if (isset($_GET["vote"])) {
    $voteClass = new manageVote($_POST["id"], $someYourIdentificatorWhoVote, $mysqliDatabaseReference);

    echo ($voteClass->vote($_GET["vote"]) == true ? "TRUE" : "FALSE");
}
 else 
     echo "FALSE";

对于最终投票级别,使用SQL命令SELECT SUM(投票)FROM ....... GROUP BY idProblems

答案 6 :(得分:0)

如果您想继续使用第一个解决方案,则查询应为:

$sql = "update `problems` set `votes` = `votes` + 1 where `id` = '$problem_id'";

答案 7 :(得分:0)

请检查以下错误

  • 在problem.php
  • 中包含functions.php
  • 使用myqli_query($ sql)insted of mysql_query($ sql)。因为它已被弃用。你也可以使用PDO
  • 使用die(mysqli_error($ connection_varible))函数来跟踪sql错误。

答案 8 :(得分:0)

使用&#39;和&#39;在is-set函数中的两个数据之间或者只是其中一个数据可以用于is-set函数。

 if (isset($_GET['vote'] &&  $_GET['id'])){
                add_problem_vote($_GET['id]'], $_GET['vote']);
            }

        <a href="?vote=up&amp;id=<?php echo $problemID; ?>">Vote</a>



    function add_problem_vote($problem_id,$vote)
{
$query_select="select votes from problems where id='".$problem_id."'";
$query_run=mysql_query($query_select);
if(mysql_num_rows($query_run)>0)
{
$vote_num=mysql_result($query_run,0,votes)
if($vote==up)
$vote_num=+$vote_num;
else
$vote_num=-$vote_num
}
$sql = "UPDATE `problems` SET `votes` = '$vote_num'  WHERE `id` = '".$problem_id.'"";

    mysql_query($sql);

}