【问题标题】:How to check if an IP is already stored in mysql?如何检查一个IP是否已经存储在mysql中?
【发布时间】:2015-03-10 16:24:44
【问题描述】:

我制作了这张反馈表,但我需要一些帮助。如果他们已经使用存储在数据库中的相同 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>";  
}

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

【问题讨论】:

  • 不要使用IP,它不是每个人唯一的
  • 另外,不要使用 mysql_* 函数,因为它们已被官方弃用!请查看prepared statements
  • 如果您只需要一个,只需在表中的该字段上设置unique 约束即可。
  • 警告:这是非常不安全的,因为这些参数不是properly escaped。您应该绝不$_POST 数据直接放入查询中:它会创建一个巨大的SQL injection bugmysql_query 是一个过时的接口,不应使用,它已从 PHP 中删除。像PDO is not hard to learn 这样的现代替代品。像 PHP The Right Way 这样的指南解释了最佳实践。

标签: php mysql ip


【解决方案1】:

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

但您可能只需在要检查行数的 if 语句中添加 exit; 就可以让这段代码工作至此(大约 90-98% 的情况):

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,则都插入。如果表中有约束,则不会发生这种情况,因为数据库服务器将自己管理约束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2021-04-20
    • 1970-01-01
    相关资源
    最近更新 更多