こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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>

投稿日時 - 2009-12-01 00:30:56

QNo.5488926

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

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

このように書きます。

投稿日時 - 2009-12-01 00:50:54

お礼

参考にさせていただきました。
ありがとうございます。

投稿日時 - 2009-12-02 15:41:52

あなたにオススメの質問