SSブログ
Lancers.jp

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');


ってな具合でした。

こんな感じで、ぼちぼち書いてきます。はぁ〜、先は長いな〜〜。


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。