質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.79%

mysqlで日本語の漢字だけが検索できない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 9,188

score 41

いつもお世話になります
今回もお力を貸して頂きたいのですが
SQLで入力フォームでuやaなどローマ字で検索すると
大丈夫なんですが
僕、真などの漢字には結果が表示されません。
データベースにはきちっとその単語が登録されています
。アドバイスお願いします

//次ページやページング処理
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>天気予報を表示する</title>
</head>
 <body>
<?php

$filename = 'test.txt';
$filename = 'sst.txt';
$filename = 'gyousuu.txt';
$filename2 = 'RSSlog.txt';
$i = 0;//総検索済み回数
$v = 0;// function Filewriteでつかう存在する動画の通し番号(0,1,2,3,4,5・・・・)
$j = 0;// function Filewrite存在する動画の通し番号(0,1,2,3,4,5・・・・)
  $p=1;

$size= 100;//動画取得数

  if(  isset($_GET['page'])  ){  //サニタイズ 数値なら代入、違えば1
    if( is_numeric($_GET['page']) ){
      $p=$_GET['page'];
    }
  }

function kensakumado(){
global $x,$v,$size,$p,$nm;// 通し番号を付けとく

echo "<form action = '?page=0' method='get'>";
echo "名前:<input type='text' name='nm'>";
echo "年齢:<input type='text' name='age'>";
echo "<input type='submit' name='exec' value='検索'>";
echo "</form>";

$nm =htmlspecialchars($_GET['nm']);
}

function OnedaySerchSQL(){
global $x,$v,$size,$p,$nm;// 通し番号を付けとく
global $tousi;
$v+=1;
$nowstamp=time();
date_default_timezone_set('Asia/Tokyo');
$time=date( "Y年m月d日 H時i分s秒" ) ;
$link = mysql_connect('localhost', 'root', '');
if (!$link) {
    die('接続失敗です。'.mysql_error());
}

print('<p>接続に成功しました。</p>');

$db_selected = mysql_select_db('nikonikodouga', $link);
if (!$db_selected){
    die('データベース選択失敗です。'.mysql_error());
}

print('<p>uriageデータベースを選択しました。</p>');

mysql_set_charset('utf8');

$result = mysql_query('SELECT * FROM rss');
if (!$result) {
    die('クエリーが失敗しました。'.mysql_error());
}

$sql = "SELECT title,syutokuzumi,syutokuTIME,smtsuzuki,timestamp FROM rss where title like  '%$nm% ' limit " . $p*10 . ", 10 ";
$result_flag = mysql_query($sql);
$i = 0;

while ($row = mysql_fetch_assoc($result_flag)) {
    if($i>=$size)break;
    print('<p>');
    print('title='.$row['title']);
    print(',syutokuzumi='.$row['syutokuzumi']);
    print(',syutokuTIME='.$row['syutokuTIME']);
    print(',smtsuzuki='.$row['smtsuzuki']);
    print('</p>');
   $x[$i]->URL   = $row['smtsuzuki'];
   $x[$i]->RSSsyutokuTime   = $row['syutokuTIME'];
   $x[$i]->RSStimestamp   = $row['timestamp'];
$i++;
}
$close_flag = mysql_close($link);
if ($close_flag){
    print('<p>切断に成功しました。</p>');
} return $i;
}

class A
{
  public $num;
  public $sm;
  public $imgurl;
  public $tltle;
  public $setsumei;
  public $view;
  public $mylist;
  public $coment;
  public $URL;
  public $tag;
  public $RSSsyutokuTime;
  public $RSStimestamp;

}

for($i=0 ; $i<=$size; $i++) {
$x[$i] = new A;
}

kensakumado();
 OnedaySerchSQL();

 ?>

<a href="?page=<?php echo $p+1; ?>">次へ</a>

<?php

$start_page = ($p < 4 ? 0 : ($p >= ($size - 4) ? $size - 8 : $p - 4)); // 4 <= $p <= ($size - 4)
$end_page = $start_page + 9; 
for($i = $start_page; $i < $end_page; $i++){
  if($i == $p){
    echo $i;
  }else{
    echo "<a href=?page={$i}>{$i}</a> ";
  }
}

