- ベストアンサー
MYSQLで違う検索結果が出てしまいます。
こんにちは。 現在PHP4+MYSQLでホームページの検索サイトを作っています。 カテゴリ検索とキーワード検索ができるようにしているのですが、 キーワード検索をすると、キーワードが入っていないレコードの情報まで表示されてしまいます。 エンコード設定に問題があるかも知れないのですが、 ・全てのページのHTMLのエンコード設定 ・全てのページのメタタグのエンコード設定 ・MYSQLの文字コード設定 これらは全てEUCに統一されています。 その他にエンコード設定するべきところがあるのでしょうか? それとも別なところに原因があるのでしょうか? 動作環境はレンタルサーバーなので詳しい設定まではわかりませんが、 Linux 2.4.X RedHat 7.x Apache/1.3.2X mysql-3.23.46 です。 PHPのバージョンまではわかりませんでした。 わかる方いらっしゃいましたら教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
この手のデバックって、頭が痛いですよね。。。(^^; まあ当然やられているとは思いますが、クエリするSQLをブラウザウに表示して、それをターミナルに直接張り付けるとどうなるでしょう? って、レンタルサーバーですね? sshやtelnetかなんかで、ログインできます?
その他の回答 (4)
- kusukusu
- ベストアンサー率38% (141/363)
>> $sql2 .="(colmun1~*'$key[$i]' OR colmun2~*'$key[$i]' OR ……)"; > の「~*」の部分の意味がわかりません。教えていただけないでしょうか? 申し訳ありません(^^; よく見ればMySQLでしたね。。。 上のはPostgreSQLで用いる正規表現です。 MySQLで使えるかどうかは知りません。
補足
PostgreSQLだったんですね。 わからなかったので、とりあえずそのまま試したところダメでした。(^д^;) いろいろ試してみたのですが、どうやっても解決しません。 PHPやMYSQLの設定自体に問題があるのかもしれません。 しかも残念なことに、このレンタルサーバーは.htaccess許可されてないんですよ。(;;) 当面の解決策として キーワードがハイライトされるように処理をして、 キーワードがないレコードまで取得されてしまった場合、 ハイライトされた言葉(ハイライト用のタグ)があるかどうかチェック、 もしなければその情報を非表示にする、という方向でやってみようかと思います。
- kusukusu
- ベストアンサー率38% (141/363)
> ・全てのページのHTMLのエンコード設定 > ・全てのページのメタタグのエンコード設定 > ・MYSQLの文字コード設定 全てのエンコードがEUCで統一されているのであれば、問題は、もっと他の所にあると思います。 # 確実に統一されていれば 例えばどんなSQLをクエリしていますか? 今ざっと考えてみて書きのようなコードを書いてみました。 # and検索で、ちなみに試していないので悪しからず(^^; $key=$_POST["key"]; if($key=="") { exit; } //スペースが半角全角どちらでもいいようにmb_convert_kanaでスペースを変換 $key=explode(" ",mb_convert_kana($_POST["key"],"s")); $sql="SELECT * FROM table_name WHERE "; for($i=0;$i<sizeof($key);++$i) { $sql2 .="(colmun1~*'$key[$i]' OR colmun2~*'$key[$i]' OR ……)"; //最後のキーワードの時以外は「AND」を入れる。 if($i!=sizeof($key)-1) { $sql2.=" AND "; } } $sql.=$sql2; これで、多分 SELECT * FROM table_name WHERE (col1*~'釣り',col2*~'釣り',col3*~'釣り') and (col1*~'大漁' or col2*~'大漁' or col3*~'大漁'); と言ったような、カラム1かカラム2かカラム3に「釣り」と「大漁」と言った文字を含んだレコードを検索できると思います。
補足
ありがとうございます。 初歩的な質問で申し訳ないのですが、 >$sql2 .="(colmun1~*'$key[$i]' OR colmun2~*'$key[$i]' OR ……)"; の「~*」の部分の意味がわかりません。教えていただけないでしょうか? 今まではLINK演算子を使ってやってました。 たとえばキーワードに「釣り」「北海道」と入れた場合、 クエリされるSQLの内容は SELECT * FROM table_name WHERE (col1 Like '%釣り%' OR col2 Like '%釣り%') AND (col1 Like '%北海道%' OR col2 Like '%北海道%') ORDER BY cnt DESC となってました。 これから教えていただいた方法で試してみようと思います。
- imasyu
- ベストアンサー率36% (19/52)
ほかにもっといい方法があるかも知れませんし、この方法でうまくいくかどうかはわかりませんが。。 おそらくexplode関数でスペースで区切って配列にしてforeachで要素を取り出しながらSQLを生成するのだと思いますが その際に取り出した要素にエンコードをかけてみてもだめですか? エンコードはEUCなので $value = mb_convert_encoding($value,"EUC-jp"); でEUCになります。 一度受け取った値がどうなっているかをprintしてみるといいですよ。
お礼
何とか暫定的な処理で今回はごまかす(?) ことにしました。時間がないので、とりあえずです。あとでこっそり修正予定です。 $value = mb_convert_encoding($value,"EUC-jp"); はウェブ上では頻繁に使いますよね。CSVにデータを落とし込む場合もEUCをSJISに~とかしなきゃいけないですからね。 アドバイスありがとうございました。
補足
ありがとうございます。 試してみましたがだめでした。 値をprintした結果は正常だったのですが・・・。 どうやら「ひらがな」や「カタカナ」が含まれていると違うレコードまで書き出してしまうようです。「漢字のみ」だと正しく表示されるのですが、「漢字とひらがなが混ざった状態」だとダメでした。 もうすこしいろいろやってみようと思います。
- imasyu
- ベストアンサー率36% (19/52)
>キーワードが入っていないレコードの情報まで表示されてしまいます。 それは全部のレコードが表示されるのですか? キーワード検索はスペース区切りのand検索ですか? 私はPHP4+oracleでキーワード検索をしたことがあるのですが基本的な部分は同じだと思うので補足お願いします。
補足
すいません。説明が足りませんでした。 検索はスペース区切りのand検索です。 全部のレコードは表示されません。どういった基準でかはわかりませんが、表示されるレコードとされないレコードがあるようです。 動作確認を私以外の人もやってたのですが、そのときはキーワード「釣り」で検索していました。他の人が言うには、 ためしにブラウザの設定をSHIFT_JISにすると、文字化けするが、【釣り】という文字が入ってないレコード情報に【文字化け後の釣り】という文字が入っているみたいだ、 という報告を受けています。 私も試してはみたものの、文字化けしていて、どこに何の文字が入っているかまったくわかりませんでした。 ちなみに半角英数でキーワードを入れた場合、正常に表示されます。 どうやらだめなのは全角文字のようです。 しかも正しく取得される全角キーワード(日本、や某出版社名)もありました。
お礼
いろいろご教授いただきありがとうございます。 MYSQLを利用したシステムは初めての上に、今まではメール送信フォームやアクセスカウンターしか作ったことがなかったので、勉強させていただきました。 今回は前にも書いたとおり、ハイライト用のタグを検索→なければ削除 という形で対処しました。 本当にありがとうございました。
補足
そうなんですよね。デバックつらいです。いろんな人がデバック手伝ってくれるのが唯一の救いです。 ssh/telnet不可でした。 現場の声を聞いてレンタルサーバー借りてもらいたいものです(^^; クエリするSQLをブラウザに表示させながらやってますが「???」です。 表示される結果は前にも書いた通りで、特に問題はないように見えるのですが・・・。 phpmyadminというソフトがインストールされているので、そちらの方で確認しようと思います。 しかし、このシステムは3日から稼動させなくてはならないそうなので、とりあえず非表示にしておいて・・・という形でないと間に合いそうもありません。(本業はデザイナーですし。そちらの方の仕事もあるので) imasyuさんやkusukusuさんのようにシステムに詳しい人がほとんどいないので、お二人のアドバイスは励みになってます。