MySQLで検索値の文字化けについて - PHPプロ!Q&A掲示板

2404

  • 0P

MySQLで検索値の文字化けについて

質問日時 / 2009年12月13日 15:30    回答数 / 3件

Questioner:  bicycle8080  このエントリーをはてなブックマークに追加 

キーワード / MySQL    検索    文字化け   

いつもお世話になっております。
PHP+MySQLにて検索フォームを作成しております。
検索方法はフリーワード検索でDB側のtagというフィールドに検索値をカンマ区切りで持っている状態です。

複数の検索値はスペースで区切って入力し、それをカナに変換、スペースを半角に変換、SQL文の作成としております。以下ににそのコードを記述しております。
  1. $fwtext=mb_convert_kana($fwtext,k,"SJIS");
  2. $keywords = ereg_replace("[  ]+", " ", $fwtext);
  3. $keywords = trim($keywords);
  4. $keywords = explode(" ", $keywords);
  5. $tmp = array();
  6. foreach($keywords as $kw){
  7.   if($kw == ""){
  8.   }else{
  9.     $tmp[] = " tag LIKE '%".$kw."%' ";
  10.   }
  11. }
  12. $sql_fw = "SELECT * FROM category ";
  13. if(count($tmp) > 0){
  14.   $sql_fw .= "WHERE " . implode("OR",$tmp);
  15. }
  16.  
  17. $rs_fw=mysql_db_query($db,$sql_fw);
  18. $ct=0;
  19. while($Row_fw=mysql_fetch_array($rs_fw)){
  20. $category[$ct]=$Row_fw['A'].$Row_fw['B'].$Row_fw['C'].$Row_fw['D'];
  21. $ct=$ct+1;
  22. }

この検索でほとんどの場合は可能ですが・・・「美容院」「病院」の検索値が入力された時、「院」という文字が「病・」「美病・」となってしまいます。
文字コードやエスケープ等調べましたが。「院」がヒットするサイトがなかったもので、こちらに質問させてただきました。どなたか解決方法や、原因をご存知でしょうか?

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01magicflute2・マルチバイト文字を扱っているが、途中の処理によっ
 ┗A01-1win_phptrim()の前後でデバックしてみてください。 院,法,
  ┗A01-1-1bicycle8080回答ありがとうございます。 trimがマルチバイト対

回答一覧

並び替え:

A01 参考になった
answerermagicflute2 [12月13日 18:19] (最終編集:12月13日 18:22)

・マルチバイト文字を扱っているが、途中の処理によって文字が壊れていないか
・マニュアルで、mb_convert_kanaの説明をよく見る
・正規表現を使用する以外に方法は無いのか(mb_substrmb_strlenなど)
・スペースでexplodeも有りだが、他に方法は無いのか
・行4で$keywordsが突然配列になるがいいのか
・上記の変更で、行4~行11の処理はシンプルにならないか
この辺を見直してはいかがでしょうか?

余談ですが、php5.3以降、ereg_系の関数は使用してはいけません。
この点も踏まえて修正してくださいませ。

この意見に回答する

ツリーへ TOPへ

A01-1 満足
replyerwin_php [12月16日 01:28] (最終編集:12月16日 01:33)

trim()の前後でデバックしてみてください。

院,法,鼻など文字化けするようです。


  1. <html xmlns="http://www.w3.org/1999/xhtml">
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
  4. <title>test</title>
  5. </head>
  6. <body>
  7. <?php
  8. echo trim("院,法,鼻");
  9. ?>
  10. </body>
  11. </html>

trim()が、2バイト文字に対応していないからです。

utf-8にすることで解決します。

あと、参考までにマニュアル
http://www.php.net/manual/ja/ref.mbstring.php

の中、mb_trim() というfunction が記載されていますね。
使ったことないですけど。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyerbicycle8080 [12月17日 13:29]

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

trimがマルチバイト対応していなかったんですね。
utf-8には携帯サイトを運営しているので厳しいものがあります。

mb_trim()を作成してみたいとおもいます。
ありがとうございました!!!

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)