MySQL中的newsletter_ip字段设置为UNSIGNED INT(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'];
}
非常感谢任何帮助,谢谢!
答案 0 :(得分:1)
找出问题的根本原因,ip2long提供了一个签名 int,如PHP手册所示:
注意:
因为PHP的整数类型是有符号的,并且许多IP地址将在32位体系结构上产生负整数,所以需要使用sprintf()或printf()的“%u”格式化程序来获取字符串表示形式。未签名的IP地址。
然后将其存储为 unsigned int ,这就是为什么你看到ony零的原因。对于处理IPv6的标准和清洁解决方案,其他人已经提供了解决方案。
答案 1 :(得分:0)
由于IP地址中有多个点,或者它可能是IPv6地址,我建议您将newsletter_ip字段设置为VARCHAR
现在你的IP地址可能显示为0,因为它们实际上不是整数。
答案 2 :(得分:0)
您将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
=要解决的号码
答案 3 :(得分:0)
在存储之前打印出ip会给出正确的值吗?如果没有,请检查是否存在从请求中删除此信息或重命名的代理。
无论如何,存储ip的时间并没有增加。如果你在这个领域使用一个更简单直接且更容易处理的字符串,那么性能不会有明显的损失。当你在这里时,为IPv6留出足够的空间; - )
答案 4 :(得分:0)
让MySQL在服务器端使用INET_ATON翻译IP怎么样?
//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."')";
答案 5 :(得分:0)
使用varchar(15)作为min ... 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;
}