0

我是 PHP/MySQL 和整个网站设计的新手。我正在建立一个预定义用户可以投票的网站。我有一个包含用户列表的数据库。我试图避免重复投票。我读到您可以阻止 IP 地址或使用 cookie,但我正在尝试使用另一种方法。

在我的名为“用户”的数据库中,我有三列 - 用户名、密码和标志。Flag 的默认值为 0。一旦用户投票,我将该特定用户的 flag 设置为 1。现在,如果用户再次尝试投票,我想检查数据库中 flag 的值。如果为 0,我会将他发送到“感谢您投票”页面并更新我创建的另一个名为 results 的数据库,该数据库跟踪每个候选人收到的票数。如果没有,我将他带到另一个页面,上面写着“你已经投票了”。到目前为止一切正常,除了我不知道如何读取数据库中标志的值并使用它的 if 条件。

这是我到目前为止所拥有的:

<?php

$host="localhost"; // Host name 
$username="dbxxxxx"; // Mysql username 
$password="password"; // Mysql password 
$db_name="dbxxxxx_users"; // Database name 
$tbl_name="users"; // Table name 


// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");

$user = $_COOKIE["details"];  //cookie details has the username the user used to log in

$SQL = "SELECT flag FROM users WHERE Username='$user'";
$flag = mysql_query( $SQL );   //no clue what's happening here. Just trying random stuff
$db_field = mysql_fetch_assoc($flag);  


if($db_field==0)     //checking the value of flag in the database
{       
    mysql_query("UPDATE result SET Votes=Votes+1 //if flag in database = 0 
    WHERE Name='Candidate1'");  //updates result for candidate1 if the user voted for 1

    $user = $_COOKIE["details"];  //reading the cookie again. can be omitted.

    mysql_query("UPDATE users SET flag=1   //changing flag to 1 so user cannot vote again
    WHERE Username='$user'");

    header("location: http://www.lithuaniavote.com/thankyou.html");
 }

else    //flag != 1 or user has already voted
{
    header("location: http://www.lithuaniavote.com/alreadyvoted.html");
}

?>

PS:此代码将数据库中的标志从0更改为1。但是,if 条件有问题。即使标志为 1,我也可以投票,这表明我已经投票,或者换句话说,它永远不会带我进入已投票页面。

4

2 回答 2

0

我认为您应该尝试一种更清洁(且面向未来)的方法。让我用 PDO 重新构建您的问题的解决方案:

namespace Voting {
    $pdo = new \PDO("mysql:host={$host};dbname={$db_name};charset=utf8", $username, $password);

    if ($query1 = $pdo->prepare("SELECT `flag` FROM `users` WHERE `Username` = ?;", [\PDO::ATTR_CURSOR => \PDO::CURSOR_FWDONLY])) {
        if ($query1->execute([$_COOKIE["details"]])) {
            $result = $query1->fetch(\PDO::FETCH_ASSOC);

            if (intval($result["flag"]) === 0) {
                if ($query2 = $pdo->prepare("UPDATE `users` SET `flag` = '1' WHERE `Username` = ?")) {
                    $query2->execute([$_COOKIE["details"]]);
                    $pdo = null;
                    header("Location: http://www.lithuaniavote.com/thankyou.html");
                }
            } else {
                $pdo = null;
                header("Location: http://www.lithuaniavote.com/alreadyvoted.html");
            }
        }
    }
}

警告:考虑到我没有检查$_COOKIE安全性。您必须进行某种形式的清理以防止注入和其他漏洞。

于 2013-04-14T17:27:23.633 回答
0

原始代码:

$SQL = "SELECT flag FROM users WHERE Username=$user";
$flag = mysql_query( $SQL );   //no clue what's happening here. Just trying random stuff
$db_field = mysql_fetch_assoc($flag);  
if($db_field==0)     //checking the value of flag in the database

尝试这个:

$SQL = "SELECT flag FROM users WHERE Username = '$user'"; // $user should be in 'quotes'
$flag = mysql_query( $SQL );  // This is the actual query to the database
$db_field = mysql_result($flag, 0);  // This is the result of the query.
if($db_field===0)  // Use 3 equals signs instead of 2 in this case (which means "exactly equal to")
于 2013-04-14T04:08:57.243 回答