PHPでMySQLに日本語入力する方法。

sample.phpで$_GET[namae]したitem $item[namae]は、?namae=これはサンプル文章です とすると
print "$item[namae]"; で「これはサンプル文章です」と出力してくれます。

しかしながら、 UPDATE sampleDB SET namae = $item[namae] WHERE `key` = 1 と書きこむすると、
1‘Î1‘Ήž?̉‰?K/?”ŠwII?‘åŠw?Ö?Ì?”Šw_
のような感じ(上の文字化けは違う文字列入力によるものです。)となってしまい、
SELECT namae FROM sanpleDB WHERE `key` = 1の結果を連想配列$item[namae]に取り込んでprintしても、うまくいきません。

上記一連の流れを全て日本語で行うために必要なコード、もしくは参考ページを補足して頂ければ有り難いと思います。よろしくお願いします。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/11/18 01:19:11
  • 終了:2010/11/23 02:07:27

ベストアンサー

id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492010/11/18 08:43:35

ポイント50pt

方法はいろいろあります

以下、推奨される順番に記述してあります

 

【1】データベース作成時に文字コードを指定

CREATE DATABASEに文字コードを指定する項目があります

http://dev.mysql.com/doc/refman/5.1/ja/create-database.html

http://dev.mysql.com/doc/refman/5.1/ja/charset.html

 

最初からクライアント側と文字コードを合わせてデータベースを作成しておけば、

データをやりとりする際の文字コード変換処理が不要になるため応答は当然ながら早くなります

以後はCREATE DATABASE時に文字コードを指定することを常に意識するようにしましょう

(そちらの状況はわかりませんが、データベースを新たに作り直したほうが楽かもしれないです)

 

 

【2】データベース接続直後にクライアントの文字コードを知らせる

前述したようなことはレンタルサーバなどでは無理な場合もあるでしょうし、

既に構築されているものをおいそれと変更できない場合もあることでしょう

そのような場合は下記のようなことが可能です

 

(1)phpのmysql_set_charsetを用いる(こちらを推奨)

$con = mysql_connect(省略);
mysql_selectdb(省略);
mysql_set_charset( 文字コード, $con ); 

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

 

(2)SQLを用いる

SET NAMES='文字コード';

http://dev.mysql.com/doc/refman/5.1/ja/charset-connection.html

 

 

【3】MySQLの環境変数で指定

デフォルト設定を変えることもできますが、すべての接続に影響を与えてしまうので、あまり行いません

http://dev.mysql.com/doc/refman/5.1/ja/charset-connection.html

id:ReoReo7

ご丁寧にありがとうございます。

上記コメントと重複するのですが、utf-8に統一するのがよさそうに思います。

紹介していただいたコードの例も大いに参考にしていきたいと思います。

【2】-1の範囲内で可能のように思っていますので、今後改訂を行っていきたいと思います。ありがとうございました。

2010/11/18 21:34:56

その他の回答(1件)

id:Galapagos No.1

Galapagos回答回数963ベストアンサー獲得回数892010/11/18 07:24:50

ポイント25pt

PHPの内部コードは何でしょうか? UTF-8, SJIS, EUC-JP?

一方、MySQLの内部文字コードは何に設定していますか?

おそらく両者が違うために文字化けを起こしているのだろうと思います。

ご確認ください。


MySQLでデータベースを作成する際は、ふつう、CREATE DATABASE 構文で文字コードを指定してやります。

詳しくは「MySQL の日本語文字の扱いは OS に依存しないのか? 」を参照してください。

id:ReoReo7

ありがとうございます。方針としてはUTF-8に統一していきたいと思います。

理由は、たまにサイトにアクセスするとアドレスバーにutf-8という文字列が入っているので、自動判別されたブラウザの文字列がそうでブラウザから帰ってくる文字コードもUTF-8と推測していることと、何よりMySQLがUTF-8のようだからです。

PHP;

default_charset=no value,no value(local,master)

mbstring.http_output=pass,pass

mbstring.internal_encoding=utf-8

スクリプトを保存する文字コード;SJISからUTF-8に変更しました。

MySQL;UTF-8 Unicode (utf8)

となっています。

default_charset=utf-8,utf-8

mbstring.http_output=utf-8,utf-8

とすれば良いんでしょうか、トライしてみます。ありがとうございました。

追記:

コメント欄のようにphp.iniを設定したのですが、MySQLに書き込む際に乱れてしまいます。

データベースにSHOW VARIABLES LIKE 'char%';を投げると

Variable_name Value

character_set_client utf8

character_set_connection utf8

character_set_database ujis

character_set_filesystem binary

character_set_results utf8

character_set_server utf8

character_set_system utf8

character_sets_dir /usr/local/mysql-src-5.1.22/share/mysql/charsets/

が出力されます。

これは、データベースに格納されるべき文字列がujisだからダメなんでしょうか?

追加質問となりますが、よろしくお願いします。

2010/11/18 22:12:07
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492010/11/18 08:43:35ここでベストアンサー

ポイント50pt

方法はいろいろあります

以下、推奨される順番に記述してあります

 

【1】データベース作成時に文字コードを指定

CREATE DATABASEに文字コードを指定する項目があります

http://dev.mysql.com/doc/refman/5.1/ja/create-database.html

http://dev.mysql.com/doc/refman/5.1/ja/charset.html

 

