こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

WAMP ローカル環境で突然文字化けするように

WAMP初級者です。
いままでPEAR::DBを使って作っていたサイトがあり、PDOを使うように修正をしているのですが、いろいろ試しても画面が真っ白になってしまうようになりました。
そこで、いったんPDOを理解するために、下記のような小さなプログラムを作ってしっかり理解してから、取り組もうといろいろ試しましたが、やっぱり画面が真っ白になってしまいました。
なので、今度は念のため、単純にPOSTで受け取った情報を単純に表示するだけのコードでためしたところ、今度はなぜか文字化けするようになってしまいました。。
「???」のような表示ではなく、「・・・」のような表示です。
いままでPEAR::DBを使っていたサイトは(過去に文字化けで苦労した時代はありましたが)いまはちゃんとUTF-8で統一したので、文字化けは解消されています。
どこか設定をいじった記憶もなく、突然初歩的なPHPも動いてくれなくなってしまって途方にくれています。PEAR::DBを使ってちゃんと動いていたサイトは、文字化けしません。

今回やったことのどこが悪いのか、路頭にまよっています。
どなたかヒントをいただけないでしょうか?
環境はPHP5.2(古いので、この件が片付いたらバージョンアップする予定です)、Windowsです。

●サンプルで作ったHTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<form action = "for_pdo_test2.php" method="post">
キーワード:<input type="text" name="keyword">
<input type="submit" name="exec" value="検索">
</form>
</body>
</html>


●下記がfor_pod_test2.phpです
(コメントアウトしている箇所がPDOの動作確認用につくったものです)

<?php
header("Content-Type:text/html;charset=UTF-8");
error_reporting(4);

$keyword=$_POST['keyword'];

/*

try{
$query="SELECT * FROM book where Name like :name";

$connection=new PDO('mysql:host=localhost;dbname=book_db','root','root');
$stmt=$connection->prepare($query);
$stmt->bindValue(":name","'%$keyword%'",PDO::PARAM_STR);
$stmt->execute();

while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
print($result['BID']);
print($result['Name'].'<br>');
}
}catch(PDOException $e){
print('Error:'.$e->getMessage());
die();
}

*/

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>

<?php echo "aaa"; ?><br/>
<?php echo $keyword; ?>

</body>
</html>

以上です。
検索をして飛んだ先で

aaa
・・・

と表示されてしまいます。
よろしくお願いいたします。

投稿日時 - 2013-11-22 02:26:15

QNo.8356975

すぐに回答ほしいです

質問者が選んだベストアンサー

php.iniを編集して

display_errors = On
error_reporting = E_ALL | E_STRICT

にすればすべてのエラーが表示されます。

(再掲) PHPでデータベースに接続するときのまとめ
http://qiita.com/mpyw/items/b00b72c5c95aac573b71

こちらで説明していますが、文字化けの原因はMySQL側の文字セットを指定していないことと思われます。

WindowsでPHP5.3.6以前ならば望ましくないですがやむを得ないので

$connection->query('SET NAMES utf8');

を使ってください。

投稿日時 - 2013-11-22 04:35:06

補足

ご回答ありがとうございます。
$connection->query('SET NAMES utf8');
を挿入したら表示されるようになりました。

本件は別の環境で秀丸か何かでコードを作成したので、BOMも悪影響をおよぼしていて話をややこしくしていたたようです。
秀丸は大丈夫と思っていましたが、記憶にないですが別のものを使ってしまったかもしれません。
そこで、KanjiTranslatorで変換をいろいろ試してBOMあり状態で文字化けしなくなったり、想定と違う動作をしたので、改めていつもの開発環境で書き直したらキレイに表示されるようになりました。
そこで、改めてコメントアウトをはずし、PODの練習に着手、
$connection->query('SET NAMES utf8');
がとどめになりました。

ところで、php.iniにはもともと
display_errors = On
error_reporting = E_ALL & ~E_NOTICE
となっていて、
後者を
error_reporting = E_ALL | E_STRICT
と変えてみても変化はなく、何もエラーを表示してくれませんでした。
これはやはりPHPのバージョンによる問題なのでしょうか。もしお分かりでしたらご教授ください。

投稿日時 - 2013-11-23 02:39:09

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

php.ini編集後にApacheは再起動されましたか・・・?適用するには再起動が必要です。

display_errors = On
error_reporting = E_ALL | E_STRICT

はあらゆるバージョンで全てのエラーを表示する設定なので、これで何も表示されなければエラーが起きていないということになります。。

投稿日時 - 2013-11-23 03:40:33

お礼

ありがとう御座います。いろいろ試してエラーが表示されることを確認しました。
また、$connection->query('SET NAMES utf8');
をつければきちんと結果が表示され、なければ何も表示されないのに違和感をかんじていましたが、そもそも文字コードの指定がおかしいです、というようなエラーなんかなく、ちゃんと自分で指定しなきゃいけないんだと理解しました。
初歩的ですが大変勉強になりました。

投稿日時 - 2013-11-25 00:42:36

あなたにオススメの質問