• 締切済み

mysqlの文字化け

お世話になります。 phpmyadminを使用しており、php内からmysqlに接続しているのですが テーブル内の結果が「????」となり文字化けしてしまいます。 phpmyadmin上では正常に日本語データが表示されます。 テーブルの文字コード:utf_general_ci ソースは以下です。 <?php ~DB接続省略~ // クエリを送信する $sql = "SELECT * FROM table"; $result = mysql_query($sql, $link) or die("クエリの送信に失敗しました。<br />SQL:".$sql); //表示するデータを作成 while($row = mysql_fetch_array($result)) { $tempHtml .= "<tr>"; $tempHtml .= "<td>".$row["YMD"]. "</td><td>".$row["NAME"]. "</td><td>".$row["OBJECT"]. "</td>"; $tempHtml .= "</tr>\n"; } //結果保持用メモリを開放する mysql_free_result($result); // MySQLへの接続を閉じる mysql_close($link) or die("MySQL切断に失敗しました。"); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>全件表示</title> </head> <body> <h3>全件表示</h3> <?= $msg ?> <table width = "200" border = "0"> <tr bgcolor="##ccffcc"><td>YMD</td><td>NAME</td><td>OBJECT</td></tr> <?= $tempHtml ?> </table> </body> </html> よろしくお願いします。

  • PHP
  • 回答数6
  • ありがとう数0

みんなの回答

回答No.7

>回答内容がシンプルなNo.3様に補足させていただきました。 なんでわざわざSQLインジェクションの可能性のある使い方してセキュリティーホール作るの?

appplus
質問者

補足

補足すると言っているだけで、採用するとは言ってませんが・・・ 回答をいただけるのはうれしいですが 回答者欄にて、論争されあげくに教えてgoo事務局に 内容を修正されたり、ちょっと困惑です。 回答欄にない方法で解決できましたので 締め切ります。

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.6

>>5 >1~10まで説明しないと今のプログラマは駄目なのか? ま、俺も1~10まで説明するつもりはないけどね。 #2では、 >「SET NAMES utf8」を最初にMySQLに投げておく。 >後はmysql_set_charset()を利用する。 と、SET NAMESが先でmysql_set_charsetが後になっているからね。 ツッコミを入れたくなるのも、むベなるかなってところでしょ。 まさに、君の書いたリンク先の通りだね。 質問者に技量や知識が不足していると思うなら、「SET NAMES」については紹介しない方が親切ってのもありだと思うよ。 紹介するにしても、順番としてはmysql_set_charsetの次に「SET NAMES」だな。

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.4

'SET NAMES utf8'クエリーが賛否両論になるのは、mysql_set_charsetという関数がPHP5.0.7で追加されたから。 PHP5.0.7以降なら、推奨されているmysql_set_charsetを使用すべきって事だよ。 ただ少し前なら、まだPHP4のレンタルサーバも多かったので、非推奨であってもPHPバージョンに依存せずに確実に動作する'SET NAMES utf8'を好んだ人もいるって事だね。 どちらも同じ、『クライアントプログラム(=PHPスクリプト)は、UTF8でMySQLに接続します』とMySQLに通知する命令なので、どちらを使用するかが賛否両論なだけで、使用すること自体は必須だと思いますが。 ま、両者を満たすならこんな方法でしょうね。 if (function_exists('mysql_set_charset')) { mysql_set_charset('utf8'); }else{ mysql_query('set names utf8'); }

  • root_16
  • ベストアンサー率32% (674/2096)
回答No.3

No.1の人に1票。 さらに よくある失敗として、PHPエディターで書いている 文字コードにも注意すること。 html部分も一緒に書いているならなおさら (WindowsだとデフォルトのS-JISになりがち)。 UTF-8なら全部UTF-8に揃えるくらいに考えた方が 結果的に良いです。

appplus
質問者

補足

phpファイルはutf-8のbomなしになっています。 html部分を削除しても、????となってしまいます。 となると、ほかの方がおっしゃっているような 手法になるのでしょうか。 賛否両論と言ってますが、mysql+phpmyadminの組み合わせは マイナーな組み合わせはないと思っているので 賛否両論となりうる手法で回避するのが何か不思議です。 根本的にDBとPHPでの指定方法に欠陥があるのでしょうか。 ちなみに・・・私はプログラマではなく 思いつきで始めた一般人です・・・ 回答内容がシンプルなNo.3様に補足させていただきました。

回答No.2

