2009/10/23

CakePHPでOR検索(ANDは難しかった)

結局、暇を見つけては毎日触っておる、ET withwithの開発ですが、今日は「CakePHPに簡単な検索機能を実装する」でやった検索を複数語に対応させる修正をしました。下記のページが大変参考になりました。

フォームからand,or検索を実装したSQLを生成する – PHPに惚れました。

ただ検索語が複数語になるだけではなくて、ET withwithでは3つのフィールドを検索対象にしなければならなかったので、上記の方法がピッタリでした。ただ、表題のとおり、AND検索が、上のロジックのままではできず(自分が意図しているAND検索とは違う)、とりあえず、OR検索のみをデフォルトで対応することにしました。

contents_controller.php

function view_search() {
function addsl($comment) {
$comment = mysql_real_escape_string($comment);
$comment = preg_replace("/%/","%",$comment);
$comment = preg_replace("/_/","_",$comment);
$comment = htmlspecialchars($comment, ENT_QUOTES);
return $comment;
}
$key = $this->data[‘key’];
$like = ”;
if (!empty($key)) {
$key = trim($key);
if(preg_match("/[ | ]+/", $key,$num)){
$key = mb_convert_kana($key, "s");
$keywords=preg_replace(‘/s+/’, ‘ ‘, $key);
$keywords = explode(" ",$keywords);
foreach($keywords as $cli){
if($cli != ""){
$cliwd[] = "Client.client LIKE ‘%".addsl($cli)."%’ ";
}
}
foreach($keywords as $tit){
if($tit != ""){
$titwd[] = "Content.title LIKE ‘%".addsl($tit)."%’ ";
}
}
foreach($keywords as $con){
if($con != ""){
$conwd[] = "Content.content LIKE ‘%".addsl($con)."%’ ";
}
}
} else {
$keywords = $key;
}
}
if (!empty($titwd) || !empty($conwd) || !empty($conwd)) {
$like .= implode(" or ",$cliwd)." or ";
$like .= implode(" or ",$titwd)." or ";
$like .= implode(" or ",$conwd);
$where = "(".$like.")";
} else if (empty($key)) {
$where=$this->Session->read(‘where’);
} else {
$where = array("or" => array("Client.client LIKE" => "%".$key."%", "Content.title LIKE" => "%".$key."%", "Content.content LIKE" => "%".$key."%"));
}
$this->Session->write(‘where’,$where);
$this->Content->order = "date DESC";
if (!empty($where)) {
$this->set(‘contents’, $this->paginate(‘Content’,$where));
} elseif (empty($where)) {
$this->set(‘contents’, $this->paginate());
}
$this->render(‘index’);
}

最後に躓いたのが、mb_convert_kanaが機能しなかったこと。散々悩んで、ネットでは改行コードを指定してやる解決法なども乗っていたのですが、よくよく調べると、単純にcontents_controller.php自体を保存した時の改行コードがUTF-8になっていなかった!で全角スペースが全角スペースとして認識されず、全角スペースを半角スペースに変換する処理が、機能していなかったわけです。

実は後、ユーザの権限管理とユーザ認証などもやっぱりやりたいかなあなどと思っておるのですよね。。。触ってるとどんどんやりたいこと出て来ますね。。。

ひとり仕事: フリーランスという働き方
(2012-10-5)
売り上げランキング: 14,705
100円

加藤 康祐 / 企画・設計

1980年1月12日生まれ。フリーランス歴15年。プランナー、デザイナー。加藤康祐企画設計代表。学生時代にデザイン会社でWebデザインを経験。2005年よりフリーランスとしてキャリアスタート。これまでに個人から上場企業まで、100以上のクライアントとのプロジェクトを経験。主な仕事としてベンチャー企業でのサービスのUXデザイン、独法との防災メディアの編集・運営、社会的養護の子どもたちの自立を支援するNPOのサポート等。趣味はラグビーと料理。Keep the head up, Bind tight & Stay low.

加藤康祐企画設計

是非、フォローしてください!
Twitter / Instagram