2012-02-23 156 views
0

好吧,我试图让这个人可以投票选出“服务器”,每24小时,但目前,我被困在这里:PHP/MySQL的:不插入到数据库

function vote1() { 
    $pull = $_SERVER['REMOTE_ADDR']; 
    $votersIp = "select votersIp from voters"; 
    $usersIp = $_SERVER['REMOTE_ADDR']; 





    $fetch = mysql_query("SELECT * FROM voters WHERE votersIp = '".$_SERVER['REMOTE_ADDR']."'"); 



     while($rude = mysql_fetch_array($fetch)){ 

    if($rude[votersIp] != $pull) { 
    $zoot="INSERT INTO voters (votersIp, lastVoted) VALUES ('$usersIp', '0')"; 
    mysql_query($zoot) or die (mysql_error()); 
    echo 'Voters IP not in database'; //debugging 
    } 

    if($rude[votersIp] = $pull) { 
    echo 'found ip'; //debugging 
    } 

} 

所以,如果你说不出来,我试图让它每次有人投票时都会把它的IP地址添加到数据库中。我知道我在这里做了一些非常基本的错误,但我仍然在学习。

如果您可以发布修复程序,但也解释我做错了什么,并且任何建议都会很棒,我将不胜感激。

谢谢!

+0

发生了什么? – 2012-02-23 01:23:56

+0

正确缩进代码,删除不必要的换行符并删除未使用的变量。 – kba 2012-02-23 01:28:47

回答

4

有在你的代码的几个问题。

  1. 闭括号}缺失,无论是对while或为function

  2. 我们并不需要遍历所有的选民表,以找出是否一个IP是在数据库或不。我们可以简单地用一个WHERE子句中的SQL命令,就像这样:SELECT votersIp FROM voters WHERE votersIp = $userIp

  3. 有很多奇怪的名字不必要的变量。

  4. 作为一项安全措施,我们将用作SQL命令一部分的任何内容都应该转义,以避免受到某些类型的攻击。

  5. 当数组索引是字符串时,它们应该在引号之间。所以,$rude[votersIp]是错误的,而$rude['votersIp']是正确的。 (没有引号,PHP将其解释为常量,而不是字符串。)

  6. $rude[votersIp] = $pull语句是一个变量赋值语句。您应该使用正确的运算符==来比较值:$rude[votersIp] == $pull

  7. 不良缩进使得代码难以被我们,人类读者理解。良好的缩进比较好。

  8. while循环赖以搜寻SEARCH_TERM_EXAMPLES特定IP查询的结果完成。这意味着if里面的第一个条件永远不会是真的(一个不同的IP),因此永远不会运行INSERT

这里是一个改进版本:

function vote() 
{ 
    $ip = $_SERVER['REMOTE_ADDR']; 
    $select = 'SELECT votersIp FROM voters WHERE votersIp = "' . mysql_real_escape_string($ip) . '"'; 
    $search = mysql_query($select); 
    $voter = mysql_fetch_array($search); 

    if (!empty($voter)) 
    { 
     echo 'found ip'; //debugging 
    } 
    else 
    { 
     echo 'Voters IP not in database'; //debugging 
     $insert = 'INSERT INTO voters (votersIp, lastVoted) VALUES ("' . mysql_real_escape_string($ip) . '", "0")'; 
     mysql_query($insert); 
    } 
} 

建议:你应该阅读和学习有关编程初学者一本好书。由于我无法为您推荐特定的书籍,因此我建议您要求提供图书推荐。一本好书,学习如何编程,适合初学者。

+0

感谢您的固定版本,并感谢更多的告诉我什么是错的! – Hunt3r 2012-02-23 04:21:29

1

您没有提到什么实际去错了,但你在这里有一个问题:

if($rude[votersIp] = $pull) { 

在这里,你要分配$rude[votersIp]$pull的值,而不是比较它的 - 它应该阅读:

if($rude[votersIp] == $pull) { 
+0

还缺少quotesIp'引号,但如果没有定义'votIp'常量,PHP会礼貌地将其视为引用字符串。 – 2012-02-23 01:23:43

+0

我不知道这一点,因为我从来没有这样写他,但我不希望的情况下,说我错了,哈哈 – BenOfTheNorth 2012-02-23 01:24:25

+1

其实,它不应该读'如果($粗鲁[votersIp] == $拉)“,但只是”其他“。 – kba 2012-02-23 01:50:58

3

你的逻辑需要改进 - 你做一个查询来获取带有特定IP的所有记录,然后遍历这些结果,并插入一条记录,如果你刚才告诉数据库为你提取的非ip地址不在结果。

这就像进入一家餐厅,点了一份牛排,然后向服务员抱怨说,你被送达牛排(IP在数据库中)。如果餐厅没有牛排(IP没有列出),那么您的代码什么也不做,只是忽略了投票,因为只有在数据库中已经存在IP的情况下才会记录IP。

你应该有这样的事情:

$fetch = mysql_query("SELECT count(*) AS cnt FROM voters WHERE votersIp='{$_SERVER['REMOTE_ADDR']}'") or die(mysql_error()); 
$row = mysql_fetch_assoc($fetch); 
if ($row['cnt'] == 0) { 
    // ip is not in the database, allow the vote 
} else { 
    // ip is listed, no vote for you! 
} 
2

使用此:

function vote1() { 

    $mysqli=new mysqli("hostname", "username", "password", "database"); 

    //Check to see if voter is in DB 
    $stmt = $mysqli->prepare("SELECT id FROM voters WHERE votersIp = ?"); 
    $stmt->bind_param('s', $_SERVER['REMOTE_ADDR']); 
    $stmt->execute(); 
    $stmt->bind_result($rude); 
    $stmt->fetch(); 
    $stmt->close(); 

    //If not, add him to the DB 
    if($rude[votersIp] != $_SERVER['REMOTE_ADDR']) { 

     //The DateTime 
     $mySqlDateTime= date("Y-m-d H:i:s", $_SERVER['REQUEST_TIME']); 

     //Insert Into DB 
     $stmt = $mysqli->prepare("INSERT INTO voters (votersIp, lastVoted) VALUES (?, ?,)"); 
     $stmt->bind_param('ss', $_SERVER['REMOTE_ADDR'], $mySqlDateTime); 
     $stmt->execute(); 
     $stmt->close(); 

     echo "User Added"; 
    } 

    else{ echo "User Already Exhists"; } 
}