みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

締切り済みの質問

住所録を作りたい

『MySQL入門以前』という本をみながら住所録をつくっています。

1、htmlファイル データ登録画面用

2、phpファイル データをMySQLデータベースに書き込み

3、phpファイル MySQLのテーブルから全体を読み出し

の3つのファイルから構成しています。

データ登録画面で、全角文字『愛知県』をいれると
データベースに新しいデータが追加されません。
半角英数字abcや123なら、新しいデータが追加されます。
どうしたら全角文字も対応させられるのでしょうか。

ファイルの一部
<form action="touroku.php" method="post">
<p>氏名:<input type="text" name="simei" size="40"></p>
<p>郵便番号:<input type="text" name="yubin1" size="5">-<input type="text" name="yubin2" size="8"></p>
<p>住所1:<input type="text" name="jusho1" size="50"></p>
<p><input type="submit" value="登録">
<input type="reset" value="リセット"></p>
</form>

MySQL 5.0
PHP 5.2.5.5
apache 2.0.59
Windowes XP

投稿日時 - 2008-02-03 19:23:01

QNo.3741278

困ってます

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

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

回答(2)

ANo.2

取り急ぎサンプルを

<?php
mb_language('ja');  // 不要でも入れておく習慣を
mb_internal_encoding('EUC-JP');  //  同上
extract($_POST);  // 危ないのでextractを使うのはやめましょう・・
mysql_connect("localhost","root","pass");
mysql_select_db("lesson");
$sql = "set names ujis";  // この行追加
mysql_query($sql) or die("set names abort : " . mysql_error());  //  同上
$kyou = date("y-m-d");  // DB側の定義がわかりませんが「登録日時」のセットはDBに任せては?
$sql = "insert into jushoroku " .
    "values(0,'" .
    mysql_real_escape_string($kyou) . "','" .  // mysql_real_escape_stringを使うこと(以下同様)
    mysql_real_escape_string($simei) . "','" .
    mysql_real_escape_string($yubin1) . "','" .
    mysql_real_escape_string($yubin2) . "','" .
    mysql_real_escape_string($jusho1) . "','" .
    mysql_real_escape_string($jusho2) . "','" .
    mysql_real_escape_string($denwa) . "','" .
    mysql_real_escape_string($fax) . "','" .
    mysql_real_escape_string($keitai) . "','" .
    mysql_real_escape_string($meruado) . "','" .
    mysql_real_escape_string($biko) . "')";
mysql_query($sql) or die("sql abort : " . mysql_error() . ", SQL = " . $sql);  // この行書き替え
?>

整形のため2バイト空白があるのでコピペ時は要注意。なお未検証なので、文法ミスやtypoがあったら適宜修正してください。

気になったのはextractで展開している部分(セキュリティ的にマズイです)や今日の日付をわざわざphp側でセットしている部分ですかね。基本的にextractで展開せず、ひとつひとつ$_POSTを使うか、$_POSTからセットしましょう。日付はSQL文にMySQLの関数を書けばいいと思いますが、date()だけでよかったかどうか失念したので今回はパスです(汗

投稿日時 - 2008-02-08 16:23:25

補足

回答ありがとうございます。
データベースに新しいデータが追加されるようになりました。
ありがとうございます!
しかし、文字化けは直りませんでした。全角文字をいれると「?????」と表示されてしまいます。

もう一つphpファイルがあります。
(jushorokuテーブルを読み出すファイルです。)
<?php
mb_language('ja');
mb_internal_encoding('EUC-JP');
mysql_connect("localhost","root","pass");
mysql_select_db("lesson");
$sql = "set names ujis";
$sql = "select * from jushoroku";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);
if($rows == 0) {
echo "<p>該当データがありません。</p>";
}
else {
while($row = mysql_fetch_array($result)){
echo "<p>";
echo $row["renban"];
echo " ";
echo $row["tourokubi"];
echo "<br />";
echo $row["simei"];
echo " ";
echo $row["yubin1"];
echo "-";
echo $row["yubin2"];
echo " ";
echo $row["jusho1"];
echo $row["jusho2"];
echo "<br />TEL ";
echo $row["denwa"];
echo " FAX ";
echo $row["fax"];
echo " CELL ";
echo $row["keitai"];
echo " MAIL ";
echo $row["meruado"];
echo "<br />";
echo $row["biko"];
echo "</p><hr />";
}
}
?>

投稿日時 - 2008-02-10 08:25:46

お礼

回答ありがとうございます。

投稿日時 - 2008-02-10 08:36:58

ANo.1

・MySQLの文字コード
・例示されたhtmlファイルの文字コード
・phpスクリプトの文字コード(スクリプトに「mb_internal_encoding」は書かれていますよね?)
・登録するときのSQL文の組み立て部分のソース

をお願いします。

またmysql_query()の実行結果は確認されていますか?

#今回は無関係ですが、MySQLへ接続したあとで「set names」をしていますか?

投稿日時 - 2008-02-04 02:21:02

補足

回答ありがとうございます。
・MySQLの文字コードという存在すら知らなかったです(汗
よく分かりませんがMySQLで
show variables like "char%";といれたところ下のように表示されました。

character_set_client │ utf8
character_set_connection │ utf8
character_set_database │ sjis
character_set_filesytem │ binary
character_set_results │ utf8
character_set_sever │ sjis
character_set_system │ utf8

>#今回は無関係ですが、MySQLへ接続したあとで「set names」をしていますか?
これもしていませんでした。

・htmlファイルの文字コード
euc-jpです。

・phpスクリプトの文字コード
mb_internal_encodingは書いていません(汗
euc-jpで保存すればいいものと思っていました。

・登録するときのSQL文の組み立て部分のソース
すみません。どこの部分かよく分からないです。
下は登録用PHPファイルのbody内です。
<?php
extract($_POST);
mysql_connect("localhost","root","pass");
mysql_select_db("lesson");

$kyou = date("y-m-d");
$sql = "insert into jushoroku values(0,'$kyou','$simei','$yubin1','$yubin2','$jusho1','$jusho2','$denwa','$fax','$keitai','$meruado','$biko')";
mysql_query($sql);
?>

>またmysql_query()の実行結果は確認されていますか?
確認していません。
どのようにやればいいのでしょうか。

投稿日時 - 2008-02-06 20:38:49

お礼

回答ありがとうございます。補足を追加しました。

投稿日時 - 2008-02-08 15:42:09

あなたにオススメの質問