PHP/MySQL:不插入数据库

PHP/MySQL:不插入数据库,php,mysql,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 voters

好吧,我正试图让人们每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地址添加到数据库中。我知道我在这里犯了一些非常基本的错误,但我仍在学习

如果您能发布修复,但也能解释我做错了什么,我将不胜感激,任何建议都将非常好


谢谢大家!

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

if($rude[votersIp] = $pull) {
在这里,您分配的是
$rude[votersIp]
$pull
,而不是比较它-它应该是:

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

您的逻辑需要改进—您执行一个查询以获取其中包含特定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!
}
使用以下命令:

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

代码中有几个问题

  • 对于
    while
    函数

  • 我们不需要遍历所有投票者表来确定数据库中是否有IP。我们只需在SQL命令中使用
    WHERE
    子句,如下所示:
    selectvotersip fromsvotersip=$userIp

  • 有许多名称奇怪的不必要变量

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

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

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

  • 糟糕的缩进让我们人类读者更难理解代码。好的压痕更好

  • while
    循环根据搜索特定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);
        }
    }
    

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

    也缺少了
    votersIp
    的引号,不过如果没有定义
    votersIp
    常量,PHP会礼貌地将其视为带引号的字符串。我不确定这一点,因为我从来没有像他那样写过,但我不想说万一我错了,哈哈,它也不应该读
    if($rude[votersIp]==$pull)
    ,而应该读
    else
    。没错,至少现在他们知道在比较中哪里出了问题-应该有助于防止将来出现更多问题。正确缩进代码,删除不必要的换行符并删除未使用的变量。感谢固定版本,更感谢你告诉我出了什么问题!