CakePHP その6 - findBy* について - [CakePHP]
findBy*は基本的に、一つのフィールドしか指定できないから不便だなぁと思っていたところ、次のような記事を見つけた
ZoroMemory「cakePHPのfindBy*で複数の条件が設定可能」
http://ido.nu/kuma/2007/05/17/cakephp-findby-can-takes-multiple-conditions/
cakePHPの 6.2.2. データを取り出す を見る限りでは findBy*では * で指定したカラムに関する条件しか設定できませんが、ソースを見ると cake/libs/model/datasources/dbo_source.php に _or_ と _and_ でさらに条件を追加できることがわかります。
これは便利!さあ、早速やってみた。
$this->User->findByIdAndEmail($id, $email);
が、結果はエラーがかえってくる。
SQL文を確認すると
Query: SELECT `User`.`****` ~(略)~ WHERE `User`.`idandemail` = 1 LIMIT 1
となっているでは!つまり、Andを全く認識してくれてないってことか。
うう〜、これは1.2系しか使えないテクニックなのか?
(ちなみに使用しているのは 1.1.15.5144 )
でも、dbo_source.phpのソース見ると、ZoroMemory氏の書いてある通りなんだけどー。
PHP4の所為なのかー。
と、ほぼ諦めていたところ、別件の問題の解決を探していたところ、下記の記事を発見。
CakePHP guide「Model::findBy{フィールド名}() の落とし穴」
http://www.blueocean.bz/blog/cakephp/archives/category/cakephp_tips/
うっひょ〜!これぞ以前に俺が探し求めていたものじゃん?
つまり、PHP4では findBy* の複数指定をこの原則に当てはめればいいんじゃん。
$this->User->findById_And_Email($id, $email);
ナイス!これで大正解。すげーぜ。
これなら、インジェクションも怖くないね!
CakePHP その5 - Helper - [CakePHP]
CakeのViewでは、各種ヘルパーが使える。
HTMLやJavascript,TEXTなど。
でも、これが結構微妙。
たとえば、
<input type="submit" name="submit" value="保存" />
と
<?php echo $html->submit('保存',array('name'=>'submit')) ?>
と書くののどっちが楽か?ってほとんど変わんないよ。
勿論、部分的には便利だとは思うよ。
フォームタグのヘルパー使うと、セキュリティチェック用のタグも書き出してくれるし。
あと、TimerヘルパーってViewで使うか?
どっちかというと、時間の確認とかで条件分岐をさせるのは、Controllerだろう?
Controllerで使いたいのに、使えない。これは不便。
追記:うっかり、まんまのタグを書いて、確認してなかったら、表示が(笑
コードはきちんと実体表記に直さなきゃねー。
そういう時は、「エンコードマニアックス」がとても便利です。
http://encodemaniax.com/index/encode/
CakePHP その4 - Securityコンポーネント - [CakePHP]
今日の進歩は、データ送信寺のセキュリティ関連。
まずは、フォームタグを直書きではなく、Htmlヘルパーを使うと、"data[_Token][key]"っつーhiddenタグができる。これは毎回値が変わって、その値で不正かどうか調べるらしい。
この"data[_Token][key]"を調べるタイミングは、メソッドが呼ばれる前。つまり、beforeFilter()に書くのが一番良いのかな。
function beforeFilter() { $this->Security->requireAuth('モデル名'); }
これを、モデル.phpに書いても良いんだけど、毎回必要そうなので、app_controller.phpに書く事にした。モデル名はいくつでも追加できるしね。
で、これで不正アクセスをチェックできるようにしたところ、不正アクセスした場合は、画面が真っ白になってしまって、何が起こったか訳分からんので、画面表示を出すように設定。
まず、/controllers/components/security.php の51行目の $blackHoleCallback に表示用の関数を指定する。関数名は、分かりやすいように blackhole() にした。
var $blackHoleCallback = 'blackhole';
で、肝心のblackhole()をどこに書くというと、そのまま app_controller.php に記述。
function blackhole(){ $model = $this->modelClass; $ip = $this->RequestHandler->getClientIP(); $this->log("{$model} : Blackhole : {$ip}"); //▼表示用 $res = "不正なリクエストです"; $url = strtolower( $model ); $this->flash($res,"/{$url}/",'5'); }
これで、どのモデルで起こったか、IP付きでログに書き込むようにできた。
まだまだ、フレームワーク(というか、オブジェクト指向)って物に不慣れなので、ついつい遠回りをしてしまってる気がするよ。
CakePHP その3 - セッション - [CakePHP]
ページをまたぐには、セッションの使用が不可欠だけど、CakePHPではSessionモデルがあるので、使ってみた。
$this->Session->write('foo','baa');
でん、この'foo'を取り出そうと、また悩んだ。
$this->Session['foo']で取り出せると思って、探してみたけど無い!
あれ〜〜?と思ったが、$thisのなかのSessionには記憶されていない模様…
仕方ないから、$_SESSION['foo']で値を取り出す。
でも、これってフレームワーク使ってる意味ねーよなー。
って書いてたところで、
$this->Session->read('foo');
で取り出すべきなんじゃ?と気づき実行。問題なし。
馬鹿だな〜オレ。
CakePHP その2 - 他のモデルを使う時 - [CakePHP]
controllerのなかで、他のモデルを使う時は
var $uses = array('現在のモデル','他のモデル');
のようにする。
これが見つからないで、データを別のテーブルに移すだけのことを、四苦八苦してた。
http://cakephp.jp/ で聞くと、あっさりした答えが返って来たので、基本的な設定が間違ってるんだろうとマニュアルを洗い直して、ようやく見つかった。
ふぅ。
CakePHP その1 - 日本語の設定 - [CakePHP]
今やっている仕事で、簡易な会員制サイトをつくっているのだけど、自分でつくってるとどうしても煩雑になってしまう。recuireやincludeの乱発、微妙に違う似たような事をアチコチに書いて、修正の方が大変だったり…
ちょっと時間もあるし、これを機にフレームワークってヤツに手を出してみた。
自分がダウンロードしたのは、CakePHP1.1.15.5144
1.2系はまだ安定板とは言えないので、今回はパス。
早速やってみると、表示だけならあっと言う間にできた!
ちょっと嬉しい。
が、日本語が化ける…。
たぶん、いつもやってるおまじない 'SET NAMES utf8' をしていない所為だろう。
どこかに設定があるはず、とおもったらapp/config/database.phpに書き込めば良いらしい。
var $default = array( 'driver' => 'mysql', 'connect' => 'mysql_connect', 'host' => 'localhost', 'login' => 'hogehoge', 'password' => 'passpass', 'database' => 'dbname', 'prefix' => '', 'encoding' => 'utf8');
ってな具合でした。
こんな感じで、ぼちぼち書いてきます。はぁ〜、先は長いな〜〜。