尝试在数据库中存储IP地址。 SQL错误

时间:2012-05-08 18:30:51

标签: php mysql sql

这是我试图用来存储客户端IP地址的代码。我试图将ip地址存储到unsigned int,尝试执行此问题中的操作: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','嗯')'

在near附近的ip地址确实显示了正确的IP,我当然是出于安全原因将其切换到本地ip。 email@email.com和Hmmm来自填写的表格以激活它,所以不要太介意。

有谁知道我做错了什么?我是SQL的新手。

6 个答案:

答案 0 :(得分:5)

你这样做:

$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')";

答案 1 :(得分: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')";

答案 2 :(得分:1)

我想你想要:

$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();

答案 3 :(得分:0)

你在运行什么版本的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地址的原因

答案 4 :(得分:0)

使用INET_ATON代替"SELECT INET_ATON"(因为这会从DB返回记录)。

答案 5 :(得分:0)

你似乎有一个额外的)在你的sql语句中很难说它为什么在那里。好像你转换为unsigned int是错误的。您还可以在插入数字时删除$ ip_insert周围的单引号,并且该错误显示您正在插入字符串。

' 192.168.2.1')'当你试图插入一个不是字符串的数字时看起来不正确..你应该记录整个语句,看看究竟是在执行什么。谷歌记录SQL语句mysql并设置日志记录。运行它的查询检查日志然后尝试调试它。

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