如何检查IP是否已存储在mysql中?

时间:2015-01-12 20:04:08

标签: php mysql ip

我有这个反馈表,但我需要一些帮助。我想阻止人们发布反馈,如果他们已经使用相同的ip,它存储在数据库中。这是代码:

<?php
if(isset($_POST['add'])){
    $name = $_POST['name'];
    $email = $_POST['email'];
    $comment = $_POST['comment'];
    $ip = $_SERVER['REMOTE_ADDR'];
    $datetime = date('Y-m-d H:i');
    $checkIp = mysql_query("SELECT ip from comments WHERE ip = '$ip'");
    if (mysql_num_rows($checkIp) > 0) {
        echo "Only 1 feedback per IP allowed!";
        $IP = mysql_fetch_array($checkIp);
        print_r($IP);
    }
    if($name){
        if($email){
            if($comment){
                if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
                    mysql_query("INSERT INTO comments (id, name, email, comment, ip, datetime) VALUES ('','$name','$email','$comment','$ip','$datetime')");
                }
                else                        
                    echo "The email address is invalid!<br><br>";
            }
            else
                echo "You haven't entered any comment!<br><br>";
        }
        else
            echo "You haven't entered an email address!<br><br>";
    }
    else
        echo "You haven't entered your name!<br><br>";  
}

我试图自己动手,但失败了(你可以在顶部看到我尝试了一些功能),有人可以告诉我该怎么做吗?

1 个答案:

答案 0 :(得分:1)

您应该使用PDO或mysqli_使用准备好的语句而不是mysql_,因为它已被弃用并且将被删除。此外,如果您确实希望IP地址在此表中是唯一的,则应在该字段上设置unique约束。

但是,您可以通过在if-statement中添加exit;来检查行数,这样就可以使这段代码尽可能地工作(大约90-98%的情况):< / p>

if (mysql_num_rows($checkIp) > 0) {
    echo "Only 1 feedback per IP allowed!";
    $IP = mysql_fetch_array($checkIp);
    print_r($IP);
    exit; //stop execution here so nothing else happens
}

代码将对SQL注入开放,但是,如果你继续使用mysql_,它将不会那么简单,并且会留下一个技术上的可能性,以某种方式结束不止一个相同的数据库中的IP。

例如,如果两个请求同时进入,并且两个请求都读取数据库尚未拥有IP,则插入两个请求。由于数据库服务器本身将管理约束,因此在表中存在约束,这是不会发生的。