php ip to int メソッド: 1. PHP サンプル ファイルを作成します; 2. IP アドレスを定義します; 3. PHP の ip2long 関数を使用して IP アドレスを整数に変換します。
この記事の動作環境: 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 サイトの他の関連記事を参照してください。