MySQL + php + utf-8で文字化けをします。 - PHPプロ!Q&A掲示板

2994

  • 0P

MySQL + php + utf-8で文字化けをします。

質問日時 / 2010年12月1日 20:59    回答数 / 2件

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

キーワード / mysql    php    文字化け   

現在、MySQLにデータを追加・一覧表示を行うプログラムを書いています。
その時に、phpソースと出力されたhtmlはutf-8で正常に表示がされるのですが、
なぜか、MySQLのデータベースのデータのみが文字化けをしています。

ネットで調べて下記のコードを記述してみたのですが、
今度は文字化けの種類が「???」になってしまいました。

  1. /etc/my.cnf
  2.  
  3. [mysqld]
  4. default-character-set=utf8
  5. skip-character-set-client-handshake

出力されたhtmlは正常に表示されるのですが、
ちょっと気になります…。
もし、分かる方がいらっしゃいましたら、
ご返信を頂けると幸いです。

宜しくお願いします。

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



ツリー一覧

┗A01shimix各々のバージョンはいくつでしょうか。またMySQLへの
 ┗A01-1daizishimixさん。 お返事が遅くなりましたが、回答を頂き

回答一覧

並び替え:

A01
answerershimix [12月1日 23:01]

各々のバージョンはいくつでしょうか。またMySQLへのデータ挿入はどういう手順ですか(データがutf-8なのはどうやって確認されましたか)。出来れば、データ挿入/データ読み出しの記述をmysql_connectから転記していただくとありがたいです。

#データセットしたあとで「skip-character-set-client-handshake」に
#してしまうのはどうなんでしょうね・・

ちなみにスクリプトにはmysql_set_charsetは記述されているんですよね?

  ・http://www.php.net/manual/ja/function.mysql-set-charset.php

この意見に回答する

ツリーへ TOPへ

A01-1
replyerdaizi [12月8日 11:45]

shimixさん。
お返事が遅くなりましたが、回答を頂き、
ありがとうございます。

バージョンは、
・PHP :5.3.0
・mySQL : 5.3.17
・OS : Win XP
です。

エンコードは、eclipseを使用しているので、
その環境設定からutf-8に指定しました。
なので、utf-8で記述されている →htmlで正しく表示されているので、どちらもutf-8だ!
と、思っていたのですが、
見当違いでしたら、すみません…。

mySQLの呼び出しは、PDOを使用しています。
以下に、スクリプトを添付します。

宜しくお願いします。

  1. <?php
  2. $db_dns="mysql:host=localhost;dbname=todo";
  3. $user="todo";
  4. $password="himitu";
  5.  
  6. $create_query=<<<_____
  7. CREATE TABLE items(
  8.     todo_id INTEGER PRIMARY KEY AUTO_INCREMENT,
  9.     memo TEXT,
  10.     flag TEXT,
  11.     ctime INTEGER);
  12. _____;
  13. $db=new PDO($db_dns,$user,$password);
  14. $select_stmt=$db->query("SELECT * FROM items LIMIT 1");
  15. if(!$select_stmt){
  16.   try{
  17.   $db->exec($create_query);
  18.   $now=time();
  19.   $db->exec("INSERT INTO items (memo,flag,ctime)".
  20.   "VALUES('データの初期化','done',$now)");
  21.   }catch (PDOException $e) {
  22. // catchブロックで接続失敗時の処理を行う
  23. die($e->getMessage());
  24. } 
  25. }
  26. echo $_GET['newitem'];
  27. if(isset($_GET['newitem'])&& $_GET['newitem']!=""){
  28.   $memo=$db->quote($_GET['newitem']);
  29.   $now=time();
  30.   $db->exec("INSERT INTO items (memo,flag,ctime)".
  31.   "VALUES('$memo','new',$now)");
  32. }
  33. $todo_id=intval($_GET['done']);
  34. if($todo_id>0){
  35.   $db->exec("UPDATE items SET flag='done' "."WHERE todo_id=$todo_id");
  36. }
  37.  
  38. $list="";
  39. $sql="SELECT * FROM items WHERE flag='new' ORDER BY ctime DESC";
  40. $r=$db->query($sql);
  41. foreach($r->fetchAll() as $row){
  42.   $todo_id=$row["todo_id"];
  43.   $memo=htmlspecialchars($row['memo']);
  44.   $ctime=date("Y-m-d",$row['ctime']);
  45.   $btn="[<a href='?done=$todo_id'>x</a>]";
  46.   $list .="<li>$btn $memo ($ctime)</li>";
  47. }
  48.  
  49. $sql="SELECT * FROM items WHERE flag='done'"." ORDER BY ctime DESC LIMIT 5";
  50. $r=$db->query($sql);
  51. foreach($r->fetchAll() as $row){
  52.   $memo=htmlspecialchars($row["memo"]);
  53.   $ctime=date("Y-m-d",$row["ctime"]);
  54.   $list.="<li><s>$memo ($ctime)</s></li>";
  55. }
  56.  
  57. ?>
  58. <html><body>
  59. <h1>TODO</h1>
  60. <?php echo $list?>
  61. <h3>新しいTODO</h3>
  62. <form method="get" action="s5-2.php">
  63. <input type="text" name="newitem" />
  64. <input type="submit" value="追加" />
  65. </form>
  66. </body></html>

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
array_mergeの再帰処理の動作について
 このエントリーをはてなブックマークに追加 
A
>1個になったとき$leftを返しますが、 >このとき、最終的な$leftはnullになるかと思います。 いいえ、最後は「渡された配列をそのまま」返します。要素が2以上あるときとの違いは(並べ替えずに戻るので...

>>続きを読む

再帰関数は最初の内は混乱しますが、非常に上手く使える場面もいずれ出てきます。これを機会に学んでいけるといいですね。

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