在MySQL中newsletter_ip字段被设置成unsigned int(10)。 我也试着INET_ATON对数据进行格式化,但我总是结果看起来像这样 。
这里是我的处理代码的一部分:
//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'];
}
任何帮助将不胜感激,谢谢!
对于你的问题的根本原因,ip2long给出了一个符号整数作为PHP手册指出:
注意:
由于PHP的整数类型是有符号的,很多IP地址会导致在32位架构负整数,你需要使用“%U”的sprintf()或printf()函数的格式来获得无符号的IP地址的字符串表示。
而你将其存储为一个unsigned int,这就是为什么你看到ONY零的原因。 对于标准和清洁液处理IPv6的其他人已经给出了解决方案。
Since an IP address has several dots in it, or it may be a IPv6 address, I would suggest you set the newsletter_ip field as a VARCHAR
Right now your IP addresses may be showing up as 0 because they are not actually integers.
是否打印出存储给你正确的值之前的IP? 如果没有,检查是否存在代理从请求删除该信息,或者将其重命名。
不管怎么说,存在只要存储IP没有收获。 不应该有在性能上有显着的损失,如果你使用一个字符串此字段这是更简单的,更容易处理。 虽然你在它,留下足够的空间IPv6的;-)
如何让MySQL的翻译使用IP INET_ATON在服务器端?
//Retrieve data from user and create variables
$ip_orig = $_SERVER['REMOTE_ADDR'];
//Place into database
$sql = "INSERT INTO newsletter(newsletter_email, newsletter_ip, newsletter_date, newsletter_time) VALUES('".$email."', INET_ATON('".$ip."'), '".$date."', '".$time."')";
使用VARCHAR(15)分钟...... VARCHAR(45),以支持新的IPv6地址,同时这里是我的IP功能:
function ip()
{
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'];
}
return $ip;
}
您存储长达一个字符串,而不是作为一项长期的。
你也推迟作出在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
=号码到地址