1

这是我试图用来存储客户端 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','Hmmmm')' 附近使用正确的语法

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

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

4

6 回答 6

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')";
于 2012-05-08T18:36:47.593 回答
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')";
于 2012-05-08T18:37:35.043 回答
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();
于 2012-05-08T18:40:59.263 回答
0

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

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 地址的原因

于 2012-05-08T18:36:28.053 回答
0

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

于 2012-05-08T18:39:26.287 回答
0

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

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

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

于 2012-05-08T18:45:39.650 回答