Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将IP存储为无符号整数?_Php_Sql_Optimization_Ip - Fatal编程技术网

Php 将IP存储为无符号整数?

Php 将IP存储为无符号整数?,php,sql,optimization,ip,Php,Sql,Optimization,Ip,我读到在数据库中存储IP地址的最佳方法是创建一个无符号Int(10)字段。如何使用PHP转换IP地址?我试过使用 $this->ip = long2ip($_SERVER['REMOTE_ADDR']); 但这似乎不起作用。我找到了使用 $this->ip = sprintf("%u", ip2long($result['ip'])); 最初如何转换IP地址?我应该使用PHP来实现这一点吗?或者集成到MySQL查询中会更好吗?将整数转换为IP格式,并执行相反的操作 因此,使用ip

我读到在数据库中存储IP地址的最佳方法是创建一个无符号Int(10)字段。如何使用PHP转换IP地址?我试过使用

$this->ip = long2ip($_SERVER['REMOTE_ADDR']);
但这似乎不起作用。我找到了使用

$this->ip = sprintf("%u", ip2long($result['ip']));
最初如何转换IP地址?我应该使用PHP来实现这一点吗?或者集成到MySQL查询中会更好吗?

将整数转换为IP格式,并执行相反的操作

因此,使用
ip2long
$\u SERVER['REMOTE\u ADDR']
转换为一个整数以存储在数据库中,并在从数据库读取整数后使用
long2ip

$long = ip2long($_SERVER['REMOTE_ADDR']);
$ip   = long2ip($long);
我用过这个

function ip2int($ip) {
    $a = explode(".",$ip);
    return $a[0] * 256 * 256 * 256 + $a[1] * 256 * 256 + $a[2] * 256 + $a[3];
}

您需要使用
ip2long
转换IP的虚线字符串版本,然后使用
long2ip
返回。看起来你现在把它倒过来了

$integer_ip = ip2long($_SERVER["REMOTE_ADDR"]); // => 1113982819
$dotted_ip  = long2ip($integer_ip);             // => "66.102.7.99"

如果您使用的是MySQL,您可以使用
INET\u ATON
(ip2long等效)和
INET\u NTOA
(long2ip)函数,而不是使用PHP进行处理:

最好将此逻辑放在SQL查询中:

INSERT INTO `table`
    (`ip`)
VALUES
    INET_ATON('192.168.0.1')
然后在选择数据时将地址转换回:

SELECT INET_NTOA(`ip`)
    FROM `table`

好的,根据这个问题,最好的数据类型不是一个整数,不确定最好的数据类型是什么,但在Postgres的情况下,我肯定会说最好的数据类型是
Inet
,而不是把它植入其他任何东西中。你的解释是正确的,但你在snipped中的用法是不正确的。+1,特别是因为它还应该支持IPv6——尽管这可能永远不会成为现实:/SQL优于PHP的优势是什么?如果可能的话,最好是在查询中加入与数据库存储相关的逻辑。例如,如果您将MySQL服务器升级到新版本,并且数据存储方式会发生一些变化,这些变化也会反映在数据库函数中。如果您将此逻辑委托给其他工具,则可能会遇到问题。但首先,它是任务的逻辑委托,因此您的代码更容易理解。@Markus IPv6在今天已成为现实。很少见,我们不能指望它,但很普通,我们也不能指望它不被使用。这个比内置的imo要好,因为它不会碰到标志问题