ホームページ  >  記事  >  バックエンド開発  >  PHPのIPをintに変換する方法

PHPのIPをintに変換する方法

藏色散人
藏色散人オリジナル
2021-09-02 10:26:351831ブラウズ

php ip to int メソッド: 1. PHP サンプル ファイルを作成します; 2. IP アドレスを定義します; 3. PHP の ip2long 関数を使用して IP アドレスを整数に変換します。

PHPのIPをintに変換する方法

この記事の動作環境: Windows7 システム、PHP7.1 バージョン、Dell G3 コンピューター

php ip の変換方法intに?

PHP における IP アドレスと整数間の変換の詳細な説明

この記事では、PHP 関数 ip2long および long2ip の使用法とそのバグについて紹介します。はじめに、最後に私が書いた 2 つのアルゴリズムを紹介します。必要な友人は、

IP を整数ストレージに変換することがデータベース最適化の主要なトレンドです。多くの人は、格納するときにまだ文字列型ストレージを使用しています。 IP. 文字列インデックスは、特にテーブル内のデータ量が多い場合や、特定の IP セグメントのデータをクエリする場合に、整数インデックスよりも多くのリソースを消費します。今日言及した IP は IP4 を指しますが、IP6 はそうではありません。この記事の範囲内です。

システム関数 ip2long および long2ip
PHP には、IP アドレスを整数に変換できる組み込み関数 ip2long があります。

コードは次のとおりです:

$ip = '210.110.11.49';
echo ip2long($ip);

出力:

-764540111

得られる結果は符号付き整数型であるため、出力整数型には負の符号が付きます。符号付き整数型の値は 2147483647 です。結果を符号なし型に変換するには、次のように記述できます。

3530427185

long2ip を使用して整数型を IP アドレスに変換し直します

$ip = '210.110.11.49';$ip_int = ip2long($ip);echo $ip."<br />";echo $ip_int."<br />";echo long2ip($ip_int);

出力:

210.110.011.49
-764540623
210.110.9.49

変換結果が一致しません。IP の最初の番号の前に先頭の 0 を追加して、

$ip = '021.110.11.49';$ip_int = ip2long($ip);echo $ip."<br />";echo $ip_int."<br />";echo long2ip($ip_int);

の出力を確認します。

021.110.11.49
292424497
17.110.11.49

変換結果はすべて間違っています。上記の例はすべて先頭に 0 を追加することによって発生し、変換結果にエラーが発生し、反転結果は変換された元の IP と一致しません。

変換原理

現在 2 つのアルゴリズムがあります:
まず、最初のセクションは 256 の 3 乗で乗算され、2 番目のセクションは次のようになります。 256 の 2 乗を乗算し、3 番目のセグメントに 256 を乗算し、最終的な合計は

$ip = '0210.110.11.49'; 
function ipToInt($ip){    $iparr = explode('.',$ip);    $num = 0;    for($i=0;$i<count($iparr);$i++){        $num += intval($iparr[$i]) * pow(256,count($iparr)-($i+1));
    }    return $num;
} 
echo  $ip.'<br />';$ip_int = ipToInt($ip);echo $ip_int.'<br />';echo long2ip($ip_int);

出力:

0210.110.11.49
3530427185
210.110.11.49

2 番目、ビットごとの演算子を使用して

$ip = '0210.110.11.49'; 
function ipToInt($ip){    $iparr = explode('.',$ip);    return (intval($iparr[0]<<24))|(intval($iparr[1])<<16)|(intval($iparr[2])<<8)| (intval($iparr[3]));
} 
echo  $ip.'<br />';$ip_int = ipToInt($ip);echo $ip_int.'<br />';echo long2ip($ip_int);

出力:

0210.110.11.49
-764540111
210.110.11.49

IP が合法かどうかを確認します

まず、自分でテストを実行します

function check_ip($ip){    $iparr = explode('.',$ip);    foreach($iparr as $v){ if($v>255) return false; }    return true;
} 
echo '210.285.11.49,';var_dump(check_ip('210.285.11.49'));echo '<br />';echo '210.205.11.49,';var_dump(check_ip('210.205.11.49'));
[code]

输出:
[code]210.285.11.49,bool(false)210.205.11.49,bool(true)

いいえ。 2. ip2long を使用して

function check_ip($ip){    if(ip2long($ip)) return true;    return false;
} 
echo '210.285.11.49,';var_dump(check_ip('210.285.11.49'));echo '<br />';echo '210.205.11.49,';var_dump(check_ip('210.205.11.49'));

出力:

210.285.11.49,bool(false)210.205.11.49,bool(true)

追記

多くの人が使用します。 ip2long を使用して IP 書き込みライブラリを変換して int 型フィールドを格納しますが、システム プラットフォームが異なると、ip2long 関数で取得される値が異なるため、long2ip で取得した IP が読み取り時に元の IP と一致しない可能性があります。データベースからデータを取得して IP を反転します。
MySQL の場合は、mysql システム関数 INET_ATON および INET_NTOA を使用するか、bigint 型を使用するか、関数を自分で作成することで解決できます。

推奨学習: 「PHP ビデオ チュートリアル

以上がPHPのIPをintに変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。