如何在单击元素时更新表行+1?

时间:2015-12-07 19:02:07

标签: php mysql count row voting

我正在建立一个问题投票系统。该网站的访问者可以每天或某些人投票选出他们最喜欢的问题。 如果点击特定问题的按钮,如何向QuestionVotes行+1?

我的代码:

<?php
    $connection = mysqli_connect('localhost', 'root', '', 'test');
    mysqli_set_charset($connection, 'utf8');
    if (!$connection) {
        die("Database connection failed: " . mysqli_error());
    }
    $sql = "SELECT QuestionHeader, QuestionText, QuestionVotes FROM question ORDER BY QuestionVotes DESC LIMIT 3";
    $result = $connection->query($sql);

    if ($result->num_rows > 0) {
         // output data of each row
         while($row = $result->fetch_assoc()) {
             echo "<div class=\"col-md-4\"><h2>". $row["QuestionHeader"]. "</h2><p>". $row["QuestionText"]. "</p><p><a class=\"btn btn-success\"> " . $row["QuestionVotes"] . "</a></p></div>";
         }
    } else {
         echo "0 results";
    }

    $connection->close();
?>

我猜我必须以某种方式存储QuestionID然后在点击按钮时检索它,但我对如何无能为力?如何避免人们在同一个问题上投票两次?

2 个答案:

答案 0 :(得分:1)

好吧,您需要更改数据库表或创建链接在一起且具有1对多关系的其他表,问题表为1,存储每个user's vote的表是多方。

  1. 每个问题都应该有唯一的ID

  2. 如上所述,循环查看Questions表格中的问题。每行应该有一个按钮,单击该按钮时,将问题ID +用户ID /(IP地址 - 如果系统对非注册用户开放)传递给user's vote表。

    2a上。要在每次唯一身份用户点击vote按钮时增加计数,您必须FetchCount表中获取user's vote,以查看Question ID表的user's vote次{1}}存在。

  3. 但是,在将数据存储到数据库之前,请检查 $dbname = "DB HERE"; $servername = "HOST HERE"; $username = "DB USER HERE"; $password = "DB PASSWORD HERE"; // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname); if(isset($_GET['id'])) { ///Check to see if user already voted $result = $conn->query("SELECT * FROM User_Votes where user id = $session_id and question_id = $id"); $row_cnt = $result->num_rows; if($row_cnt < 1) { ///SQL to insert vote into Users Votes table }else { //Vote already exists } } // Loop through questions for voting $result = mysqli_query($conn,"select * from questions"); while($db_questions = mysqli_fetch_object($result)) { echo $db_questions->question_title; echo '- <a href="mypage.php?id=$db_questions->question_id">Click to Vote</a>; } 表以查看该用户ID +问题ID是否已匹配,如果是,返回一条消息,告诉用户他们已经对该问题进行了投票(或者您可以看到并在页面上进行检查,如果匹配 - 禁用投票按钮)

    !(Test-Path "$Dir\Target\$Filename") 
    

答案 1 :(得分:1)

您将遇到的最大障碍是识别独特用户。最好的方法是强制注册和登录。这是另一个话题的讨论。

无论你的桌子需要另外两列。

QuestionID MediumINT(15),无符号,主索引,自动递增。这应该是第一列。

QuestionVoters文字,NULL。该字段将包含已投票的json编码的用户标识数组。 array('123', '38', '27', '15')

While()循环中检查用户的ID是否在QuestionVoters数组中。

如果存在,则不要给他们投票。否则,使用按钮构建表单以提交到处理页面。

<?php
// Need to assign the user's ID to a variable ($userID) to pass to the form.
$userID = '123'; // this needs to be handled on your end.

// updated sql to include Id and voters
$sql = "SELECT QuestionID, QuestionHeader, QuestionText, QuestionVotes, QuestionVoters FROM question ORDER BY QuestionVotes DESC LIMIT 3";

while($row = $result->fetch_assoc()) {

    $voters = json_decode($row['QuestionVoters'], true); // array of userid's that have voted
    IF (in_array($userID, $voters)) {
        // user has voted
        echo "\n
        <div class=\"col-md-4\">
            <h2>". $row["QuestionHeader"]. "</h2>
            <p>". $row["QuestionText"]. "</p>
            <p>" . $row["QuestionVotes"] . "</p>
        </div>";
    }ELSE{
        // user has not voted
        echo "\n
        <div class=\"col-md-4\">
            <form action=\"vote_processing.php\" name=\"voting\" method=\"post\">
            <input type=\"hidden\" name=\"qid\" value=\"".$row['QuestionID']."\" />
            <input type=\"hidden\" name=\"userid\" value=\"".$userID."\" />
            <h2>". $row["QuestionHeader"]. "</h2>
            <p>". $row["QuestionText"]. "</p>
            <p><button type=\"submit\" value=\"Submit\">" . $row["QuestionVotes"] . "</button></p>
            </form>
        </div>";
    }

}
?>

vote_processing.php (示例)

<?php
IF (isset($_POST['qid'])) {

    $qid = htmlspecialchars(strip_tags(trim($_POST['qid']))); // basic sanitization
    $userid = htmlspecialchars(strip_tags(trim($_POST['userid']))); // basic sanitization

    IF ( (is_int($qid)) && (is_int($userid)) ) { // validate that both are integers

        // db connection
        $connection = mysqli_connect('localhost', 'root', '', 'test');
        mysqli_set_charset($connection, 'utf8');
        if (!$connection) {
            die("Database connection failed: " . mysqli_error());
        }

        // Get voters array
        $sql = "SELECT QuestionVoters FROM question WHERE QuestionID = '".$qid."'";
        $result = $connection->query($sql);
        if ($result->num_rows > 0) {
            while($row = $result->fetch_assoc()) {
                IF (!empty($row['QuestionVoters'])) {
                  // decode users array
                  $voters = json_decode($row['QuestionVoters'], true);
                }ELSE{
                  $voters = array(); // create array
                }
            }
            mysqli_free_result($result);

            // re-validate the userID "is not" in array
            IF (!in_array($userid, $voters)) { // note the ! [meaning NOT].

                $voters[] = $userid; // add userid to voters array
                $qvoters = json_encode($voters); // encode voters array

                // update vote
                $sql_upd = "UPDATE question SET QuestionVotes = QuestionVotes + 1, QuestionVoters = $qvoters WHERE QuestionID = '".$qid."'";
                $upd_result = $connection->query($sql_upd);

            }

        }

        mysqli_close($connection);

    }

}

// redirct back to previous page
?>