首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PHP ip2long函数转换时,IP地址存储为0

使用PHP ip2long函数转换时,IP地址存储为0
EN

Stack Overflow用户
提问于 2012-06-26 23:27:38
回答 6查看 1.6K关注 0票数 1

MySQL中的newsletter_ip字段被设置为无符号整数(10)。我也尝试过用INET_ATON格式化数据,但是我得到的结果看起来总是像this

下面是我的处理代码的一部分:

代码语言:javascript
复制
//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格式化之前,我也尝试过这个代码片段,但没有用:

代码语言:javascript
复制
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'];
}

任何帮助都将不胜感激,谢谢!

EN

回答 6

Stack Overflow用户

发布于 2012-06-26 23:35:31

对于问题的根本原因,ip2long提供了一个签名的PHP,正如手册中所述:

注意:

因为PHP的整数类型是有符号的,并且许多IP地址在32位体系结构上会导致负整数,所以您需要使用"%u“格式化程序sprintf()或printf()来获取无符号IP地址的字符串表示。

你把它存储为一个无符号的整数,这就是为什么你只看到0的原因。对于处理IPv6的标准和干净的解决方案,其他人已经给出了解决方案。

票数 1
EN

Stack Overflow用户

发布于 2012-06-26 23:31:55

因为IP地址中有几个点,或者它可能是一个IPv6地址,所以我建议您将newsletter_ip字段设置为VARCHAR值

现在,您的IP地址可能显示为0,因为它们实际上不是整数。

票数 0
EN

Stack Overflow用户

发布于 2012-06-26 23:32:02

您将long存储为字符串,而不是long。

您最好在MySQL本身中进行转换:

代码语言:javascript
复制
$sql = "INSERT INTO newsletter(newsletter_email, newsletter_ip, newsletter_date, newsletter_time) VALUES ('".$email."', INET_ATON('".$ip."'), '".$date."', '".$time."')";

要检索IP地址,请执行以下操作:

代码语言:javascript
复制
SELECT INET_NTOA(newsletter_ip) as newsletter_ip FROM newsletter;

INET_ATON =地址到号码

INET_NTOA =地址编号

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11210713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档