人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPとMYSQLについて質問です。

現在、PHPの画面から検索ワードを入力して、その検索キーワードを元に
SQLでLIKE検索を行っているのですが、自分の考えているものがうまくできず困っております。

やりたいことは2つや3つの検索ワードを元に必要データを抽出するというものです。

例えば

テーブル TEST
項目 BRAND
PRODUCT

項目BRANDにはブランド名が PRODUCTには商品名が入っています。

PHPのテキスト入力画面に ブランド名 商品名 を検索ワードとして入力して、
検索ボタンを押すと、項目BRANDとPRODUCTの両方から検索ワードに含まれる商品データを抽出してくれるようにしたいです。

例)BRANDにコムサ PRODUCTにマフラー と入っているものを探したいとして

検索テキストに コムサ マフラー と入力すると BRANDにコムサ PRODUCTにマフラー とはいっているものを抽出出来るようにしたいです。

このようなことをLIKE検索ですることは可能でしょうか?

わかるかたおりましたらよろしくお願いいたします。


●質問者: aiomock
●カテゴリ:コンピュータ インターネット
✍キーワード:MySQL PHP SQL test キーワード
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● kn1967
●100ポイント ベストアンサー

>コムサ マフラー と入力すると BRANDにコムサ PRODUCTにマフラー


並び順で必ず一つ目の単語がブランド名で二つ目が商品名だと、

決め付けても良いのであれば、

<?php
$text = "コムサ   マフラー"; // 入力されたテキスト
$textArray = preg_split("/ /", preg_replace("/( | )+/", " ", trim($text))); // 分割
$sqlStr = "SELECT * FROM test WHERE (brand Like '%$textArray[0]%') AND (product Like '%$textArray[1]%')"; // SQL生成
echo $sqlStr; // テスト出力
?>

のような具合に単純に分割してしまえばよいのが、これで良いのだろうか?

例えば、「コムサ マフラー 手袋」などと入れた場合は、

単純に「手袋」が無視されるだけで済むかもしれないけど、

検索ボックスに「マフラー コムサ」の順番で入れた場合はどうですか?

結果がゼロ件になるわけだけど、それで良いということであれば、

以下は読まなくても結構です。


ブランド名用のテキスト欄と、商品名用のテキスト欄を用意しておいて、

必要に応じて片方もしくは両方を入力するという方法が無難だと思うが、

どうなのだろうか?

下記は少し凝って、それぞれ複数のテキストに対応してますが、もちろん、

上記と同様に単純にしてもかまいません。

<?php
$textBrand = "コムサ ヴィトン"; // 入力されたテキスト
$textProduct = "マフラー 手袋 カバン"; // 入力されたテキスト
$textBrandArray = preg_split("/ /", preg_replace("/( | )+/", " ", trim($textBrand))); // 分割
$textProductArray = preg_split("/ /", preg_replace("/( | )+/", " ", trim($textProduct))); // 分割
$sqlStr = ""; // 初期化
if ($textBrandArray[0] != "" and $textProductArray[0] != "") { // 両方入力されている場合のSQL生成
 $sqlStr = "SELECT * FROM test WHERE "
 . "((brand Like '%" . join("%') OR (brand Like '%", $textBrandArray) . "%')) AND "
 . "((product Like '%" . join("%') OR (product Like '%", $textProductArray) . "%'))"
 ;
} elseif ($textBrandArray[0] != "") { // ブランドだけ入力されている場合のSQL生成
 $sqlStr = "SELECT * FROM test WHERE "
 . "(brand Like '%" . join("%') OR (brand Like '%", $textBrandArray) . "%')"
 ;
} elseif ($textProductArray[0] != "") { // 商品だけ入力されている場合のSQL生成
 $sqlStr = "SELECT * FROM test WHERE "
 . "(product Like '%" . join("%') OR (product Like '%", $textProductArray) . "%')"
 ;
} else {
 echo "エラー!ブランド名も商品名も入力されていません。";
}
echo $sqlStr;
?>

※いずれも単体で動きますので、まずはどのようなSQLが生成されるか、

そして、どのようにプログラムが動いているかをよく確認してから、

ご自身のシステムに組み込むようにしてください。

◎質問者からの返答

ご回答ありがとうございます。是非試してみます^^。


2 ● pah00
●35ポイント

BRAND like '%コムサ%' OR PRODUCT like '%マフラー%'

/////

ORよりANDがよければANDで。

◎質問者からの返答

ご回答ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