php5,MySQL5で文字化けが起こる

このQ&Aのポイント
  • php5,MySQL5環境での文字化けについて説明します。
  • php5,MySQL5環境で漢字が正しく表示されない問題が発生しています。
  • 具体的な原因や解決策を知りたいです。
回答を見る
  • ベストアンサー

php5,MySQL5で文字化けが起こる

環境:php5,MySQL5,XP MySQL5は、インストール時にsjisを指定。 php.iniもmbstring.internal_encoding = SJIS ドスプロンプトでSelect文を発行すると漢字で表示されます。 $dbtype = "mysql"; $sv = "localhost"; $dbname = "*****"; $user = "root"; $pass = "*****"; // 文字コード $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; } } // データベースに接続する $dsn = "$dbtype://$user:$pass@$sv/$dbname"; $conn = DB::connect($dsn); $sql = "SELECT * FROM A"; $res = $conn->query($sql); →この後、SQLの内容をIEで表示させると ”2 Web?? 002 ??????????????”の様に テーブルの中の漢字の部分だけが??????で表示されます。 ヒント、参考になるサイトなど、教えていただけると幸いです。

  • idek
  • お礼率47% (170/361)
  • PHP
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

cnv_enc()をどう使っているかなどがサッパリわかりませんが、スクリプトの記述も出力もEUC-JPでしょうか。 であれば、MySQLへの接続直後に「set names ujis」を投げておかないとEUC-JPで扱えないのでは?おそらく「mysql set names」で検索すれば説明しているサイトがHitすると思います。

