電子書籍の厳選無料作品が豊富!

お世話になります。

PHPでmysqlのデータをhtmlで表示するソースを組んでいます。
初心者なもので、サンプルを見ながら組んでいるのですが、
そのサンプルがmysql_queryなどを使っていました。

しかし、今は推奨されず、mysqli_queryなどを使うとか。

そこで、単純にiを付け加えただけなのですが、そう簡単に
行きませんでした。

どの部分をどのように修正すればよいのかを教えてください。

-------------------------------------------------

<?php header("Content-Type:text/html;charset=SHIFT_JIS"); ?>
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<?php
$srv = "localhost"; // サーバー名
$id = "xxxxx"; // ユーザーID
$passwd = "xxxxx"; // パスワード
$dbn = "sample"; // データベース名
$sql = "SELECT * FROM sample1"; // SQL文

// データベースに接続する
$db = mysql_connect($srv,$id,$passwd);
mysql_select_db($dbn,$db);
$rs = mysql_query($sql,$db);
$num = mysql_num_fields($rs);

//--- テーブルのレイアウト --- 開始 ----------------------->
print("<TABLE border='1'><TR>");
for($i=0; $i<$num; $i++) {
print("<TH>".mb_convert_encoding(mysql_field_name($rs,$i),"SJIS","EUC-JP")."</TH>");
}
print("</TR>");
while($row = mysql_fetch_array($rs)) {
print("<TR>");
for($j=0; $j<$num; $j++) {
print("<TD>".mb_convert_encoding($row[$j],"SJIS","EUC-JP")."</TD>");
}
print("</TR>");
}
print("</TABLE>");
mysql_free_result($rs);
mysql_close($db);
//--- 終了 --->
?>
</BODY>
</HTML>

----------------------------------------------

他サイト様からの引用ですが、何卒よろしくお願いいたします。

A 回答 (4件)

>書き直したソースには、utf8で記述してあると思いますが…。



書き直したソースにあるのは「DSNでのcharset指定」がutf8という部分だけです。MySQLサーバに「データをutf-8でください」と頼んでいるだけですね。headerでのcontent-typeの出力については何の(修正した)記述もありません。

MySQLからutf-8で受け取ったデータをそのまま出力していても、httpレスポンスでcharsetをSJISに指定していますからブラウザはShift_JISだと思って処理します。つまり確実に化けます。ブラウザが適用しているエンコードを確認してください。

いっそheader出力がない方が(ブラウザの自動判別にまかせた方が)化けない可能性が高いです。が、どうせやるなら

<?php header("Content-Type:text/html;charset=utf-8"); ?>

に書き直してください。

この回答への補足

またまた説明が不足していたとも思いますが、
php(html)ベースの文字コードはもちろんutf-8で保存してあります。

ブラウザの文字コードがutf-8のときは、一般のテキスト部分が正しく表示され、
データベースから読み取った部分が『????』になり、
エンコードを『Shift-JIS』にすると、一般のテキストが文字化けを起こし、
データベースの部分だけが正しくひょうじされまた。

その為、ブラウザでの認識する文字コード云々は、今回は関係ありません。

また、記述したソースは問題の部分のみを記述したものであり、phpのソース全体を
記載したわけではありません。

>>希望は、文字列は『utf-8』で表示させようとしています。

>であれば、どう考えても

>><?php header("Content-Type:text/html;charset=SHIFT_JIS"); ?>

>これはマズイですよね。

この部分は、弐回目に記述したソースには含まれていないのですが、
単に弐回目のソースを見ていなかっただけでは?

大変申し訳ありませんが、論点がずれているようです。

補足日時:2014/01/31 15:54
    • good
    • 0

>希望は、文字列は『utf-8』で表示させようとしています。



であれば、どう考えても

><?php header("Content-Type:text/html;charset=SHIFT_JIS"); ?>

これはマズイですよね。

この回答への補足

書き直したソースには、utf8で記述してあると思いますが…。

補足日時:2014/01/31 09:47
    • good
    • 0

>日本語の文字列が


>全て『?』で表示されてしまいます。

DSNでクライアント(phpスクリプト)の文字セットを指定していますか?

http://php.net/manual/ja/ref.pdo-mysql.connectio …

提示されたソースであれば、下記のような接続になっているハズですが如何でしょうか

$pdo = new PDO("mysql:host=localhost;dbname=sample;charset=sjis", "xxxx", "xxxx");

#もしこれで化けるようだったら、phpのバージョンを書いてください


可能であればShift_JISなど使わず、utf-8(DSNではcharset=utf8)。で書いた方がいいとは思いますが・・・

この回答への補足

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

説明不足で申し訳ありません。

希望は、文字列は『utf-8』で表示させようとしています。

my.iniの修正だとは思うのですが、古いバージョンのmysqlの設定しか
やったことがないので、詳しくは解りません。

行ったことといえば、データベースの照合順序を『utf8_unicode_ci』に
したことくらいです。

ちなみに、修正したソースコードは、

<?php

$dsn = 'mysql:dbname=catsule;host=localhost;charset=utf8;';
$user = 'root';
$password = '';

try{
$dbh = new PDO($dsn, $user, $password);

print('接続に成功しました。<br>');

//$dbh->query('SET NAMES sjis');

$sql = 'SELECT * FROM data';

foreach ($dbh->query($sql) as $row)
{
print($row['id']);
print($row['name'].'<br>');
}
}catch (PDOException $e){
print('Error:'.$e->getMessage());
die();
}

?>

で、PHPのVerは5.4.22です。

お手数をおかけしますが、よろしくお願いいたします。

補足日時:2014/01/30 15:26
    • good
    • 0

引数の順番はMysql関数とMysqli関数で真逆になっているものが多いので、マニュアルですべて確認してください。

目次はオブジェクト指向型が見出しになっているので注意を。

Mysqli
http://jp2.php.net/mysqli/

但し、単に手続き型のMysqliに書き換えるよりはオブジェクト指向の方が推奨されるでしょう。(マニュアルもそちらが主体的になっていますし)

さらに、オブジェクト指向で書くならばMysqliよりもっと扱いやすいPDOというものもあります。詳しくは下記にて。

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

この回答への補足

早速のご回答、ありがとうございます。

PDOを使用してみたところ、簡単に取得するところまでできました。

しかし、私の方の設定が間違っているのか、日本語の文字列が
全て『?』で表示されてしまいます。

これはMySQL側の設定だということは解るのですが、XAMPPが1.8になってから
(説明し忘れましたが、XAMPP1.8.xxを使用しています)、my.iniの設定も
変わり、どのように設定するのかが解らなくなってしまいました。

この質問内で聞く内容とは違う竹、補足として付け加えましたが、
もし続けてお教えいただけるのならば幸いです。

よろしくお願いいたします。

補足日時:2014/01/30 14:19
    • good
    • 0

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