質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

4回答

3023閲覧

cakephpにて接続して来たIPアドレスが、データベースに登録したIPアドレスの範囲内に存在するかのやり方を教えてください。

amaguri

総合スコア227

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

1クリップ

投稿2016/07/12 10:38

編集2018/06/18 09:15

・・・・・・・・・・・・・・・・・・・・・・・・・・・・削除します

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/07/12 23:39

こんなの用意してあるんですね!当たり前といえば当たり前ですが。。。知らなかったです。
amaguri

2016/07/13 00:52

お返事ありがとうございます。 SQLで判定する方法もあるんですね!
guest

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
coba-coba

総合スコア1409

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaguri

2016/07/13 00:54

お返事ありがとうございます! 個人的に方法3がかなりわかりやすかったです! 本日いただいた3つの方法で試してみたいと思います。
coba-coba

2016/07/13 01:18

方法3はとっつきやすいと思います。でも一番無駄なことをしているのも方法3ですけどね。
guest

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
takasima20

総合スコア7460

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaguri

2016/07/12 13:16

お返事ありがとうございます。 これはIPアドレスの.をとって比較するということでよろしいでしょうか? この場合getAccessIpはどこに入るのか、、 ['テーブル名']['start'] ['テーブル名']['last'] はどこになるのか教えていただくことは可能でしょうか?
guest

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

CHERRY

総合スコア25175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaguri

2016/07/12 13:04

お返事ありがとうございます。 わかりやすく記載していただいてありがとうございます、 ただまだ理解できていないのが 開始IPアドレス 終了IPアドレス がテーブルを見るので ['テーブル名']['start'] ['テーブル名']['last'] になると思うのですが、、 テーブルに複数のデータが入ることになるのですが テーブル内にいずれかの ['テーブル名']['start'] ['テーブル名']['last'] のセットから参照するということはこれでできますでしょうか?
KiyoshiMotoki

2016/07/12 13:59

CHERRY様 ip2long という関数、初めて知りました。 勉強させていただき、ありがとうございます。 しかし、実行環境によっては正常に動作しない可能性がありそうです。 なぜなら、該当関数のマニュアルに以下の記載があるためです。 http://php.net/manual/ja/function.ip2long.php > PHP の整数型は符号付き形式であり、32 ビットアーキテクチャ上では 多くの IP アドレスが負の整数値になります。 実際、ip2long('192.168.10.0') は 手元のPC(Mac OSX 64bit)で 3232238080 となり、 32ビットマシン上でPHPが表現できる int の最大値 (2147483647) を超えておりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問