プロが教えるわが家の防犯対策術!

CakePHP バージョン1.3.7です。

CakePHPでqueryを使ってSQL文を書くときなんですが
公式サイトに以下のように

App::import('Sanitize');
$sql = "SELECT * FROM users WHERE id = $id";
$sql = Sanitize::clean($sql);

サニタイズをしなさいとありますが、
上記の$idの部分がdate型で

$sql = "SELECT * FROM users WHERE date = '2011-05-16'";

みたいなときシングルクオートがエスケープされてクエリが通らないのはどうやって解決すればいいんでしょうか?

A 回答 (1件)

$sql = Sanitize::clean($sql,array(


'encode'=>false
));
第二引数でencodeをfalseにしてしまいましょう。


ちなみに俺はこう書いてます。
$sql = "SELECT * FROM users WHERE date = :date";
$params = array(
    'date'=>'2011-05-16'
);
$result = $this->Model->query($sql,$params);
    • good
    • 0
この回答へのお礼

ご返事ありがとうございます!!
できました!
一つ目の 'encode'=>false だとクエリが ¥'2011-05-16¥'
となってしまい。通らなかったのですが、二つ目の方法で、記述するとできました!

記述があっているかどうかわからないですが、

$sql = "SELECT * FROM users WHERE date = :date";
$sql = Sanitize::clean($sql);
$params = array(
    'date'=>'2011-05-16'
);
$result = $this->Model->query($sql,$params);

という順番で記述しました。
URLに日付のパラメータを振ってたのですが、そこにシングルクオートを入れても、上記の方法でちゃんとエスケープされます。

勉強不足で恥ずかしいのですが、この記法知らなかったです。。。
プレースホルダみたいな感じなのでしょうか?
今から調べてみたいと思います。

ほんとうにありがとうございました!!

お礼日時:2011/05/17 12:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!