最初からクライアント側と文字コードを合わせてデータベースを作成しておけば、

データをやりとりする際の文字コード変換処理が不要になるため応答は当然ながら早くなります

以後はCREATE DATABASE時に文字コードを指定することを常に意識するようにしましょう

(そちらの状況はわかりませんが、データベースを新たに作り直したほうが楽かもしれないです)

 

 

【2】データベース接続直後にクライアントの文字コードを知らせる

前述したようなことはレンタルサーバなどでは無理な場合もあるでしょうし、

既に構築されているものをおいそれと変更できない場合もあることでしょう

そのような場合は下記のようなことが可能です

 

(1)phpのmysql_set_charsetを用いる(こちらを推奨)

$con = mysql_connect(省略);
mysql_selectdb(省略);
mysql_set_charset( 文字コード, $con ); 

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

 

(2)SQLを用いる

SET NAMES='文字コード';

http://dev.mysql.com/doc/refman/5.1/ja/charset-connection.html

 

 

【3】MySQLの環境変数で指定

デフォルト設定を変えることもできますが、すべての接続に影響を与えてしまうので、あまり行いません

http://dev.mysql.com/doc/refman/5.1/ja/charset-connection.html

id:ReoReo7

ご丁寧にありがとうございます。

上記コメントと重複するのですが、utf-8に統一するのがよさそうに思います。

紹介していただいたコードの例も大いに参考にしていきたいと思います。

【2】-1の範囲内で可能のように思っていますので、今後改訂を行っていきたいと思います。ありがとうございました。

2010/11/18 21:34:56
  • id:ReoReo7
    以下をphp.iniとしてphpのあるフォルダに置くと、出力まではうまくいきました。
    MySQLには今からテストしてみます。
    ## UTF8を標準の文字コードとする
    mbstring.language = Japanese
    mbstring.internal_encoding = UTF-8
    mbstring.http_input = auto
    ;mbstring.http_output = UTF-8
    mbstring.detect_order = auto
  • id:ReoReo7
    CORESERVERはコントロールパネルから新規DBを作るのですが、
    その際にEUC-JP,SJIS,UNICODEしか選べないことが判明しました(!)。

    また、携帯ブラウザでも見るのでSJISが標準と期待されているようです。
    したがって、全てのコードをSJISに統一する方針でやっていきたいと思います。
  • id:ReoReo7
    以下でいけました。
    mysql_set_charset("sjis", $con);

    ブラウザから:?(場合によって違う?日本語入力した場合、SJISになる?)

    PHP読み取り:auto(?SJIS?)
    内部:SJIS

    MySQL:SJIS

    で、DBからの読み出しもOKでした♪

    できればDBもSJISで統一したいのですが、ちょっとDB作るのが大変なので
    しばらくは違和感ありますが
    mysql_set_charset("sjis", $con);
    でいきたいと思います。

    ありがとうございました。他に何かあれば教えて下さい。
  • id:windofjuly
    うぃんど 2010/11/19 00:47:28
    【1】phpで必要な文字化け対策は大きくわけると以下の2点となります
     
    (1)テキスト処理する場合に文字コードを間違わないこと
    Galapagos さんは「PHPの内部コード」という表現を使っておられますが、
    phpは「テキストをコードのままで扱う」ので「内部コード」などというものは存在しません
    php.iniなどで行う設定は「どのような文字コードとして取り扱うか?」の指定になります
     
    (2)phpがMySQLとブラウザのそれぞれで文字コードに差異が生じないようにすること
    質問がMySQLのほうに向いていたのでMySQLに対して文字コードを指定する方法を挙げましたが、
    ブラウザに対しても「これから送るものはUTF-8ですよ」といった具合に明示的に知らせる事を意識しておかなければならず、
    headerやMETAタグによる文字コード指定についてもあわせて学ぶ必要があるのかもしれません

      
    【2】携帯もUTF-8への対応が進んでいるので、サーバはUTF-8で統一しておいて、携帯への出力だけSJISにするという対応はありですよ
    CORESERVERに特化しますとサーバ内部でのやりとりは下記のような設定になります
    (1)UNICODEを選べばそれがUTF-8です
    (2)php.iniは下記の3点を確認しておけば特に困ることはないでしょう
    default_charset = UTF-8
    mbstring.language = neutral
    mbstring.internal_encoding = UTF-8
  • id:ReoReo7
    コメントありがとうございます。
    知らない点がいっぱいありました。

    SJISへの統一は、特殊な状況に全体を合わせていくという感じで違和感がありました。
    それで、ご指摘の事項を考慮するとやはりUTF-8での統一が良さそうだと思い直しました。

    が...何とか今はSJISでスタートできる状況に持っていったので、とりあえず用を成しました。
    しかし、将来的にはUTF8で行こうと思います。
    学びながら作って、あとから機能追加する点が出てきて、設計よりスピード重視だったので、
    関数と関数の関係等、コードがやや汚くなってきています。

    個人利用なのでこれでもいけますが、、、IEの操作をスクレイピング等にして高速化したバージョン2を自分用にリリースしたいと思います♪

    サーバーはUNICODEで良いのですね。
    php.iniの設定についてのコメントもとても役に立ちました。
    そういう考え方をすれば良いんですね。
  • id:ReoReo7
    皆様のお陰様でプログラムが動きました。感動です。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません