- ベストアンサー
データが文字化けする!PHPとMySQLの勉強を始めた初心者が困っています
- PHPとMySQLの勉強を始めた初心者が、データが文字化けする問題に直面しています。入力フォームからデータを入力すると、phpMyAdminで確認すると文字化けしてしまいます。
- SHOW VARIABLESで確認したところ、character_set関連の設定はutf8となっています。入力フォームのページもUTF-8で書かれています。
- 初心者向けの関連書籍として「Head First PHP&MySQL」を勧められています。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
接続のオブジェクトを生成する際、既定の動作では使用するライブラリに基づいて接続の文字コードセットが設定されるので、ご利用中のサーバにおけるライブラリの規定値として latin1 が設定されたものと思われます。ライブラリのコンパイル時に明示的な指定がない場合、latin1 となるようです。 my.cnf 等の設定を読み込ませたい場合は、先にご案内したとおり、各種設定を施した後に接続のオブジェクトを生成してください。 ホームディレクトリに個人用設定として .my.cnf を作っておき、これを読み込むようにすると、他の環境でも設定を利用できて便利です。 この手順で接続の文字コードセットを設定することで、後に必要となるエスケープ処理において、確実な動作結果を得ることが出来るようになります。 本は書店で実際に手に取り、納得のいくものを購入されるのが良いと思いますよ!
その他の回答 (6)
- lunarx
- ベストアンサー率39% (16/41)
>自分のPCの方にもxamppを入れて、まずそこでテストして今度はレンタルサーバーでやってみるという感じでやっております。 でローカルでの挙動は?
お礼
ローカルの方は、何とか自力で文字化けしないように出来ていたのですが、皆様のアドバイスのおかげで何とか解決できました。 どうもお騒がせしました。
おそらく 2章あたりのコードだろうと思いますから、MySQL 改良版拡張モジュールを使っているという前提でお話させていただきます。 例の通りに進めていけば、$dbc という変数名で MySQL サーバへの接続を表すオブジェクトが取得できるはずです。これを使って現在の文字セット名を知る方法があります。 http://jp.php.net/manual/ja/mysqli.get-charset.php まずはこれを試して、charset が期待するものかどうかを確認してみてください。おそらく latin1 です。 期待するものでなかった場合、これを設定する方法が次のものです。 http://jp.php.net/manual/ja/mysqli.set-charset.php どちらも手持ちの本と照らし合わせて、手続き型で進めておくとよいでしょう。 マニュアルサイトでは、$link となっているものが、$dbc です。 接続後に毎回このような設定をすることが面倒であると感じる場合、接続に関する追加オプションを設定することで、接続時に希望する設定を施すことができます。 http://jp.php.net/manual/ja/mysqli.init.php http://jp.php.net/manual/ja/mysqli.options.php http://jp.php.net/manual/ja/mysqli.real-connect.php
補足
samchay さま 大変ありがとうございます。 おっしゃる通り2章のコードです。 お教えいただいた、mysqli_set_charset で確認してみたところ、こちらもおっしゃる通り latin1になっておりました。 まだここまでしか出来ていないのですが、嬉しかったので、取り敢えずご報告させていただきました。 お教えいただいた解決方法で解決後改めてご報告させていただきたいと思います。 * 自分のPCの方では、何とか文字化け解消できたので、レンタルサーバでも何とかなるかと思ったんですが. 結局、書いてあるままにとか、言われるままにやってるだけで、自分で理解できてないからこういうことで苦しむんでしょうね. この辺りのことを勉強するのに良い本などご存じないでしょうか?
- yyr446
- ベストアンサー率65% (870/1330)
PHP側の設定はどうなってるでしょうか? レンタルサーバーだとphp.iniの中身を直接見たり、変更したり 出来ない場合がありますけど、 <?php print_r(ini_get_all()); ?>で一度確認されてはどうでしょう。 文字化け原因がらみは、 mbstring.internal_encoding mbstring.http_input mbstring.http_output mbstring.encoding_translation 等、mbxxxxの設定値がらみの場合が多いです。 php.iniはたぶん変更できないでしょうが、直接php関数で設定できます。 echo mb_internal_encoding(); mb_internal_encoding("UTF-8"); mb_http_input("UTF-8"); mb_http_output("UTF-8"); 等
お礼
おかげさまで、何とか文字化けを解消できました。 今回は有り難うございました。
補足
yyr446 さま どうも有り難うございます。 遅くなりましてすみません。 php.iniの中身、phpinfo() Configuration File (php.ini) Path で調べてみたのですが、自分のレンタルサーバで確認してみようとしたのですがそれらしいフォルダが見つかりませんでした。 これはphp.iniの中身を直接見たり、変更したり出来ないと理解するべきなのでしょうか? <?php print_r(ini_get_all()); ?>で確認してみました。 mbstring.internal_encoding mbstring.http_input mbstring.http_output mbstring.encoding_translation は、 [mbstring.internal_encoding] => Array ( [global_value] => UTF-8 [local_value] => UTF-8 [access] => 7 ) [mbstring.http_input] => Array ( [global_value] => auto [local_value] => pass [access] => 7 ) [mbstring.http_output] => Array ( [global_value] => pass [local_value] => pass [access] => 7 ) [mbstring.encoding_translation] => Array ( [global_value] => 0 [local_value] => 0 [access] => 6 ) となっておりました。
レンタルサーバーの中には、データベースやブログを自動で インストールする機能を持っているところがあります。 これが結構くせ者で、フォントの設定がぐちゃぐちゃだっ たりします。特に海外のレンタルサーバーはひどかった。 いちいち手動で直していたのですが、インストールする たびに直すのが面倒で、海外のレンタルサーバーはやめて しまいました。 あと、可能性があるのは、エディターがUTF-8に対応して いるかどうかです。 この文字コードの実用性のある理解に1年もかかるわけが ありません。一週間もあれば習得できますよ。がんばって ください。
補足
skanchan さま どうも有り難うございます。 エディタはK2Editorというのを使っており、UTF-8 使えるようになっています。 設定は「どこの何を確認すると良いのか」、「どう直すと良いのか」さっぱりの状態です。 この辺りを理解するのに何を勉強して良いのやら、検索するにも何を検索すると良いのやら. 色々と検索してみたものの時間ばかり無駄にかかってしまいなかなか良い結果を得られていません。 何かお勧めのサイトや本などご存じないでしょうか?
付録ii と付録iii を始めにやらないと話が進まない本ですね! 感じることが出来たと思うのですが、結局 PHP がどうとかではなく、適切な環境を準備できるかどうかが大事なのです。データベースや、Web サーバ、メールの送受信サーバや、文字コードセット、OS によるファイルの扱い方など、先にわかってないといけないことが沢山あります。名前解決の方法とかも大事ですね。 その本こそが最後の砦です。それより簡単な本は大事なところが抜けた本だと思いますよ。 Linux Apache MySQL PHP の順番で覚えるのが一番の近道です。頑張れば来年の今頃には文字化けしなくなりますよ!
補足
自分のPCの方でXAMPPを入れてやった時は付録を見ながら&検索であれこれ試しているうちに何とか文字化け解消したのですが、良く分からないのにレンタルサーバであれこれやる訳にも行かず. samchayさんのおっしゃる通り、本自体は分かりやすくて、良いのですが、その前の環境設定が大変そうです. Linux Apache MySQL PHP ですか. 道のりは激しく険しそうですね.
- lunarx
- ベストアンサー率39% (16/41)
>サーバーは、phpの勉強をするために coreserver というところのレンタルサーバを契約しました。 勉強で外部のサーバをまず使わない。 ローカルに環境を構築してそこで勉強すること。
補足
どうも有り難うございます。 自分のPCの方にもxamppを入れて、まずそこでテストして今度はレンタルサーバーでやってみるという感じでやっております。
お礼
今回は大変ありがとうございました。 取り敢えず、お教えいただいた http://jp.php.net/manual/ja/mysqli.set-charset.php で、文字化け解消いたしました。 $link を $dbc へなど 本当に細かい点までお教えいただき大変助かりました。 本当は、その先の方が出来てからお礼をと思っていたのですが、初心者で分からない点が多く、少しずつ調べながらでは遅くなってしまいますので、ここでおり申し上げたいと思います。 本当にありがとうございます。 *書籍も自分で確認してから買えると良いのですが、近くの本屋では専門書が少なく、仕方なくAMAZON などで、コメントなどを頼りに買って良く失敗しております。 それでは失礼します。