【问题标题】:Simple PHP Voting System简单的 PHP 投票系统
【发布时间】:2012-05-07 10:32:01
【问题描述】:

我有一个简单的应用程序,它允许用户提交“问题”然后对其进行评论。我正在尝试制作一个简单的投票系统,以便用户可以“投票”问题,这反过来又会将他们推到更高的位置。我有一些 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 表中的投票不会改变。

【问题讨论】:

  • 你遇到什么样的错误?
  • 没有错误,当点击链接时,它会从 issue.php?problem=30 重定向到 issue.php?vote=up&id=30,这会删除页面上的一些内容。
  • add_problem_vote() 是否被调用?尝试在该函数中输出一些内容。

标签: php mysql


【解决方案1】:
$sql = "UPDATE `problems` SET `votes` = `votes` ".$vote." 1 WHERE `id` = ".$problem_id;
mysql_query($sql) or die(mysql_error());

检查您遇到了什么错误?

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

    • 恐怕不行。单击链接时如何测试该功能是否实际运行?
    【解决方案3】:

    我猜这是因为你没有建立到数据库的 MYSQL 连接。

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

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

    希望对您有所帮助。

    【讨论】:

    • 抱歉含糊不清。这只是一段代码,除此之外一切正常。我已经建立了连接(页面上的所有数据都来自 mysql 数据库),除了这些最近输入的代码行之外,一切正常。
    【解决方案4】:

    对此不太确定,但是:

    $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 
    

    小哥哥

    【讨论】:

      【解决方案5】:

      首先查询不正确

      $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 )");
      

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

      【讨论】:

      • 这不是一个好的解决方案,并且受制于竞争条件,如果网站繁忙,将失去选票。
      • 如果你想让它在竞争条件下工作,你可以使用 rowversion $sql = "update problems set votes = '$vote', rowversion = $rowversion+1 where id = '$problem_id' 和 rowversion = $rowversion";然后您可以检查受影响的行...
      • 或者只是 update problems set votes = (votes + 1) where id = '$problem_id' 而不必担心检查受影响的行并尝试重新申请投票等,因为它总是有效的。
      【解决方案6】:

      我很抱歉我的英语不好。我希望你能理解它:) 所以首先最好使用 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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          请检查以下错误

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

            • 请说明错误,以便我改进我的编程。每个程序员都用他/她自己的方式解决问题,我使用了最简单的易于理解但如果他们有错误而不是我希望知道错误退出的地方,
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-03-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-27
            • 1970-01-01
            • 2011-07-23
            相关资源
            最近更新 更多