7

我有一个简单的应用程序,它允许用户提交“问题”然后对其发表评论。我正在尝试制作一个简单的投票系统,以便用户可以“投票”问题,这反过来又会将他们推到更高的位置。我有一些 PHP 的基本知识,到目前为止一切正常,我只是不知道如何让它工作。

我已经在线学习了一个教程,到目前为止,我的问题.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 表中的投票不会改变。

4

9 回答 9

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

Check what error you are getting ?

于 2012-06-01T11:29:42.293 回答
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 

大块头

于 2012-05-15T15:40:58.257 回答
0

我猜这是因为您没有建立与数据库的 MYSQL 连接,所以这种方式不起作用。

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

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

希望有帮助。

于 2012-05-07T10:53:20.030 回答
0

请检查以下错误

  • 在 problem.php 中包含 functions.php
  • 使用 mysqli_query($sql) insted of mysql_query($sql)。因为它已被弃用。你也可以使用 PDO
  • 使用 die(mysqli_error($connection_varible)) 函数来跟踪 sql 错误。
于 2015-01-22T06:17:44.153 回答
0

尝试这个 :

"UPDATE `problems` SET `votes` = `votes` ".mysql_real_escape_string($vote)." 1 WHERE `id` = ".mysql_real_escape_string($problem_id);
于 2012-05-07T11:04:18.183 回答
0

如果你想继续你的第一个解决方案,查询应该是:

$sql = "update `problems` set `votes` = `votes` + 1 where `id` = '$problem_id'";
于 2014-10-01T08:21:42.223 回答
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(vote) FROM ....... GROUP BY idProblems

于 2014-09-04T10:27:22.263 回答
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 )");

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

于 2014-06-15T18:58:38.023 回答
0

在 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);

}
于 2015-02-11T12:41:08.543 回答