![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
いつもお世話になっております。
php+MySQLにて検索機能を作成しています。
キーワードが1つの場合には以下のスクリプトで正常に動作していますが、全角あるいは半角のスペースによって複数キーワードを入れた場合にも検索が行われるようにしたいと思っています。
現在のスクリプト
$word=$_POST["seek"];
$word=stripslashes($word);
$con_word=mb_convert_encoding($word,"EUC-JP","auto");
//データベース接続がここに入ります
$sql="SELECT words,name,id FROM profile WHERE words like '%$con_word%'";
ここで、スペースを" AND "に置き換えるために、
$word=preg_replace('/\s+/',' ',$word);
$word=preg_replace('/ /',' AND ',$word);
あるいは
$word=mb_convert_kana($word,"as","EUC-JP");
$word=preg_replace('/ /',' AND ',$word);
などを試してみたのですがうまく動作しません。
どなたか問題点を具体的にご指摘いただけないでしょうか。
よろしくお願いいたします。
*環境
php
mysql
レンタルサーバ(ロリポップ)
No.4ベストアンサー
- 回答日時:
よくよく考えたらAND条件ですね。
なら正規表現ではなく条件の羅列です。<?
$word="a b c";
$whereWord="";
foreach (split(' ',$word) as $val){
if(!empty($val)) $whereWord.=($whereWord==""?"":" AND ")."`words` like '%{$val}%'";
}
if(!empty($whereWord)) $whereWord="OR ({$whereWord})";
$sql="SELECT words,name,id FROM profile WHERE 0 {$whereWord}";
print $sql;
?>
(1)基本的には検索語がない場合は値を返さないようにします
WHERE 0
(2)そこに検索条件をORで繋ぎます。
(3)スペースが、検索語の先頭や最後にきたり連続したりする場合を
想定して、$valになにかデータが入っているかをチェックします。
if(!empty($val))
度重なるご回答に感謝いたします。
#1のお礼にて記入したスクリプトですが、ご想像どおり不完全なもので、入力内容によってはスクリプトエラーが出てしまい、実用に耐えるものではありませんでした。
未だにその原因も分からず、「条件の羅列」と「正規表現」の違いも理解できないのですが、いただいたスクリプトにて望みどおりの機能を実装することができました。
本当にありがとうございます。
No.3
- 回答日時:
とりあえず今回の件は#1のお礼でやっている方式は
あまりよくないです。
#2で回答した正規表現でやるならこんな感じ
$word=str_replace(' ','|',$word);
$sql="SELECT words,name,id FROM profile WHERE words REGEXP'$word'";
まぁエスケープ処理が必要だったりで、このままだと多少
問題がありますが、総じてmysqlの正規表現で処理することができます。
No.2
- 回答日時:
PHPはともかく・・・
SQLでLIKE '%hoge%'はインデックスきかないですけど・・・
ほんとにそんなのでよいのでしょうか?
どうせ効率的でないなら正規表現にしてしまう方がよいかも
http://dev.mysql.com/doc/refman/5.1/ja/regexp.html
回答ありがとうございます。
やや抽象的なご指摘のため、意図されるものが理解できませんでした。
質問内容の通り、まだまだ未熟ゆえご容赦いただきたいと思うのですが、参考URLに関しても理解できませんでした。
地道に数年間勉強すればいいのかもしれませんが、それだけの時間もなく、実際にwebを作ってゆく上で必要な技術を1つ1つ身につけているところですので、ご指摘の件に関しましては、将来的に必要になるであろうポイントとして心に留めておきたいと思います。
ありがとうございました。
No.1
- 回答日時:
とりあえず、うまく動作しない時の$sqlをecho なりprint なりで表示してみて下さい。
それと複数条件でのSELECT文を書いてみてください。
比べてみた時にPHPからのSELECT文は思った通りのSELECT文になってるでしょうか?
WHERE以降は条件が1つなら
WHERE words like '%aaa%'"
でOKですが、複数の条件を指定したいのであれば
WHERE words like '%aaa%' AND words like '%bbb%'
のようになっていないといけないので、
スペースをANDに変換するだけではこの形にはならないですよね?
なので、うまく動作しなかったんですね。
それと、スペースを変換するだけだと、ユーザーが検索文字の最後にスペースを入れてしまった場合にエラーになると思います。
その辺りの配慮も必要になりますね。
回答ありがとうございます。
ご指摘の
『WHERE words like '%aaa%' AND words like '%bbb%'』
この表現に思い至りませんでした。
以下のように変えたところ、意図したとおりに動作しました。
ありがとうございます。
また、ご指摘のように、キーワード間以外にスペースが入る場合についても考慮する必要は感じておりますが、現段階ではそこまで緻密でなくともよいので(仕事のwebではないため)、もう少しスキルアップしたら(gooで聞かなくてもいいくらいのレベルになったら)改変しようと思います。
重ね重ねありがとうございました。
$word=mb_convert_kana($word,"as","SJIS");
$word=preg_replace('/ /','%\' AND words like \'%',$word);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- その他(Microsoft Office) Windows Update 後、Office2019(Word、Excelなど)が消えた 4 2023/01/14 10:28
- Excel(エクセル) Excelから複数のWordファイルを操作する方法について教えて頂きたい。 やりたいことは、複数のW 2 2022/07/26 20:11
- Visual Basic(VBA) evcel VBAについて 2 2022/08/02 21:37
- Word(ワード) 表の縦罫線を移動するピッチ 1 2022/10/12 12:24
- Word(ワード) PCで作ったwordをスマホで編集しようとすると「このファイルは読み取り専用です。」と表示される。 3 2023/05/30 14:51
- Word(ワード) MacのOSをアップデートしたら、Wordが使用できなくなりました。 2015年年末に頃にMacとM 2 2022/05/15 12:39
- 英語 品詞分解手伝ってくださいませんか? 4 2022/06/23 23:26
- CPU・メモリ・マザーボード CPUがメモリ上の命令を実行した後の流れについての質問です。 1 2023/05/05 01:36
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<VB.NET>INSERT文でDBにデータ...
-
PHPのSQL文のデバッグ方法とコ...
-
Pro*Cの構文エラー
-
ASPでSQL文を使う場合に。
-
insert1つの処理でもトランザ...
-
データベースに存在するデータ...
-
ResultSetインターフェイスでの...
-
VBA ACCESS SQL...
-
like検索の複数キーワードで、...
-
CakePHPとMySqlを使用していま...
-
JAVA SQLServerException 列名 ...
-
エクセルVBAのデータベース接続...
-
一度検索されたものに対するソ...
-
自作の検索エンジンを作成しま...
-
配列に入ったデータをループを...
-
php mysql接続での書き方
-
SQL文の処理を関数化したいです
-
PHPの記述で値が取れません。
-
checkbokとキーワード検索を組...
-
【ASP.NET】MySQLのテーブルレ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JAVA SQLServerException 列名 ...
-
<VB.NET>INSERT文でDBにデータ...
-
Pro*Cの構文エラー
-
Q&Aサイトを作成していてURLの...
-
ResultSetインターフェイスでの...
-
VBA ACCESS SQL...
-
データベースに存在するデータ...
-
VB.NET エラーになる箇...
-
insert1つの処理でもトランザ...
-
MySQLのINSERT時にたまに重複に...
-
INSERT,DELETEを同時に
-
like検索の複数キーワードで、...
-
PHP&MySQLでの文字列+数列の一...
-
mysqliを使ってデータベースを...
-
PHP初心者です。syntax error, ...
-
PHP+SQLite でSELECT文のWHERE...
-
php MySQL で、更新ボタンを押...
-
SQLインジェクション対策
-
phpでforeach ($stmt as $row)...
-
OR検索を実装したい
おすすめ情報