「これはヤバかったな」という遅刻エピソード

PHPによるwebアプリケーションスーパーサンプルという参考書のプログラム(p552)でどうしても実行できないものがあります。

やりたいことはMySQLに接続してデータを表示させるというものです。数字であるIDと年齢は表示されるのですが、文字である名前と出身地のところが「???」で表記されてしまいます。

何度も参考書のソースプログラムを見直したのですがどこが違うのか分かりません。以下は原因がありそうなコードの抜粋です。(抜粋なのでエラーと関係なさそうなコードは途中でも省略しています。)

よろしくお願いします。

idはID、namは名前、preは出身地、agは年齢です。


//文字コード
$enc_disp = "EUC-JP";
$enc_db = "EUC-JP";
//データの文字コードを変換する
function cnv_enc($string, $to, $from){
//文字コードを変換する
$det_enc=mb_detect_encoding($string, $from.",". $to);
if($det_enc and $det_enc != $to){
return mb_convert_encoding($string, $to, $det_enc);
}
else{
return $string;
}
}


//データを取り出す
$sql="SELECT id,nam,pre,ag FROM table1 ORDER BY id";
$res=mysql_query($sql,$conn) or die("データ抽出エラー");





//取り出したデータを表示する
echo "<table border=\"1\">";
echo "<tr>";
echo "<td>ID</td>";
echo "<td>名前</td>";
echo "<td>出身</td>";
echo "<td>年齢</td>";
echo "</tr>";
while($row=mysql_fetch_array($res,MYSQL_ASSOC)){
echo "<tr>";
echo "<td>".$row["id"]."</td>";
echo "<td>".cnv_enc($row["nam"], $enc_disp, $enc_db)."</td>";
echo "<td>".cnv_enc($row["pre"], $enc_disp, $enc_db)."</td>";
echo "<td>".$row["ag"]."</td>";
echo "</tr>";
}
echo "</table>";

A 回答 (2件)

mysqlに


show variables like "char%";
をかけるとどのような結果が出るでしょうか。

参考URLはUTF-8への設定ですが、自分も同じように文字化けした時はこれで解決しました。
ページ下の方が下記の部分が解決策です。

/etc/my.cnf

[mysqld]
default-character-set=utf8
skip-character-set-client-handshake

utf-8をeuc-jpにすれば解決しそうですがどうでしょうか。

参考URL:http://wota.jp/ac/?date=20061011
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

そもそもこんな関数使う必要なかったみたいです。
mysql_query("set names utf8",接続リソース)でうまくできました。

mysqldのデフォルトをutf8にするということは大変参考になりました。ありがとうございました。

お礼日時:2012/03/06 22:09

お使いのphpとMySQLのバージョンはいくつでしょうか?MySQLは4.0までと4.1以降で大きく変わりました。



今現在はmysql_set_charset()でクライアントの文字セットを指定すれば、あとは自動で変換されます(自分でさらに変換すると文字化けします)。

http://php.net/manual/ja/function.mysql-set-char …


#このあたりは書籍の弱い部分なので、自分で最新の情報を収集してください。

この回答への補足

XAMPPでphpとmysqlをインストールしたのですが、XAMPPのほうに問題があるのですかね?
ApacheFriends XAMPP version 1.7.7です。

いろいろ試していますが、全然できません。助けてください。

補足日時:2012/02/16 13:40
    • good
    • 0
この回答へのお礼

C:\Windows\System32>mysql --version
mysql Ver 14.14 Distrib 5.5.16, for Win32 (x86)

C:\Windows\System32>php --version
PHP 5.3.8 (cli) (built: Aug 23 2011 11:50:20)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies

というバージョンらしいです。このバージョンだと上記のようなコードではいけないのですかね?
まだ、PHPを始めたばかりで基礎もままならない状態なので最新の情報を収集するという作業に非常に苦労しています。。

お礼日時:2012/02/16 12:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報