?>

</body>
</html> 

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

普通に考えて、文字コードの問題に見えます。

・MySQL(またはTable)はUTF-8で構築しているか?
show variables like "chara%";
基本的にすべてUTF-8ならOK
  NGなら直す、もしくはTABLEをUTF-8で作成し直す

・MySQLにUTF-8で文字列が格納されているか?
MySQLでログいんしてSELECTして文字化けしていないかを確認する

・PHPのマルチバイト設定はUTF-8か?
PHPの設定を確認してみる。
モジュール形式のPHPが同じphp.iniを参照していれば下記コマンド。
$ php -i | grep mbstring.http
  mbstring.http_input => UTF-8 => UTF-8
  mbstring.http_output => pass => pass

違うphp.iniを参照しているなら、phpinfo()を呼び出すPHPを配置し、ブラウザから参照する

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/05 22:23

    mysqlの設定で照合順序をutf8 unicode ci
    にしてphp.iniをコメントアウトを外して
    mbstring.http_input = UTF-8
    mbstring.http_output = pass
    にしてもだめでした

    キャンセル

  • 2016/03/06 02:35 編集

    ソースをコピーして実行してみました。
    指摘2点あります

    1)SQLのLike文にスペースが混入しています
    $sql = "SELECT title,syutokuzumi,syutokuTIME,smtsuzuki,timestamp FROM rss where title like '%$nm% ' limit " . $p*10 . ", 10 ";

     こちら '%$nm% ' の2つ目の%の後ろにスペースが入っています。
     これはあえて入れてますか?

    2)ページング開始の指定
     limit 指定で $p に10を掛けていますが、最初のページで1をセットしているため
     $p(=1) * 10 = 10 となり、10行目から10行取得してるので件数が足りなくて取得できてないのでは?


    ページング処理を組み込む前に、まずは正しくデータが取得できることを確認した方が良いです。

    ちなみに、
    入力フォームでuやaなどローマ字で検索すると大丈夫
    とありますが本当ですか? 1)の状態(SQL)だと取れないはずなのですが、、

    mysql> SELECT title,syutokuzumi,syutokuTIME,smtsuzuki,timestamp FROM rss where title like '%a%';
    +-----------+-------------+-------------+-----------+-----------+
    | title | syutokuzumi | syutokuTIME | smtsuzuki | timestamp |
    +-----------+-------------+-------------+-----------+-----------+
    | kanagawa | 0 | NULL | NULL | NULL |
    | ishikawa | 1 | NULL | NULL | NULL |
    | kagawa | 1 | NULL | NULL | NULL |
    | kana gawa | 0 | NULL | NULL | NULL |
    +-----------+-------------+-------------+-----------+-----------+
    4 rows in set (0.00 sec)


    4行目が取れるかと思いましたが、取得できませんでしたよ

    mysql> SELECT title,syutokuzumi,syutokuTIME,smtsuzuki,timestamp FROM rss where title like '%a% ';
    Empty set (0.00 sec)

    キャンセル

  • 2016/03/06 05:11

    上記修正後、私の環境で試してみましたが、日本語が化けましたね。

     mysql_set_charset('utf8');
      ↓
     mysql_set_charset('utf8', $db_selected);

    と、第2引数に指定したら、日本語で検索も、出力もできました。

    キャンセル

  • 2016/03/06 10:05

    返信ありがとうございます。
    どうやらlikeの後ろにスペースを入れたのがマズかったようで
    空白消せばうまくできました。
    ページング処理のほうも修正しておきます。ありがとうございました。

    キャンセル

0

MySQLの問題のようです。
下記のように、SQLのLimitの前に ”COLLATE utf8_unicode_ci ”を追加してみてください。

SELECT title,syutokuzumi,syutokuTIME,smtsuzuki,timestamp FROM rss where title like  '%$nm%'   COLLATE utf8_unicode_ci limit " . $p*10 . ", 10 ";

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/05 22:05

    上記のコードを追加しましたが
    まだうまくいかないようです

    キャンセル

  • 2016/03/06 10:04 編集

     間違えました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る