【问题标题】:Trying to store IP Address in Database. SQL Errors试图将 IP 地址存储在数据库中。 SQL 错误
【发布时间】:2012-05-17 06:36:12
【问题描述】:

这是我试图用来存储客户端 IP 地址的代码。我试图通过尝试做一些在这个问题中看到的事情来将 IP 地址存储到一个无符号整数:Which MySQL datatype to use for an IP address?

这是我的代码:

$client_ip = $_SERVER['REMOTE_ADDR'];

$ip_insert = "SELECT INET_ATON('$client_ip')";

$sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name','$ip_insert','$email','$message')";

该语句中还有其他内容被存储,但忽略这些内容,它们有效,但不是 IP 地址。

错误:

错误:您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在第 1 行的 '192.168.2.1')​​','email@email.com','Hmmmm')' 附近

near 后面的 ip 地址实际上显示了正确的 IP,当然出于安全原因,我只是将其切换为本地 ip。 email@email.com 和 Hmmm 来自一个为激活它而填写的表格,所以不要介意。

有谁知道我做错了什么?我对 SQL 有点陌生。

【问题讨论】:

  • 您是否尝试过打印出代码生成的 SQL,并将其直接粘贴到数据库中以查看会发生什么?
  • 你有一个 SQL 注入漏洞。
  • @SLaks 它在哪里?我是一个初学者,所以我真的不知道在尝试使其安全时要寻找什么。

标签: php mysql sql


【解决方案1】:

你正在这样做:

$sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name',SELECT INET_ATON('$client_ip'),'$email','$message')";

因为你在设置:

$ip_insert = "SELECT INET_ATON('$client_ip')";

它必须是:

$ip_insert = "INET_ATON('$client_ip')";

这是这样做的方法:

$sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name',INET_ATON('$client_ip'),'$email','$message')";

【讨论】:

    【解决方案2】:
    $ip_insert = "SELECT INET_ATON('$client_ip')";
    

    只是一个字符串,你必须把这个字符串查询到数据库然后获取结果或者

    $sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name',INET_ATON('$client_ip'),'$email','$message')";
    

    【讨论】:

      【解决方案3】:

      我想你想要:

      $ip_insert = ip2long($client_ip);
      $sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name','$ip_insert','$email','$message')";
      

      但你最好使用:

      $sth = $dbh->prepare("INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES (?,?,?,?)");
      $sth->bindParam(1, $name, PDO::PARAM_STR);
      $sth->bindParam(2, $ip_insert, PDO::PARAM_INT);
      $sth->bindParam(3, $email, PDO::PARAM_STR);
      $sth->bindParam(4, $message, PDO::PARAM_STR);
      $sth->execute();
      

      【讨论】:

      • 你能解释一下为什么按照你展示的方式做会更好吗?
      • 您可以对参数的类型进行更多检查,如果您想在其中放入多条记录,则准备一次并绑定/执行多次会更加高效。
      【解决方案4】:

      你运行的是什么版本的mysql?尝试在您的 sql 命令行上运行 inet_aton('192.168.1.1') 命令,看看它是否有效。它应该输出如下内容:

      mysql> select inet_aton('192.168.1.1');
      +--------------------------+
      | inet_aton('192.168.1.1') |
      +--------------------------+
      |               3232235777 |
      +--------------------------+
      1 row in set (0.00 sec)
      

      您的 inet_aton() 函数似乎不起作用,这就是您在 sql 错误中看到 IP 地址的原因

      【讨论】:

        【解决方案5】:

        使用INET_ATON 而不是"SELECT INET_ATON"(因为这会从数据库返回一条记录)。

        【讨论】:

          【解决方案6】:

          您的 sql 语句中似乎有一个额外的 ) ,很难说它为什么在那里。似乎您转换为 unsigned int 出错了。您还可以在插入数字时将单引号放在 $ip_insert 周围,该错误表明您正在插入字符串。

          '192.168.2.1')​​' 看起来不正确,因为您尝试插入数字而不是字符串。您应该记录整个语句以查看正在执行的确切内容。谷歌日志记录 SQL 语句 mysql 并设置日志记录。为它运行查询检查日志,然后尝试调试它。

          这似乎是一个简单的语法错误。但是我可能是非常错误的,因为我已经 7 年多没有接触 PHP了。

          【讨论】:

            猜你喜欢
            • 2011-10-30
            • 1970-01-01
            • 2014-06-21
            • 1970-01-01
            • 2011-12-29
            • 2012-05-22
            • 2011-10-05
            • 2011-09-19
            • 2011-03-04
            相关资源
            最近更新 更多