関連するQ&A

  • PHP・MySQLでデータベースを作成しています。

    PHP・MySQLでデータベースを作成しています。 Fatal error: Call to undefined function: mb_detect_encoding() in c:\xxxxxx\xxxxxx\xxxxxx\index.php on line 20 というエラーが出てきてデータベースの情報が反映されません。 恐らく文字コード変換の関数が間違っているのだと思いますが 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; } } どこが間違っているのかが何度試しても分かりません。 ちなみのline 20の部分は、ちょうど下記になります。 $det_enc = mb_detect_encoding($string, $from, $to); PHP・MySQLともにほぼ初心者に近い状態なので 本読みながら作成しています。よろしくお願いします。

    • 締切済み
    • PHP
  • 文字化けしないで表示する方法を教えてください

    MySQLのデータを読み出してドロップダウン・メニューを生成するだけのコードですが、文字コードがうまく変換されないので文字化けします。 具体的には、PHPサンプル集というデータがデータベースに入っていたとすると PHP????? と表示されます。 部分的に自分でコメントアウトして直そうとしています。 1 <html> 2 <head> 3 <title>選択リストをデータベースから生成する</title> 4 </head> 5 <body> 6 <?php 7 // 接続設定(サーバ/データベース/ユーザ/パスワード) 8 $sv = "localhost"; 9 $dbname = "testdb"; 10 $user = "root"; 11 //$pass = "********"; 12 $pass = ""; 13 14 // 文字コード 15 //$enc_disp = "EUC-JP"; 16 //$enc_db = "EUC-JP"; 17 $enc_disp = "UTF-8"; 18 $enc_db = "UTF-8"; 19 20 // データの文字コードを変換する関数 21 function cnv_enc($string, $to, $from) { 22 // 文字コードを変換する 23 $det_enc = mb_detect_encoding($string, $from . ", " . $to); 24 // if ($det_enc and $det_enc != $to) { 25 if ($det_enc != $to) { 26 return mb_convert_encoding($string, $to, $det_enc); 27 } 28 else { 29 return $string; 30 } 31 } 32 33 // データベースに接続する 34 $conn = mysql_connect($sv, $user, $pass) or die("接続エラー"); 35 mysql_select_db($dbname) or die("接続エラー"); 36 37 // データを取り出す 38 $sql = "SELECT id, nam FROM prod ORDER BY id"; 39 $res = mysql_query($sql, $conn) or die("データ抽出エラー"); 40 41 // 取り出したデータを表示する 42 echo "<select name=\"menu1\">"; 43 while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { 44 echo "<option value=\"".$row["id"]."\">". 45 // cnv_enc($row["nam"], $enc_disp, $enc_db)."</option>"; 46 cnv_enc($row["nam"], "UTF-8", "UTF-8")."</option>"; 47 } 48 echo "</select>"; 49 50 // 接続を解除する 51 mysql_close($conn); 52 53 ?> 54 </body> 55 </html> きっと、24行目のcnv_encのandは間違いですよね? コメントアウトして自分なりに直してみましたが、それでも結果は変わりません。 データベース自体には文字化けがないことは確認しました。MySQLAdminでも同様です。 select id, nam from prod order by id; +----+--------------------------------+ | id | nam | +----+--------------------------------+ | 1 | PHPサンプル集 | | 2 | PHPリファレンス | | 3 | PHPデータベース構築法 | | 4 | PHPの基礎がわかる本 | | 5 | PHP活用法 | +----+--------------------------------+ 5 rows in set (0.00 sec) character setはUTF-8です。 では、お願いします。

    • ベストアンサー
    • PHP
  • PHPでのMYSQL操作について教えてください。

    MYSQLの中のデータをPHPで一覧にして表示し、フォームの内容を変更してから変更ボタンを押すと変更を反映した内容が一覧になって表示されるようにしたいのですが、うまくいきません。 コードは以下のとおりです。 <?php //接続設定 $sv="localhost"; $dbname="****"; $user="****"; $pass="****"; //文字コード $enc_disp="shift-jis"; $enc_db="shift-jis"; //データの文字コードを変更する 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用に変換 function cnv_sqlstr($string) { if (get_magic_quotes_gpc()) { $string = stripslashes($string); } $string = htmlspecialchars($string); $string = mysql_real_escape_string($string); return $string; } //データベース接続 $conn=mysql_connect($sv,$user,$pass) or die("接続エラー"); mysql_select_db($dbname) or die ("接続エラー"); //編集するデータを取得する if (count($_POST) >0) { $number=$_POST["number"]; $name=$_POST["name"]; //データが送信された時にはデータを変更する if (strlen($number) and strlen($name)) { //データを変更する $sql = "UPDATE customer SET number = ".cnv_sqlstr($number).", name = '".cnv_sqlstr(cnv_enc($name, $enc_db, $enc_disp))."', WHERE (number = ".cnv_sqlstr($number).");"; mysql_query($sql, $conn) or die("データ変更エラー"); } } //データを取り出す $sql = "SELECT number,name FROM テーブル名 ORDER BY number ;"; $res = mysql_query($sql, $conn) or die ("データ抽出エラー"); //取りだしたデータを表示する echo "<table border =\"1\">"; echo "<tr>"; echo "<td> </td>"; echo "<td>名前</td>"; echo "</tr>"; while ($row =mysql_fetch_array($res, MYSQL_ASSOC)) { echo "<form method=\"POST\" action=\"".$SERVER["PHP_SELF"]."\">"; echo "<tr>"; echo "<td><input type=\"submit\" value=\"変更\"></td>"; echo "<input type=\"hidden\" value=\"".$row["number"]."\" name=\"number\">"; echo "<td><input type=\"text\" name=\"name\" value=\"".cnv_enc($row["name"], $enc_disp, $enc_db) . "\"></td>"; echo"</tr>"; echo"</form>"; } echo"</table>"; //接続を解除する mysql_close($conn); ?> 現在は内容を変更して変更ボタンを押すと、「変更エラー」が表示される状態です。 何が原因かわからず行き詰っています。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 文字化けについて

    お世話になります 携帯サイトの文字化けに困っています。 MysqlのデータはEUC-JPなので 携帯サイトにデータを出力するのにShift-JSにしないと文字化けするというところまで調べました。 function cnv_dispstr($string) { // 文字コードを変換する $det_enc = mb_detect_encoding($string, "Shift-JIS,EUC-JP"); if ($det_enc and $det_enc != ENCDB) { return mb_convert_encoding($string, ENCDB, $det_enc); } else { return $string; } } このようにしたのですが、 Mysqlから出力したデータ部分の文字化けが解決しません。 アドバイスよろしくお願いします。

    • ベストアンサー
    • PHP
  • SQL文で「あ」などの2バイトの文字を条件に入れるとエラーになる。

    PHPとPostgreSQLでファイルを作成しました。 (2)、(3)の場合だと問題なく動作しますが、 (1)の場合だと動作しません。 「あ」が2バイトなのが原因かとおもうのですが、 よくわかりません。他に原因あるのでしょうか。 ********************************************** 環境 PHP5 Apache2.2 PostgreSQL8.24 ********************************************* <?php // 接続設定(サーバ/データベース/ユーザ/パスワード) $sv = "localhost"; $dbname = "test"; $user = "user"; $pass = "pass"; // 文字コード $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; } } // データベースに接続する $conn = pg_connect("host=$sv dbname=$dbname user=$user password=$pass") or die("接続エラー"); (1)$sql = "select * from test WHERE name LIKE N'あ%'"; (2)$sql = "select * from test WHERE tel LIKE N'090%'"; (3)$sql = "select * from test WHERE no LIKE N'a%'"; ?> ********************************************* nameには、名前の文字列(いとう、さとう)が、 telには、電話番号(090…、03…)が、 noには、アルファベット一文字(a、b)が 入力されています。 *********************************************

  • レンタルサーバーでphpmyadminの文字化け

    レンタルサーバーでMYSQLとPHPを使用したいのですが、PHPからINSERTした文字が、phpmyadminの画面だけで文字化けしてしまいます。 MySQLの文字コード設定は UTF-8 Unicode (utf8) で、照会順序も utf8_unicode_ci です。 INSERTする文字もINSERT直前に文字コードを変更し、確認したところutf8になっています。 コードは以下のとおり。 <?php $sql = mb_convert_encoding("$info","UTF-8"); $mojicode = mb_detect_encoding($info,mb_list_encodings()); print "$info の文字コードは $mojicode です。"; ?> PHPでMySQLからデータをSELECTで表示させた際は、文字化けせずに表示されます。 表示させるサイトの文字コードはutf-8です。 表示させる前に文字コードを変換させています。 スクリプトは以下のとおり。 <?php //文字コード $enc_disp = "utf-8"; $enc_db = "utf-8"; //データの文字コードを変換する関数 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; } } //データベースに接続 $conn=mysql_connect($sv, $user, $pass) or die("接続エラー"); mysql_select_db($dbname) or die ("接続エラー"); //データを取り出す //取りだすレコードの開始位置 $st=0; //取りだす最大レコード数 $lim=5; $sql = "SELECT number,date,info FROM info ORDER BY date DESC LIMIT $st,$lim;"; $res = mysql_query($sql, $conn) or die ("データ抽出エラー"); //mysql_query()関数でデータを取り出すSQLを実行する //取り出したデータを表示する echo "<table border=\"0\" id=table>"; while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { echo"<tr>"; echo"<td colspan='2'>".' ・ '.$row["date"].' / '.cnv_enc($row["info"], $enc_disp, $enc_db)."</td>"; echo"</tr>"; } echo "</table>"; ?> なお、表示する際、文字コードを変更する前にデータの文字コードを調べたところ、ASCIIとなっていました。 phpmyadminに入った際にASCIIになったのでしょうか? 解決策がわからず困っています。 どなたか解決策を教えていただけないでしょうか。 よろしくおねがいします。

    • ベストアンサー
    • MySQL
  • 携帯の文字化け

    パソコンで入力したお知らせをパソコンと携帯で確認できるようにしたものを、サーバーを移管したところ、携帯で見る方だけ文字化けをおこすようになりました。 <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> です。 // 表示文字コード define("ENCDISP", "shift_jis"); // データベース文字コード define("ENCDB", "EUC-JP"); // ========================================================= // 表示する文字コードに変換 // ========================================================= function cnv_dispstr($string) { // 文字コードを変換する $det_enc = mb_detect_encoding($string, "EUC-JP, SJIS"); if ($det_enc and $det_enc != ENCDISP) { return mb_convert_encoding($string, ENCDISP, $det_enc); } else { return $string; } } ちなみにこういうのを入れてみてもだめでした。 すいませんが教えてください。

    • 締切済み
    • PHP
  • 文字化け

    文字コードをEUCにて統一しているにも関わらず、 結果画面をみると下記のように化けてしまいます。 原因を教えて頂きたく思います。 よろしくお願いします。 データを表示する ID 名前 出身 年齢 1 ???? ??? 30 2 ???? ??? 20 <html> <head> <title>データを表示する</title> </head> <body> <h3>データを表示する</h3> <?php // 表示文字コード $disp_enc = "EUC-JP"; // データの文字コードを変換する関数 function cnv_dbstring($string, $enc) { // 文字コードを変換する $det_enc = mb_detect_encoding($string); if ($det_enc and $det_enc != $enc) { return mb_convert_encoding($string, $enc, $det_enc); return mb_convert_encoding($string, $enc, $det_enc); } else { return $string; } [DB接続部分省略] // 取り出したデータを表示する 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_dbstring($row["nam"], $disp_enc)."</td>"; echo "<td>".cnv_dbstring($row["pre"], $disp_enc)."</td>"; echo "<td>".$row["ag"]."</td>"; echo "</tr>"; } echo "</table>"; ?> </body> </html>

    • ベストアンサー
    • PHP
  • データベースの文字が???で表示される

    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>";

    • ベストアンサー
    • PHP
  • mb_detect_encoding

    mb_detect_encodingについてどなたかご教授ください。 PHPによるWebアプリケーションスーパーサンプル http://www.nishi2002.com/phpsample/​ にて勉強してるのですが、どうしてもわからない所がありまして 知恵を貸していただきたく投稿いたします。 本書の中で $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; } } とユーザー定義関数を指定して // 取り出したデータを表示する echo "<select name=\"menu1\">"; while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { echo "<option value=\"".$row["id"]."\">". cnv_enc($row["nam"], $enc_disp, $enc_db)."</option>"; このように使用しているのですが 定義する段階での $det_enc = mb_detect_encoding($string, $from . ", " . $to); この部分がわかりません。 この関数は文字エンコーディングを検出する関数であるというのはわかるんですが、(http://jp.php.net/manual/ja/function.mb-detect-encoding.php)参照 「$from」 のあとの 「.」 の意味などがどうしてもわかりません。 またなぜ引数が3つ指定されているのでしょうか? 調べてみたのですが解答にいきつかず、どなたかご教授お願いします!!!

    • ベストアンサー
    • PHP