書き忘れたけど良いか悪いかは別にして 手っ取り早く処理するなら賛否両論あるけど 「SET NAMES utf8」を最初にMySQLに投げておく。 後はmysql_set_charset()を利用する。

回答No.1

PHPのソースの文字コード。php.iniで設定している内部文字コードは大丈夫か?

関連するQ&A

  • 文字化け お名前comサーバー

    MySQL サーバ: cgidb05.gmoserver.jp (cgidb05.gmoserver.jp via TCP/IP) サーバのバージョン: 5.0.51a-log プロトコルバージョン: 10 ユーザ: sd_dba_MTA0NzUz@cgi07.unix.internal-gmo MySQL の文字セット: UTF-8 Unicode (utf8) Web サーバ Apache/2.2.9 (Unix) mod_ssl/2.2.9 OpenSSL/0.9.8l MySQL クライアントのバージョン: 5.0.67 PHP 拡張: mysqli phpMyAdmin バージョン情報: 3.3.1 select.php文 <?php $url = "cgidb05.gmoserver.jp"; $user = "sd_dba_MTA0NzUz"; $pass = "ifsaBUD8"; $db = "sddb0033532200"; // MySQLへ接続する $link = mysql_connect($url,$user,$pass) or die("MySQLへの接続に失敗しました。"); // データベースを選択する $sdb = mysql_select_db($db,$link) or die("データベースの選択に失敗しました。"); // クエリを送信する $sql = "SET NAMES utf8"; $sql = "SELECT * FROM kanri"; $result = mysql_query($sql, $link) or die("クエリの送信に失敗しました。<br />SQL:".$sql); //結果セットの行数を取得する $rows = mysql_num_rows($result); //表示するデータを作成 $sql = "SET NAMES utf8"; if($rows){ while($row = mysql_fetch_array($result)) { $tempHtml .= "<tr>"; $tempHtml .= "<td>".$row["mailadd"]."</td><td>".$row["pass"]."</td><td>".$row["name"]."</td>"; $tempHtml .= "<td><a href=\"update.php?cd=".$row["mailadd"]."\" target=\"_self\">更新</a></td>"; $tempHtml .= "<td><a href=\"delete.php?cd=".$row["mailadd"]."\" target=\"_self\">削除</a></td>"; $tempHtml .= "</tr>\n"; } $msg = $rows."件のデータがあります。"; }else{ $msg = "データがありません。"; } //結果保持用メモリを開放する mysql_free_result($result); // MySQLへの接続を閉じる mysql_close($link) or die("MySQL切断に失敗しました。"); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>全件表示</title> </head> <body> <h3>全件表示</h3> <?= $msg ?> <table width = "300" border = "1"> <tr bgcolor="##ccffcc"><td>mailadd</td><td>pass</td><td>name</td><td colspan="3">EDIT</td></tr> <?= $tempHtml ?> <form action="insert.php" method="post"> <tr> <td><input type="text" name="cd"></td> <td><input type="text" name="name"></td> <td><input type="text" name="name"></td> <td colspan="3"> <input type="submit" name="submit" value="追加"><input type="reset" value="リセット"> </td> </tr> </form> </table> </body> </html> csvには漢字、かな 共に吐き出し正常。PDF、ブラウザだと???になります。 どなたかよろしくお願いします。

  • 2つのMySQLのテーブルをPHPで同じ行に表示

    MySQL クライアントのバージョン: 5.0.45 phpMyAdmin バージョン情報: 3.2.4-rc1 でデータベースを作成しております。 簡単な例ですが、 PRIMARY=id PHPのテーブルを下記のように表示させたい場合。 ┼─┼──┼──┼ │id │add │name│ ┼─┼──┼──┼ │0 │東京 │田中│ ┼─┼──┼──┼ │1 │長野 │鈴木│ ┼─┼──┼──┼ │2 │大阪 │佐藤│ ┼─┼──┼──┼ │3 │山口 │井上│ ┼─┼──┼──┼ idを共通にしていれば、 「add」はtable1、「name」はtable2の情報を 上記のように表示することは可能なのでしょうか? もし可能であれば、この表示の仕方の名称を教えていただけないでしょうか? (調べるときの検索ワードが分からなくて…すみません) 必要かわかりませんが、PHP上で表示する表の部分はこのように作成しています。 $result = executeQuery($sql); $rows = mysql_num_rows($result); if($rows){ while($row = mysql_fetch_array($recordSet)) { $tempHtml .= "<tr>"; $tempHtml .= "<td>".$row["id"]."</td>"; $tempHtml .= "<td>".$row["add"]."</td>"; $tempHtml .= "<td>".$row["name"]."</td>"; $tempHtml .= "</tr>\n"; } $msg = $rows."件みつかりました"; }else{ $msg = "0件です"; } 経験が浅く、お伝わりにくいことがあったら、申し訳ございません。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • アラートでyes noを作りたいです。

    PHP初心者です。よろしくお願いいたします。 ネット上で、いろいろ勉強していて、次のようなコードを見つけました。 <?php $url = "localhost"; $user = "root"; $pass = ""; $db = "SampleDB050"; // MySQLへ接続する $link = mysql_connect($url,$user,$pass) or die("MySQLへの接続に失敗しました。"); // データベースを選択する $sdb = mysql_select_db($db,$link) or die("データベースの選択に失敗しました。"); // クエリを送信する $sql = "SELECT * FROM T01Prefecture"; $result = mysql_query($sql, $link) or die("クエリの送信に失敗しました。<br />SQL:".$sql); //結果セットの行数を取得する $rows = mysql_num_rows($result); //表示するデータを作成 if($rows){ while($row = mysql_fetch_array($result)) { $tempHtml .= "<tr>"; $tempHtml .= "<td>".$row["PREF_CD"]."</td><td>".$row["PREF_NAME"]."</td>"; $tempHtml .= "<td><a href=\"update.php?cd=".$row["PREF_CD"]."\" target=\"_self\">更新</a></td>"; $tempHtml .= "<td><a href=\"delete.php?cd=".$row["PREF_CD"]."\" target=\"_self\">削除</a></td>"; $tempHtml .= "</tr>\n"; } $msg = $rows."件のデータがあります。"; }else{ $msg = "データがありません。"; } //結果保持用メモリを開放する mysql_free_result($result); // MySQLへの接続を閉じる mysql_close($link) or die("MySQL切断に失敗しました。"); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=SHIFT-JIS"> <title>全件表示</title> </head> <body> <h3>全件表示</h3> <?= $msg ?> <table width = "300" border = "1"> <tr bgcolor="##ccffcc"><td>PREF_CD</td><td>PREF_NAME</td><td colspan="2">EDIT</td></tr> <?= $tempHtml ?> <form action="insert.php" method="post"> <tr> <td><input type="text" name="cd"></td> <td><input type="text" name="name"></td> <td colspan="2"> <input type="submit" name="submit" value="追加"><input type="reset" value="リセット"> </td> </tr> </form> </table> </body> </html> この上のコードの、更新と削除を行うときに、Javascriptで、yes, no のアラートを出したいのですが、ちょうどデーターベースから引っ張ってきているところなので、このコードをどう変えればよいのかわかりませんでした。基本的なことを聞いてしまっているかもしれませんが、よろしくご教授願います。できるだけ、具体的にお願いします。

    • ベストアンサー
    • PHP
  • PHPとMySQLの文字化けの対応法は?

    OSはWinXPで、MySQL+PHPのアプリを作成しているところです。 <html> <head><title>配列データの取得</title></head> <body> <table border="1"> <tr><td>題名</td><td>著者</td><td>出版社</td></tr> <?php $host = "localhost"; if (!$conn = mysql_connect($host, "user", "pass")){ die("MySQL接続エラー.<br />"); } mysql_select_db("kisop", $conn); $sql = "SELECT * FROM book_table LIMIT 10"; $res = mysql_query($sql,$conn); while($row = mysql_fetch_array($res)) { print("<tr>"); print("<td>".$row["btitle"]."</td>"); print("<td>".$row["bauth"]."</td>"); print("<td>".$row["bpub"]."</td>"); print("</tr>\n"); } mysql_free_result($res); ?> </table> </body> </html> と、こんな演習をしているのですが、ブラウザに表示させると文字化けしました。 HTML文はEUC、MySQLのデータは、シフトJISで入っていたようです。 そのため、「題名」「著者」などの見出しと、取り出したデータを同時に文字化けさせずに、表示できない 状態です(泣)。 MySQLからデータを取り出すときに、mb_convert_encodingで文字コードを変換してやれば 化けないでしょうが、出力しようとするデータのすべてを変換しなければなりません。 プログラマーさんたちは、文字化けの現象について、どう対応されているのでしょうか? いちいち、mb_convert_encodingで、変換しているものなのでしょうか? 定石のようなものを知りたいところです。 たとえば、HTML文は文字コード○○を使うものだ、設定ファイルを書き換えておく、などなど。 よろしくおねがいします。

    • ベストアンサー
    • PHP
  • MySQLで0で検索できない

    以下のようなPHPのソースとMySQLのテーブルで、numberが0の行をhtmlで取得しようとしているのですが、検索窓に0を入れて検索しても取得できません。ちなみに、numberが1や2の行は取得することができます。 なぜnumberが0の行を取得できないかと、どうすればnumberが0の行を取得することができるか教えてください。 <PHPのソース> <?php $url = "localhost"; $user = "root"; $pass = ""; $db = "test"; $html = ""; // MySQLへ接続する $link = mysql_connect($url,$user,$pass) or die("MySQLへの接続に失敗しました。"); // データベースを選択する $sdb = mysql_select_db($db,$link) or die("データベースの選択に失敗しました。"); // クエリを送信する $sql = "SELECT * FROM test"; $result = mysql_query($sql, $link) or die("クエリの送信に失敗しました。<br />SQL:".$sql); //結果セットの行数を取得する $rows = mysql_num_rows($result); ?> <form action="" method="post"> <input type="text" name="numberSearch" value=""> <input type="submit" value="検索"> </form> <?php //表示するデータを作成 if($rows && !empty($_POST['numberSearch'])){ while($row = mysql_fetch_array($result)) { if ($row["number"] == $_POST['numberSearch']) { $html .= "<tr>"; $html .= "<td>".$row["alphabet"]."</td><td>".$row["number"]."</td>"; $html .= "</tr>\n"; } } }else{ $msg = "データがありません。"; } // MySQLへの接続を閉じる mysql_close($link) or die("MySQL切断に失敗しました。"); ?> <html> <head> <meta charset="utf-8"> <title>numberSearch</title> </head> <body> <table width = "200" border = "0"> <tr bgcolor="##ccffcc"><td>alphabet</td><td>number</td></tr> <?= $html ?> </table> </body> </html> <データベースのテーブル> alphabet number A 0 B 1 C 2 D 1 E 1 F 0 G 1

    • ベストアンサー
    • MySQL
  • PHPでMySQLのストアドプロシージャを実行するには?

    こんにちは、この件でいろいろ検索していたのですが ストアドの作成まではできているのですが、PHPからの 実行のさせ方がわからず質問させていただきました。 環境は、PHP 5.2.9 + MySQL5.1.32 で MySQLでストアドプロシージャを作成して、実行できるのですが これをphpから実行させたいのですが、どのように記述すればよいのかわからず悩んでおります。 実行したいストアドは Gen_rank という名前でコンソールから実行できることは確認しています。 下記のようにしてみましたが、ストアドは走りませんでした。 <?php require_once("db_connect.php"); // クエリを送信する $sql = "call Gen_rank();"; $sql = "SELECT id, name, phonetic, age, s4, s9, rank FROM tmp_records ORDER BY rank"; $result = executeQuery($sql); // 結果セットの行数を取得する $rows = mysql_num_rows($result); // 表示するデータを作成 if($rows){  while($row = mysql_fetch_array($result)) {   $tempHtml .= "<tr>";   $tempHtml .= "<td>".$row["id"]."</td><td>".$row["name"]."</td><td>".$row["phonetic"]."</td><td>".$row["age"]."</td><td>".$row["s4"]."</td><td>".$row["s9"]."</td><td>".$row["rank"]."</td>";   $tempHtml .= "</tr>\n"; }  $msg = $rows."件のデータがあります。"; }else{  $msg = "データがありません。"; } // 結果保持用メモリを開放する mysql_free_result($result); ?>

    • 締切済み
    • PHP
  • PHP+MySQLで文字化けします

    PHPでMySQLに接続して以下のように テーブルの作成・そのテーブルにInsertをすると文字化けします。 PHPサーバーの文字コードはEUC-JP、MySQLの文字コードはlatin1です。 PHPのバージョンは5.04でMySQLのバージョンは4.1.20です。 無料レンタルサーバーなので詳細な設定は変更できません。 <?php // データベースに接続し、選択する mb_language('Japanese'); mb_internal_encoding('UTF-8'); mb_http_output('UTF-8'); $link = mysql_connect('localhost',"user","password") or die('Could not connect: ' . mysql_error()); echo 'Connected successfully'; mysql_select_db('user') or die('Could not select database'); mysql_query("SET NAMES UTF-8",$link); // SQL クエリを実行する $name = 'test'; $query = "CREATE TABLE IF NOT EXISTS `$name` ( `id` varchar(50) primary key, `name` varchar(50), `pw` varchar(50) );"; $result = mysql_query($query) or die('Query failed: ' . mysql_error()); $query = "INSERT INTO $name (id, name) VALUES('test', 'テスト');"; $mojicode = mb_detect_encoding($query); $query = mb_convert_encoding($query, "UTF-8", "$mojicode"); $result = mysql_query($query) or die('Query failed: ' . mysql_error()); // HTML に結果を出力する echo "<table>\n"; while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "\t<tr>\n"; foreach ($line as $col_value) { echo "\t\t<td>$col_value</td>\n"; } echo "\t</tr>\n"; } echo "</table>\n"; // 結果セットを開放する mysql_free_result($result); // 接続を閉じる mysql_close($link); ?> まだまだPHP、MySQL共に技術が未熟なため 説明不足な部分が多々あるかと思いますがご教授お願いします。

    • ベストアンサー
    • PHP
  • mysql_fetch_array取得結果を2行で

    mysql_fetch_arrayで取得した結果を、 2行で表示させるには、どうすればよいでしょうか? ※そのままだと横に長くなり過ぎるので、 複数行にして、テーブル横幅を抑えたい、です。 <現状> mysql_connect("localhost", "mysql_user", "mysql_password") or die("Could not connect: " . mysql_error()); mysql_select_db("mydb"); $result = mysql_query("SELECT * FROM mytable"); $body .= "<table> <tr> <th>ID</th> <th>氏名</th> </tr>"; while ($row = mysql_fetch_array($result)) { $body .= "<tr> <td></td> <td>".$row[name]."</td> <td>".$row[preid]."</td>

    • ベストアンサー
    • PHP
  • テーブルの内容を<a>タグでくるんだ時のアンカー

    下記のPHPスクリプトにおいて、テーブルの内容を<a>タグで 挟み、データベースの内容を表示しているのですが、 先頭レコードのアンカーだけが表示されず、ただのテキストになってしまいます。 二番目以降のレコードはテーブルの内容がアンカー付きで表示されるのですが、 先頭レコードにアンカーをつけるには、どこがまちがっているのか ご指導お願いいたします。 mysql_set_charset("utf-8"); //$sql = "SELECT * FROM hospytal;"; //$result = mysql_query($sql, $con) or die(mysql_error()); if($_POST['radio_btn']==="1"){ $sql = "SELECT * FROM hospytal order by manzokudo desc;"; // 満足度の降順 $result = mysql_query($sql, $con) or die(mysql_error()); }else{ $sql = "SELECT * FROM hospytal order by kuchikomi desc;"; // 口コミ数の降順 $result = mysql_query($sql, $con) or die(mysql_error()); } $rowco = mysql_num_rows($result); // テーブルの行数 for($i=0; $i<$rowco; $i++){ $row = mysql_fetch_row($result); // 取得された行に対応する配列を返し、内部のデータポインタを前に進める echo '<a href="'.$i.'.php?sid='.$row[0].'">'; echo '<table width="500" height="120" border="1">'; echo '<tr>'; echo '<td width="500" height="30">'.$row[1].'</td>'; echo '</tr><tr>'; echo '<td width="500" height="30">'.$row[4].'&nbsp;&nbsp;&nbsp;'.$row[5].'件</td>'; echo '</tr><tr>'; echo '<td width="500" height="30">'.$row[7].'</td>'; echo '</tr><tr>'; echo '<td width="500" height="30">'.$row[9].'</td>'; echo '</tr>'; echo '</table>'; echo '</a>'; } mysql_close($con); // データベースとの接続を解除する

    • ベストアンサー
    • PHP
  • 文字化けが発生する

    MySQL4.1をデフォルト設定のまま使っています(UTF-8) phpMyAdminで、UTF-8の2バイト文字を登録し、参照するときちんと表示されるのですが、自分で作ったPHPスクリプトからデータを参照すると、「??????????」と完全に文字が壊れて表示されてしまいます。 PHPでは普通に $query = 'select * from table'; $result = mysql_query($query); while($row = mysql_fetch_array($result){ print_r($row); } とやっています。どこがおかしいのでしょうか?

    • ベストアンサー
    • MySQL

専門家に質問してみよう