• 締切済み
  • 困ってます

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> よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数6
  • 閲覧数261
  • ありがとう数0

みんなの回答

  • 回答No.7

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

共感・感謝の気持ちを伝えよう!

質問者からの補足

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

  • 回答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」だな。

共感・感謝の気持ちを伝えよう!

  • 回答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'); }

共感・感謝の気持ちを伝えよう!

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

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

共感・感謝の気持ちを伝えよう!

質問者からの補足

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、ブラウザだと???になります。 どなたかよろしくお願いします。

  • アラートで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
  • 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
  • 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
  • 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の文字化けの対応法は?

    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_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
  • 全体表示について

    今PHPからmysqlへのデータの更新や追加などを独学で勉強しているのですが行き詰まったのでアドバイスをお願いしたいのですが、何とかPHPからmysqlへの追加及び削除までは出来るようになったのですが今度はmysqlのデータをPHPへ表示させたいと思っていて色々本や入門書を見てもなかなか出来なかったので教えてください select.php <?php $url = "localhost"; $user = "test1"; $pass = "take1118"; $db = "test2"; // 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); // 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> <table width = "200" border = "0"> <tr bgcolor="##ccffcc"><td>user_siten</td><td>user_name</td></tr> </table> </body> </html> このようにテーブルにして表示させようとしています。 初心者なのでプログラム的におかしな部分があるかも知れませんがお願いします。

    • ベストアンサー
    • MySQL
  • 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
  • GETメソッド ID MYSQL

    分からないことがありましたのでご質問をさせて頂きます。 現在作成してる仕様なのですが、 フォームの一つの項目のリンクを設置し、別のページに渡し そこで更に詳細な情報をMYSQLからひっぱってきて表示させようとしております。 そこでGETメソッドを使って行おうとしているのですが、どうしても 変数の受け渡しがうまくいきません。 こちらがそのコードになります。 1,フォーム <td><a href="shousai.php?code=<?php echo $row['id'];?>">詳しくはこちら</a></td> 2,詳細ページ(shousai.php) <?php echo var_dump($_GET["id"]); $id = $_GET["id"]; $con = mysql_connect('localhost','aaaa','aaa'); if (!$con) { print("MySQLへの接続に失敗しました"); exit; } if (!mysql_select_db("database")) { print("データベースへの接続に失敗しました"); exit; } $sql="select * from table where id ='$id'"; $result=mysql_query($sql,$con); //SQL文の発 $rows=mysql_num_rows($result); while($row = mysql_fetch_array($result)){ ?> <table border ="1"> <tr><td><?php echo $row["name"]; ?></p></td></tr> <tr><td><?php echo $row["address"]; ?></td></tr> <tr><td><?php echo $row["station"]; ?></td></tr> <?php } ?> </table> 2の詳細ページにてvar_dumpで$_GET["id"];の値を受け取ってるか 確かめたのですがNULLになっており、ページになにも反映されません。 フォームからリンクで値を送り、それをきっかけにデータベースに接続して詳細を表示させたいと思っております。 どなたかご存知の方お伺いできませんでしょうか?

    • ベストアンサー
    • PHP