・・・・・・・・・・・・・・・・・・・・・・・・・・・・削除します
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
SQLで判定する方法(MySQL)もありますので、回答しておきます。
sql
1SELECT 2INET_ATON('192.168.10.0') BETWEEN INET_ATON('192.168.0.0') AND INET_ATON('192.168.255.0')
投稿2016/07/12 13:34
退会済みユーザー
総合スコア0
0
ベストアンサー
CakePHP2ですよね。
3通りの方法でコードを載せるので、コントローラーにそのままコピペして試してみてください。
indexアクションにしているので、重複する場合は適宜変更してください。
それと、テーブル名はipsにしています。
方法その1
PHP
1// IpsController 2 3// テスト用に固定のIPを返す 4public function getAccessIp() { 5 return '203.0.113.1'; 6} 7 8// メインの処理 9public function index() { 10 // データの取得 11 $ips = $this->Ip->find('first',[ 12 'conditions' => [ 13 'and' => [ 14 'INET_ATON(start) <=' => sprintf("%u", ip2long($this->getAccessIp())), 15 'INET_ATON(last) >=' => sprintf("%u", ip2long($this->getAccessIp())) 16 ] 17 ] 18 ]); 19 20 // $ipsが空なら該当なし、そうでなければ該当あり 21 if (empty($ips)) { 22 debug("範囲内のIPアドレスに該当しませんでした。"); 23 } else { 24 debug("範囲内のIPアドレスに該当しました。"); 25 } 26}
方法その2
PHP
1// IpsController 2 3// テスト用に固定のIPを返す 4public function getAccessIp() { 5 return '203.0.113.1'; 6} 7 8// メインの処理 9public function index() { 10 // SQLの用意 11 $sql = "SELECT start, last FROM ips AS Ip WHERE INET_ATON(?) between INET_ATON(start) and INET_ATON(last)"; 12 13 // SQLの実行と結果取得 14 $ips = $this->Ip->query($sql, [$this->getAccessIp()]); 15 16 // $ipsが空なら該当なし、そうでなければ該当あり 17 if (empty($ips)) { 18 debug("範囲内のIPアドレスに該当しませんでした。"); 19 } else { 20 debug("範囲内のIPアドレスに該当しました。"); 21 } 22}
方法その3
PHP
1// IpsController 2 3// テスト用に固定のIPを返す 4public function getAccessIp() { 5 return '203.0.113.1'; 6} 7 8// メインの処理 9public function index() { 10 // ipsテーブルから全データ取得 11 $ips = $this->Ip->find('all'); 12 13 // IPがipsテーブルのIPの範囲内にあるかのチェック 14 $check = 0; 15 // ipsテーブルのデータから1つずつ取り出してIPが範囲内かチェック 16 foreach ($ips as $ip) { 17 if( (ip2long($ip['Ip']['start']) <= ip2long($this->getAccessIp()) ) 18 && ( ip2long($this->getAccessIp()) <= ip2long($ip['Ip']['last']) ) ){ 19 $check = 1; 20 } 21 } 22 23 // IPが範囲内の場合 24 if ($check) { 25 debug("範囲内のIPアドレスに該当しました。"); 26 } 27 // IPが範囲外の場合 28 else { 29 debug("範囲内のIPアドレスに該当しませんでした。"); 30 } 31}
投稿2016/07/12 15:17
編集2016/07/13 01:29総合スコア1409
0
ip2long を紹介された後では見劣りしますが…
IPアドレスを12桁の数字列に変換して比較するのも
分かりやすくていいかもしれません。
PHP
1function ip2str($ip) { 2 $str = ''; 3 foreach (explode('.', $ip) as $val) { 4 $str .= sprintf('%03d', intval($val)); 5 } 6 return $str; 7}
--- 追加 ---
よくわかりませんが、こんな感じでしょか。
PHP
1$target = ip2str(getAccessIp()); 2$ip_start = ip2str($data['テーブル名']['start']); 3$ip_last = ip2str($data['テーブル名']['last']); 4if ($ip_start <= $target && $target <= $ip_last) { 5 echo "範囲内の処理"; 6} else { 7 echo "範囲外の処理"; 8}
っていうか、CHERRYさんの回答に実際のを当てはめればいいと思いますが…
投稿2016/07/12 12:04
編集2016/07/12 13:29総合スコア7460
0
ip2long で、数値に変換して、比較かな。
http://php.net/manual/ja/function.ip2long.php
たとえば、こんな感じで
php
1if( ( ip2long(開始IPアドレス) <= ip2long(getAccessIp()) ) && ( ip2long(getAccessIp()) <= ip2long(終了IPアドレス) ) ){ 2 echo "範囲内の処理"; 3} else { 4 echo "範囲外の処理"; 5}
投稿2016/07/12 11:49
総合スコア25175
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/12 13:04
2016/07/12 13:59
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/07/12 23:39
2016/07/13 00:52