複数AND検索でどんどん絞り込む&検索エリアと結果表示エリアを同じ画面に

PHP

前々回の記事のとおり
検索機能のベースはまとまったので、

こんどは検索エリアと結果表示エリアを同じ画面に。
それだけでなく、


名前で検索したり価格で検索したり属性で検索したりみたいな
いろいろな検索があって
ポチポチいじると同画面の結果表示が変わるのが理想。

しかも全部AND検索で絞り込む感じ。

あと絞り込んだ状態で見ることになるので
きちんと検索した内容がフォームに残っていること・・!


不動産サイトとかによくあるイメージ・・キラキラ

・・なんてたくさんのワタシの欲求。

しかし毎回、やる前の気持ちと
やった後こういうブログを書いているときの気持ちが違いすぎる。。

ブログ書くときは達成した後だけど、
最初はなんて無謀なことに挑んでるんだ私・・ガクリ
って毎度思ってます。
でも本気で考えてやれば一個ずつクリアできるものですネ花

■いままでGETで渡していた検索後をPOSTにした。

複数のたくさんの検索でAND検索にするということと、
同じ画面だしなんかURLに出るのなんかやだということでPOSTにしました。

というか初めてPOST設定してみたけれど
GETと変わらず使えるしいつもPOSTで問題ないんではなんて思ってしまった。
GETのメリットはなんだ?

<form method=”POST” action=”XXX.php”>

■action は自分に。

なんか違和感があったけど、普通に動いたので。

■検索値をフォームに残す処理

こちらのQ&Aが役立ちました。

~~~~~~~~~~~~~~~
if (empty($_REQUEST[‘searchname’]))
{
$search = “”;
$value =””;
}
else
{
$search = $_REQUEST[‘searchname’];
$value =” value=\”{$_REQUEST[‘searchname’]}\””;
}

print <<{$value} /><br />
<input type=”submit” name=”submit” value=”検索” />
<input type=”submit” name=”searchname” value=”” /><br /><br />
end;
~~~~~~~~~~~~~~~
$_REQUESTで受け取った検索後を
value=のところに入れてるんですね~リセットボタン付けました。
ページ再読み込みのような後に続く全部の検索をリセットするのではなく、
このテキストフォームに設定した検索だけ解除したい、
他の検索の設定は残したい、ということで
name=”namesearch” value=””
にしたらそのとおり機能しました。
しかしボタンに文字が表示できないなう。
value=””に「リセット」とか入れるとボタンになるけど
押した後「リセット」という文字がフォームに表示されてしまう。。
ボタンは画像にするので今はこのままでいいや。。

そしてこの後にもチェックボックスの検索とか続きます。

上記で一度<form>タグ閉じたりしていたのですがそれではダメで
同じ<form>タグ内に全部の検索を入れるんですね。

普通にHTMLのformタグの知識とかも必要ですな。。

あと今回手間取ったのは
Undefined variable
というエラーがやたら出たこと。

空の変数のままだとダメってことですか。

ひたすら
if (!empty($XXXX)) {~~
で囲んで、「空じゃないときは」という条件を付けたりしました。

そしてよくよく調べると空にも種類がいろいろある・・

そして
!empty と isset で意味が違う・・!!

うへぇ~~ムンクの叫び
この件についてはこちらのサイトがとてもまとまっておりました。
一部抜粋です。

: isset() : !empty()
—————————–
未定義   :  FALSE  :  FALSE   一致
NULL     :  FALSE  :  FALSE   一致
FALSE    :  TRUE   :  FALSE   不一致
空文字   :  TRUE   :  FALSE   不一致
空配列   :  TRUE   :  FALSE   不一致
0       :  TRUE   :  FALSE   不一致
‘0’      :  TRUE   :  FALSE   不一致
‘0a’     :  TRUE   :  TRUE    一致
unset後  :  FALSE  :  FALSE   一致

!emptyのほうが厳しいということでしょうか。
ちゃんと適するほうを考えて使わなきゃ。。

そんなこんなでたくさんの検索をつくりました。
たくさんの検索を繋げて、sql文に入れていくのは以下のイメージ。
以下はこちらのQ&Aより

$sql =”SELECT *”;
$sql.=” FROM HOGE”;
$sql.=” WHERE 1″;
$sql.=” AND a=1″;
$sql.=” AND b=1″;

上記でこういうことか~となんとなく形は分かり、
前々回の記事のような検索のつくり方をしている私はというと。

~~~~~~~~~~~~~~~
$sql = “SELECT * FROM テーブル
LEFT JOIN ・・・
WHERE 1”;
if (!empty($where_clause1)) {
$sql.=” AND ($where_clause1)”;
}
if (!empty($where_clause2)) {
$sql.=” AND ($where_clause2)”;
}
if (!empty($where_clause3)) {
$sql.=” AND ($where_clause3)”;
}
$sql.=” GROUP BY paintcolor_id”;(←SELECTのとこでGROUP_CONCATしてる場合)
~~~~~~~~~~~~~~~

なぜかいちいち「空じゃないとき」っていう条件をつけてあげないと
エラーが出るので上記のようになりました。

$where_clauseXの中には以下のようなものが入っているイメージです。

name LIKE ‘%やまだ%’ OR name LIKE ‘%ヤマダ%’ OR ・・

type = ‘AA’ OR type = ‘BB’ OR type = ‘AB’

など。
(一つの検索の中ではOR検索)

あとWHERE 1 という「1」を入れるのも便利ですね。

ふぅ。検索は乗り越えた・・
ご意見ご指摘あればバシバシつっこんで頂ければ幸いです。

検索
を乗り越えたら一つ目の大きな山を越えた感じだにひひ

あとは、ページングとソートと
SQLインジェクションというものを調べる・・!
—–

コメント

タイトルとURLをコピーしました