MySQL中的newsletter_ip字段被设置为无符号整数(10)。我也尝试过用INET_ATON格式化数据,但是我得到的结果看起来总是像this。
下面是我的处理代码的一部分:
//Retrieve data from user and create variables
$ip_orig = $_SERVER['REMOTE_ADDR'];
$ip = ip2long($ip_orig);
//Place into database
$sql = "INSERT INTO newsletter(newsletter_email, newsletter_ip, newsletter_date, newsletter_time) VALUES('".$email."', '".$ip."', '".$date."', '".$time."')";在ip2long格式化之前,我也尝试过这个代码片段,但没有用:
if (!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];
}elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip=$_SERVER['REMOTE_ADDR'];
}任何帮助都将不胜感激,谢谢!
发布于 2012-06-26 23:35:31
对于问题的根本原因,ip2long提供了一个签名的PHP,正如手册中所述:
注意:
因为PHP的整数类型是有符号的,并且许多IP地址在32位体系结构上会导致负整数,所以您需要使用"%u“格式化程序sprintf()或printf()来获取无符号IP地址的字符串表示。
你把它存储为一个无符号的整数,这就是为什么你只看到0的原因。对于处理IPv6的标准和干净的解决方案,其他人已经给出了解决方案。
发布于 2012-06-26 23:31:55
因为IP地址中有几个点,或者它可能是一个IPv6地址,所以我建议您将newsletter_ip字段设置为VARCHAR值
现在,您的IP地址可能显示为0,因为它们实际上不是整数。
发布于 2012-06-26 23:32:02
您将long存储为字符串,而不是long。
您最好在MySQL本身中进行转换:
$sql = "INSERT INTO newsletter(newsletter_email, newsletter_ip, newsletter_date, newsletter_time) VALUES ('".$email."', INET_ATON('".$ip."'), '".$date."', '".$time."')";要检索IP地址,请执行以下操作:
SELECT INET_NTOA(newsletter_ip) as newsletter_ip FROM newsletter;INET_ATON =地址到号码
INET_NTOA =地址编号
https://stackoverflow.com/questions/11210713
复制相似问题