- ベストアンサー
さくらサーバでの文字化け
- さくらサーバでの文字化け問題の解決方法とは?
- さくらサーバでの文字化け問題に関する調査結果
- さくらサーバの文字化け問題の対策をまとめました
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
PDO を使って MySQL と接続する場合、固有のオプションを使って文字セットを指定します。 指定できるタイミングは接続時のみです。他の拡張と違い、接続後の変更は出来ません。 コンストラクタの第四引数に次のようなオプションを与えてみてください。 $driver_options = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"); 「SET NAMES」自体が悪いのではなく、正しく設定しないことが色々な問題を引き起こすということです。今回ご案内する方法は、正しい設定方法です。安心したい場合は PDO のソースを読むとよいでしょう。 以前、似たような質問に回答させていただきました。過去の回答をご覧いただけるように設定しておりますので、よろしければそちらもご覧ください。
その他の回答 (2)
- yuu_x
- ベストアンサー率52% (106/202)
my.ini がいじれないので、少々面倒ですが、 $db = new PDO( "mysql:dbname={$dbname};host={$host};" , $user , $password , array( PDO::ATTR_EMULATE_PREPARES => false // サーバサイドが使えるなら使う ,PDO::MYSQL_ATTR_READ_DEFAULT_FILE => 'xx/my.conf' // 読める場所ならどこでも ,PDO::MYSQL_ATTR_READ_DEFAULT_GROUP => 'client' ) ); // 念のため $db->query("SET character_set_server = utf8"); ==== my.conf =========================== [client] default-character-set=utf8 ======================================== PDO::MYSQL_ATTR_READ_DEFAULT_(FILE|GROUP) は PDO の設定なので、MySQL に任せるなら SET NAMES で代用してもかまわない。 必要に応じて $db->query('SET character_set_results=sjis'); なんてことも可能。 変換の責任を誰が持つかという話になるので、参考までに。 $db->query('SHOW VARIABLES'); var_dump($db->fetchAll(PDO::FETCH_ASSOC));
お礼
ご回答ありがとうございます。 array( PDO::ATTR_PERSISTENT => true, PDO::MYSQL_ATTR_INIT_COMMAND => 'SET CHARACTER SET utf8;' 上記の形で解決できましたのでmy.confを使わなくても済みました ご回答ありがとうございます。
(1)DBの接続時に、最初からSJISで受け取りを指定すればいいことでは? DBが勝手に文字コードの('SJIS-win' <--> 'UTF-8')変換をしてくれます。 (2,別解)一度UTF8で全部書き出す方法 ob_start,ob_get_cleanなどを使って バッファに コンテンツを全部だしたあと 変数に渡してそれを最後に全部 SJIS変換する手もあります。 プログラムの開始時 ob_start 終了時に print mb_convert_encoding( ob_get_clean , 'SJIS-win', 'UTF-8' ); これを1回で UTF8のページを , SJISの出力にすることができます。 受け取り時には変換がいりますけどね
お礼
(1)につきましては試そうとしたのですがPDOでどこで指定すればよいかわかりませんでした^^; (2)につきましてはモバイルサイトでも可能でしょうか?調べましたところ処理が高速化するという記事を見かけたことがあるのですが是非利用してみたいと思います。 ご回答ありがとうございます。
お礼
ありがとうございます! 何とか昨晩、同様の解答を見つけられました。 結論 array( PDO::ATTR_PERSISTENT => true, PDO::MYSQL_ATTR_INIT_COMMAND => 'SET CHARACTER SET utf8;' を第4引数に入れております。 一番先にご回答いただけましたのでベストアンサーとさせていただきました! また何かございましたら宜しくお願い致します。