cakephpでキーワード検索の方法がわからない

このQ&Aのポイント
  • cakephpでキーワード検索のための方法がわかりません。スペースで単語を区切って検索したいのですが、うまくいきません。
  • 検索キーワードでcakephpのページングをする方法がわかりません。スペースで単語を区切る方法を教えてください。
  • cakephpでキーワードをスペースで区切って検索したいのですが、うまくいきません。どなたか解決策を教えてください。
回答を見る
  • ベストアンサー

cakephpでキーワード検索

すみません。いろいろやってみたんですが 断念して、ここに投稿しました。 検索キーワードでページングするための方法がわかりません。 例)東京 寿司屋 このようにスペースで単語ごとに区切ります。 一文字だけは成功しましたが、スペースを空けて単語を読みとる 方法が浮かびません。 $keyword = mb_convert_kana($this->data["Hoge"]["keyword"],'rnask'); $keywords = preg_split("/[\s]+/",$keyword); $set = array(); $set = array( 'OR' => array( 'Hoge.name LIKE' => '%'.$keywords[0].'%', 'Hoge.prefecture LIKE' => '%'.$keywords[0].'%', 'Hoge.job LIKE' => '%'.$keywords[0].'%', ), //'OR' => array( //'Hoge.name LIKE' => '%'.$keywords[1].'%', //'Hoge.prefecture LIKE' => '%'.$keywords[1].'%', //'Hoge.job LIKE' => '%'.$keywords[1].'%', //), // コメントをはずしてみると、案の定エラーこきます。 'Hoge.cp_flag' => 1, ); $this->set("hogehoes",$this->paginate('Hoge',$set,null)); お願いします。どなたかお助け下さい。

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

http://spiral-stair.blogspot.com/2007/09/cakephpfindor.html こちらのブログを参考に(というか検索で一番最初に出てきました) $set = array( 'OR' => array( array( 'Hoge.name LIKE' => '%'.$keywords[0].'%', 'Hoge.prefecture LIKE' => '%'.$keywords[0].'%', 'Hoge.job LIKE' => '%'.$keywords[0].'%',), array( 'Hoge.name LIKE' => '%'.$keywords[1].'%', 'Hoge.prefecture LIKE' => '%'.$keywords[1].'%', 'Hoge.job LIKE' => '%'.$keywords[1].'%', ), ), ); というようにネストしたらいかがでしょうか。

future-boy
質問者

お礼

ありがとうございます。 はずかしながら、DBの方で 値にNULL値が入ってなかったので 検索結果がおかしくなっていました。 結果、頂いたもので直りました。

関連するQ&A

  • キーワードの記述について

    キーワードの記述についての質問です。 各キーワードを「カンマ」のみで区切る書き方と「カンマと半角スペース」を使った書き方を目にするのですが、どちらのやり方で記述すればよいのでしょうか?この二つの書き方は検索に影響したり(差が出たり)するのでしょうか? カンマのみ: <meta name=“keywords” content=“キーワード1,キーワード2,キーワード3" /> カンマと半角スペース: <meta name=“keywords” content=“キーワード1, キーワード2, キーワード3" /> 初心者的な質問ですがどなたか宜しくお願いいたします。

  • SEO対策でキーワードの書き方に関する質問です。

    SEO対策でキーワードの書き方に関する質問です。 HTMLのメタタグ、keywordsの書き方なのですが、 <meta name="keywords" content=",カップル 旅行," /> の様に、半角カンマで区切った中に2単語を全角スペースで区切って入れる この書き方は正しいのでしょうか? また、 <meta name="keywords" content=",カップル旅行,カップル 旅行," /> と、同内容を一方はそのまま、片方は全角スペースで区切って連記して書く、この方法は 正しいのでしょうか? わかりづらいかも知れませんが、宜しくお願いします。

    • ベストアンサー
    • HTML
  • cakePHPのエラー

    Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'validateSearch' at line 1 SQL Query: validateSearch Notice: If you want to customize this error message, create app/View/Errors/pdo_error.ctp というエラーが出て困っています。 validateSearchの付近を確認してもよくわかりません。 searchpluginを使っているのですが、上手くいきません。 コントローラーは、 <?php App::uses('AppController', 'Controller'); class Mac554FoodDatasController extends AppController { public $name='Mac554FoodDatas'; public $components =array('Search.Prg'); public $presetVars=array(); public function beforeFilter() { //検索対象のフィールド設定代入 $this->presetVars = $this->Mac554FoodData->presetVars; // ページャ設定 $pager_numbers = array( 'before' => ' - ', 'after'=>' - ', 'modulus'=> 10, 'separator'=> ' ', 'class'=>'pagenumbers' ); $this->set('pager_numbers', $pager_numbers); } public function find() { $datas=$this->Mac554FoodData->find('all'); $this->set('datas',$datas); //検索条件設定 $this->Prg->commonProcess(); //検索条件取得 $tabe=$this->passedArgs; $conditions = $this->Mac554FoodData->parseCriteria['$tabe']; //ページャ関係 $this->paginate =array( 'conditions' => $conditions, 'limit' =>10 ); $this->set('Mac554FoodDatas',$this->paginate('Mac554FoodData')); // レイアウト関係 $this->layout = "plain"; $this->set("header_for_layout", "Sample Application"); $this->set("footer_for_layout", "copyright by SYODA-Tuyano. 2011."); // post時の処理 //$this->set('Mac554FoodDatas',$this->Mac554FoodData->find('all')); } public function index() { $this->layout = "plain"; $this->set("header_for_layout", "Sample Application"); $this->set("footer_for_layout", "copyright by SYODA-Tuyano. 2011."); //レイアウト } } ?> で、検索フォームはエレメントで <?php echo $this->Form->create('Mac554FoodData', array('url' => '/Mac554FoodDatas/find'))?> <fieldset> <legend>Search or Die!</legend> <dl> <dt><label>ユーザname</label></dt> <dd><?php echo $this->Form->input('name', array( 'type' => 'text', 'div' => false, 'label' => false))?></dd> <dt><label>time</label></dt> <dd><?php echo $this->Form->input('time', array( 'type' => 'text', 'div' => false, 'label' => false ))?></dd> <dt><label>naiyoudao</label></dt> <dd><?php echo $this->Form->input('naiyoudao', array( 'type' => 'text', 'div' => false, 'label' => false ))?></dd> </dl> <?php echo $this->Form->submit('検索',array('div'=>false,'escape'=>false))?> </fieldset> <?php echo $this->Form->end()?> のように作りました。 モデルは、 <?php class Mac554FoodDatas extends AppModel{ public $name=Mac554FoodData public $actsAs = array('Search.Searchable'); // 検索対象のフィルタ設定 public $filterArgs = array( array('name' => 'name', 'type' => 'value', 'field' => 'Mac554FoodData.name'), array('name' => 'time', 'type' => 'like', 'field' => 'Mac554FoodData.time'), array('name' => 'naiyoudao', 'type' => 'like', 'field' => 'Mac554FoodData.naiyoudao'), ); //検索対象のフィールド設定 public $presetVars = array( array('field' => 'name', 'type' => 'value'), array('field' => 'time', 'type' => 'value'), array('field' => 'naiyoudao', 'type' => 'value'), ); } という感じで作りました。 投げているSQL文を見ると、 SELECT `Mac554FoodData`.`id`, `Mac554FoodData`.`time`, `Mac554FoodData`.`name`, `Mac554FoodData`.`naiyoudao`, `Mac554FoodData`.`twinoid` FROM `mac554_foodlog`.`mac554_food_datas` AS `Mac554FoodData` WHERE 1 = 1 となっています。 よろしくお願い致します

    • ベストアンサー
    • PHP
  • like検索の複数キーワードで、プレースホルダを利

    like検索の複数キーワードで、プレースホルダを利用するやり方が分からないので教えてください <やりたいこと> ・複数キーワード検索(東京 hoge) <現状、出来ていること> ・1単語キーワード検索(東京) <分からないこと> ・配列として処理すれば良いみたいなのですが、プレースホルダとの絡みでどうすればよいのか分かりません <環境> ・MySQL ・PDO <現状コード抜粋> public function search($keyword)  {  $sql = "   SELECT a.*     FROM hoge a      WHERE (honbun LIKE :keyword)      ";  $keyword ="%".$keyword."%";

    • ベストアンサー
    • PHP
  • PDOを使用し複数キーワードでOR条件のDB検索

    PDOを使用した複数キーワードでOR条件のDB検索をしたいです。 対象レコード件数が少ないので「LIKE '%hoge%'」で書こうと思うのですが下記の様にループで 書くしかないのでしょうか。 シングルクオートなどエスケープの処理を別で考えなければならず面倒なソースになってしまい、 他に良い方法が有りそうだけど、、と考えています。 初歩的な疑問ですが宜しくお願いします。 $serch_input = array('hoge','foo','""""') $input[] = prode(" " ,$serch_input) $sql = 'SELECT * FROM hoge WHERE '; foreach($input as $w) { $sql .= 'OR hoge.text LIKE "%' . $w . '%"'; } $result = connect()->query($sql); return $result;

    • ベストアンサー
    • PHP
  • ページのキーワード設定について

    ページのキーワード設定について質問です。 <meta name="keywords" content=" ">は、いくつまで単語を入力できるか決まってますか?制限数があれば教えてください。 よろしくお願いします。

  • PDOを使って複数キーワード検索する方法について

    PDOでプリペアードステートメントを使って複数キーワードで検索する方法を教えて下さい。 プリペアードステートメントは「?」形式ではなく、$stmt->bindParam(':sample', $samle);の形を使った方法を知りたいです。 環境 PHP:5.1.6 MySQL:5.0.77 処理の流れを作ってみました。途中から不明な点があるので変数化しないで記載してあります。 /*--PDOのプリペアードステートメントのbindParamを用いた場合--*/ $dbh = new PDO($DSN , $DBUSER , $DBPASS); $query = 'SELECT * FROM table WHERE '; $keyword_str = 'キーワードA キーワードB キーワードC'; //全角スペースを半角スペースに変換する処理(省略) $keywords = split(' ',$keyword_str); for($a = 0; $a <$keywords_num; $a++) { $kw[]=' 列名 like :kw'.$a; } $query.= join('AND', $kw); //キーワードごとに「%キーワード%」の形を作る。 $kw0='%'.$keywords[0].'%'; $kw1='%'.$keywords[1].'%'; $kw2='%'.$keywords[2].'%'; $stmt = $dbh->prepare($query); $stmt->bindParam(':kw0', $kw0); $stmt->bindParam(':kw1', $kw1); $stmt->bindParam(':kw2', $kw2); $stmt->execute(); /*-----------------------------------------------------------*/ 上記ソースの後半部分、 (1) //キーワードごとに「%キーワード%」の形を作る。 のところを変数を使って実現しようと思うのですが、うまくいきません。 $keywords_num=count($keywords); でキーワードの数を取得して for($a = 0; $a <=$keywords_num; $a++) { //作りたいソース } の形にすることは予想がつくのですが。 (2) $stmt->bindParam(':kw0', $kw0); $stmt->bindParam(':kw1', $kw1); $stmt->bindParam(':kw2', $kw2); の部分も上記と同じ形を考えていますが $keywords_num=count($keywords); でキーワードの数を取得して for($a = 0; $a <=$keywords_num; $a++) { //作りたいソース } 「//作りたいソース」の部分がうまく作れません。 (1)(2)の作りたいソース部分の書き方を教えて下さい。 上記の考え方より良い(短い)ソースが作れる場合はそのソースを教えて下さい。

    • ベストアンサー
    • PHP
  • phpで複数の検索語を検索対象にしたい

    環境:php+mysql やりたいこと: 半角や全角スペースの入った複数の検索語を検索対象にしたいです。 例:りんご みかん で検索されたキーワード 現在のコードは以下のとおりです。。 長くなるので、検索結果数だけの処理までを書いてます。 $sql の箇所で for文など使って繰り返し処理をさせればよいのかと思い google先生で検索しましたが、、どうにも該当しそうなサイトが見つからず アドバイスいただきたく質問させていただきました。 単語1つの場合だけ検索結果が正しく動きますが、 現在は、検索フォームに「りんご みかん」と入れると 検索結果ゼロになります。 これはこれで正しいのですが、、 希望は「りんご みかん」と入れると りんごとみかんを含む検索をしてほしい と考えてます。 <?php $keywords = $_GET["key"]; //検索キーワードのデータが何件あるか? $sql="select * from item where title like '%".$keywords."%' or Description like '%".$keywords."%' or category like '%".$keywords."%' "; $datas = mysql_query($sql , $db ); $num = mysql_num_rows($datas); echo "検索結果は "."<span style=\"font-size:30px;\">".$num."</span>"."件です。<br>"; } ?>

    • ベストアンサー
    • PHP
  • MySQL+PHPでキーワード検索をもとに五十音検索を作りたいです

    キーワード検索のソースを元に五十音検索を作りたいです。 キーワード検索のソースを元に五十音検索を作りたいのですが、”あ”という文字を押したら”あ”の頭文字の一覧が出るようにするにはどうしたらいいでしょうか。 キーワード検索ではすでにキーワードを入れたら検索結果の一覧が出るようになっています。 以下が必要そうなコードの抜粋です。 <?php //抽出条件を組み立てる $array = explode(" ", $keyword); $cnt = count($array); $where = "WHERE "; for($i=0; $i < $cnt; $i++){ $where.= "koji OR kana LIKE '%".$array[$i]."%'"; if($i < $cnt-1){ $where .=" ".$searchSelect." "; } } // クエリを送信する $sql = "SELECT * FROM sampletable ".$where; $result = executeQuery($sql); //結果セットの行数を取得する $rows = mysql_num_rows($result); //表示するデータを作成 if($rows){ while($row = mysql_fetch_array($result)) { $tempHtml .= "<tr>"; $tempHtml .= "<td>".$row[no]."</td><td><A href='result2.php?koji=$row[koji]' target='_blank'>".$row[koji]."</A></td><td>".$row[kana]."</td>"; $tempHtml .= "</tr>\n"; } $msg = $rows."件のデータがあります。"; }else{ $msg = "データがありません。"; } ?> <h3>キーワード検索</h3> 故事成語用検索フォーム(複合語検索ができます) <form name="form2" action="search2.php" method="post"> <input type="text" name="keyword" size="25"> <input type="submit" name="search2" value="検索"><br /> </form>

    • 締切済み
    • PHP
  • SEO対策のキーワード数

    SEO対策のキーワード数 こんにちは、 下記、キーワードなのですが、 <META name=keywords content=献立,夕食,家庭,生活> ある知人が、「キーワードは多すぎると良くない」と言っていました。 ここに、記述するキーワードは、どのくらいが目処なんでしょうか? また、キーワードはどうも単語が記述されているサイトが多いのですが 「夕食の献立」とか「夕食の野菜」等文章を記述しても意味が無いのでしょうか? どなたか、アドバイス頂けると有りがたいです。

    • ベストアンサー
    • HTML

専門家に質問してみよう