2013-04-14 89 views
0

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

在我的数据库名为'用户'我有三列 - 用户名,密码和标志。 标志的默认值为0.一旦用户投票,我将该特定用户的标志设置为1.现在,如果用户试图再次投票,我想检查数据库中标志的值。如果它是0,我会将他发送给“感谢您投票”页面,并更新我创建的另一个数据库,称为结果,以记录每个候选人收到的投票数。如果不是,我带他到另一页说:“你已经投了票。”到目前为止,一切正常,除非我不知道如何读取数据库中的标志值并使用它的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,我也能够投票,这表明我已经投了票,换句话说,它从未将我带到已投票页面。

+1

我会猜测问题是你的SQL更新标志的语法错误,但是你的代码有比这更糟糕的问题。您正在使用未转义的用户输入构建SQL查询。 – Cairnarvon

+0

调试你的代码:[如何在PHP中获取有用的错误消息?](http://stackoverflow.com/q/845021/1409082) – Jocelyn

+1

你也在混合'$ db_field'和'$ fdb_field'。 – icktoofay

回答

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") 
+0

这并没有多大帮助。如果我用这里的代码替换代码......即使用户第一次投票,每次都会将我带到已投票页面。 让我问你这个问题,你如何从数据库中读取一个值并将其存入另一个变量?如果您要从数据库中读取值并将其存储在PHP中的变量中,那么您会如何做到这一点? –

+0

非常感谢。感谢您的反馈。:) –

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安全。您必须进行某种形式的卫生处理以防止注射和其他漏洞。

+0

哦,几乎忘了提及它...这个代码应该按原样在PHP 5.4.x下运行。如果你需要在PHP 5.3.x中运行,用数组括号('[]')替换数组,并用'array()'替换它们。如果是PHP 5.2.x,请删除所有PDO操作的名称空间和'\\'符号(它只能在PHP 5.3.x +中使用)。希望有帮助;) –

+0

非常感谢您的回复,Julio。我使用PHP 5.3.15版本,它显示我在这一行上有错误:if($ query1 = $ pdo-> prepare(“SELECT'flag' FROM'users' WHERE'Username' =?;”,[\ PDO :: ATTR_CURSOR => \ PDO :: CURSOR_FWDONLY])) 以下是错误: 解析错误:语法错误,意外的'['in /nfs/c03/h04/mnt/166547/domains/lithuaniavote.com/html/在线8投票。希望你能进一步帮助。 –

+0

当然,我习惯于编写符合PHP 5.4的代码,所以你只需要用'array(\ PDO :: ATTR_CURSOR => \ PDO:'替换'[\ PDO :: ATTR_CURSOR => \ PDO :: CURSOR_FWDONLY] :CURSOR_FWDONLY)'。这应该让你去:) –