这是我试图用来存储客户端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的新手。
答案 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了。