- 締切済み
mysqlからmysqliへの変更点
お世話になります。 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> ---------------------------------------------- 他サイト様からの引用ですが、何卒よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- shimix
- ベストアンサー率54% (865/1590)
>書き直したソースには、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"); ?> に書き直してください。
- shimix
- ベストアンサー率54% (865/1590)
>希望は、文字列は『utf-8』で表示させようとしています。 であれば、どう考えても ><?php header("Content-Type:text/html;charset=SHIFT_JIS"); ?> これはマズイですよね。
補足
書き直したソースには、utf8で記述してあると思いますが…。
- shimix
- ベストアンサー率54% (865/1590)
>日本語の文字列が >全て『?』で表示されてしまいます。 DSNでクライアント(phpスクリプト)の文字セットを指定していますか? http://php.net/manual/ja/ref.pdo-mysql.connection.php 提示されたソースであれば、下記のような接続になっているハズですが如何でしょうか $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です。 お手数をおかけしますが、よろしくお願いいたします。
引数の順番は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の設定も 変わり、どのように設定するのかが解らなくなってしまいました。 この質問内で聞く内容とは違う竹、補足として付け加えましたが、 もし続けてお教えいただけるのならば幸いです。 よろしくお願いいたします。
補足
またまた説明が不足していたとも思いますが、 php(html)ベースの文字コードはもちろんutf-8で保存してあります。 ブラウザの文字コードがutf-8のときは、一般のテキスト部分が正しく表示され、 データベースから読み取った部分が『????』になり、 エンコードを『Shift-JIS』にすると、一般のテキストが文字化けを起こし、 データベースの部分だけが正しくひょうじされまた。 その為、ブラウザでの認識する文字コード云々は、今回は関係ありません。 また、記述したソースは問題の部分のみを記述したものであり、phpのソース全体を 記載したわけではありません。 >>希望は、文字列は『utf-8』で表示させようとしています。 >であれば、どう考えても >><?php header("Content-Type:text/html;charset=SHIFT_JIS"); ?> >これはマズイですよね。 この部分は、弐回目に記述したソースには含まれていないのですが、 単に弐回目のソースを見ていなかっただけでは? 大変申し訳ありませんが、論点がずれているようです。