PHP / MySQL:不插入数据库

时间:2012-02-23 01:12:03

标签: php mysql

好吧,我正试图让人们每24小时投票给一台“服务器”,但是现在,我被困在这里:

    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地址添加到数据库中。我知道我在做一些非常基本的错误,但我还在学习。

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

谢谢!

4 个答案:

答案 0 :(得分:4)

您的代码中存在多个问题。

  1. }while

  2. 缺少近括号function
  3. 我们不需要遍历所有选民表来查明数据库中是否有IP。我们可以在SQL命令中使用WHERE子句,如下所示:SELECT votersIp FROM voters WHERE votersIp = $userIp

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

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

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

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

  8. 糟糕的缩进使得我们这些人类读者难以理解代码。好的缩进更好。

  9. while循环是在搜索特定IP的查询结果上完成的。这意味着其中if的第一个条件永远不会是真的(不同的IP),所以永远不会运行INSERT

  10. 以下是改进版本:

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

    建议:你应该阅读并学习一本关于初学者编程的好书。由于我不能为您推荐一本特定的书,我建议您要求推荐一本书。对于初学者来说,这是一本学习如何编程的好书。

答案 1 :(得分:3)

您的逻辑需要改进 - 您执行查询以获取其中包含特定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 :(得分: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"; }
}

答案 3 :(得分:1)

你还没有提到实际出错的是什么,但你有问题:

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

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

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