- 締切済み
MySQL+PHP 掲示板での文字化けについて
お世話になります。 教えて!内でも同類の質問を多々目にし、一通り目を通したつもりですが、今回自力解決することができなかったため質問しました。 MySQL+PHPで簡易掲示板を設置しました(とりあえず動作確認させたかったので書籍のサンプルです)。 しかし、投稿後の画面が文字化けしてしまいます。 日本語で投稿した場合、全て「????」と表示されます。 データベースへ直接アクセスすると、レコードも「????」で登録されていることから、登録の際の文字コードに問題があるのかと思い色々試したのですが、上手くいきませんでした。 掲示板はform1.htmlで文章を入力後、DBに登録され、sample.phpで値を表示するシンプルなものです。 以下がソースですが、色々修正したため、根本的におかしい箇所もあるかも知れませんが、気になる箇所・解決策などご教示宜しくお願いします。 form1.html ------------------------ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>form1</title> </head> <body> <form action='sample.php' method='GET'> 題名:<input type="text" name="title" size=60 /> <br/> 要約:<textarea name="abstract" cols=60 rows=2></textarea> <br/> 本文:<textarea name="content" cols=60 rows=10></textarea> <br/><br/> <input type="submit" value="送信"/> </form> </body> </html> ------------------ sample.php ------------------ <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>PHP Sample</title> <style> h3{ font-weight:bold; border-style:none none solid solid; border-width:0px 0px 3px 7px; border-color:#0000ff; padding:5px 0px 0px 0px; color:#000066; background-color:#ddddff; width:90%; } h4{ width:90%; margin-left:5%; } p{ border-style:groove groove groove groove; border-width:3px 3px 3px 7px; border-color:#aaaaff; margin-left:5%; padding:5px 5px 5px 5px; color:#000033; background-color:#eeeeff; width:80%; } h6 { text-align:right; width:85%; } </style> </head> <body> <?php $link = mysql_connect("localhost", "root", "root") or exit("接続に失敗しました。"); mysql_select_db("phpdata") or exit("データベースが選択できません。"); if (!isset($_GET["title"])){ showAllMySQLData(NULL); exit; } $title = htmlspecialchars($_GET['title']); $abstract = htmlspecialchars($_GET['abstract']); $content = htmlspecialchars($_GET['content']); $query = "insert into myblog (title,abstract,content,uptime)"; $query .= " values (\"" . $title . "\",\"" . $abstract . "\",\"" . $content . "\",CURDATE())"; $result = mysql_query($query) or exit("クエリーの実行に失敗しました。"); mysql_query('set names utf-8'); showAllMySQLData(NULL); mysql_close($link); function showAllMySQLData($result){ if ($result == NULL){ $result = mysql_query("SELECT * FROM myblog") or exit("SELECTの実行に失敗しました。"); } while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { $id = $row['id']; $title = $row['title']; $abstract = $row['abstract']; $content = $row['content']; $content = preg_replace("/\r\n/","<br/>",$content); $uptime = date('Y年 m月 d日',strtotime($row['uptime'])); echo "<h3>" . $title . " <font size=-1>[" . $id . "]</font></h3>"; echo "<h4>" . $abstract . "</h4>"; echo "<p>" . $content . "</p>"; echo "<h6>" . $uptime . "</h6>"; echo "<br/><br/>"; } } ?> </body> </html>
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- hogehoge78
- ベストアンサー率80% (433/539)
>mysql_query('set names utf-8'); これは、MySQLが受け取るSQL文のCharset(文字コード)をUTF-8と認識させるための命令です。 http://dev.mysql.com/doc/refman/4.1/ja/charset-connection.html ですので、mysql_query関数にてSQL文を投げる前に実行しないと文字化けすると思います。 また、 >$query .= " values (\"" . $title . "\",\"" . $abstract . "\",\"" . $content . "\",CURDATE())"; 文字列のエスケープは、ダブルクオーテーションではなくてシングルクオーテーションです。(一般的には・・・) $query .= " values ('" . $title . "','" . $abstract . "','" . $content . "',CURDATE())"; このように書きます。
お礼
参考にさせていただきました。 ありがとうございます。