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

解決済みの質問

mysqlのinsert文について、ご指導をお願いいたします。

はじめまして。
プログラミング初心者です。

現在、PHP&MySQLで会員制掲示板を制作しようと奮闘しております。
会員登録フォームを作成し、下記SQL文にて会員登録を行おうとしているのですが、「エラーは出ていないのに、DBにデータが登録されない。」状況で、なにがおかしいのかわからず非常に困っております。尚、DBには正常に接続されています。

環境はVISTAにXAMPPを入れております。
私、PHP初心者のため、本のサンプルソースを加工して使用しようとしています。

下記にソースを記載いたしますので、
どうかご指導のほどお願いいたします。
(※情報が不足しておりましたら申し訳ありません。必要な情報をお教えいただけましたら幸いです。)

// 接続
$link = mysql_connect( $db_host, $db_user, $db_password );
mysql_select_db( $db_name );
$result = mysql_query( 'set character set utf8' );

$sql = "select email1 from users where email = '" . mysql_real_escape_string( $_POST['email'] ) . "'";
$result = mysql_query( $sql );

//
if ( $error != '' ) exit;

// 会員データの挿入
$sql = "insert into member (
login_id,
passwd,
register_date,
nickname,
sex,
birthday,
email,
pref,
division,
state
) values (
'" . mysql_real_escape_string( $_POST['email'] ) . "',
'" . md5( $_POST['passwd'] ) . "',
'" . date( 'Y-m-d H:i:s' ) . "',
'" . mysql_real_escape_string( $_POST['nickname'] ) . "',
'" . mysql_real_escape_string( $_POST['sex'] ) . "',
'" . mysql_real_escape_string( $_POST['year'] . '-' . $_POST['month'] . '-' . $_POST['day'] . ' 00:00:00' ) . "',
'" . mysql_real_escape_string( $_POST['email'] ) . "',
'" . mysql_real_escape_string( $_POST['pref'] ) . "',
'" . mysql_real_escape_string( $_POST['division'] ) . "',
'1'
)";

$result = mysql_query( $sql );
//echo $sql;

//
$title = '会員登録[3/4]';


?>

投稿日時 - 2009-03-30 00:56:48

QNo.4837775

すぐに回答ほしいです

質問者が選んだベストアンサー

print mysql_error($link);
上記をSQL実行後に追記したらどうなりますか?
実際に登録されていないのなら、なにかしらエラーが出てるはずです。


あと、前の回答者さんがお答えしていることについてですが、

htmlspecialchars()は基本出力時に行うものです。
出力時に、htmlspecialchars($_POST['email'], ENT_QUOTES);
などとやるとベストです。

SQL文に対しては、mysql_real_escape_string()をしているので、わざわざやる必要はありません。

ヒアドキュメントの使用についてもわざわざ進めるべき記述方法ではありません。

上記2点について、疑問に思ったので指摘させて頂きました。

投稿日時 - 2009-03-30 20:01:00

お礼

お忙しいところ、ご回答ありがとうございます。

なんと、解決できました(^O^)/
正常に登録することができました!

> print mysql_error($link);
> 上記をSQL実行後に追記したらどうなりますか?
> 実際に登録されていないのなら、なにかしらエラーが出てるはずです。

上記、ご指摘いただいた内容を追記したところ、
「unknown~・・・」と「pref」がDBに存在しない旨表示されました。
(正確なエラー文をコピーし忘れてしまいました・・・申し訳ありません)

そして、単純にレコード名が間違っていたことがわかり、
修正したとこと正常に登録することができるようになりました。

このたびは、的確なご指摘、本当に感謝いたしております!
ありがとうございました!

投稿日時 - 2009-03-31 00:36:09

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

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

回答(4)

ANo.4

>>2
>ヒアドキュメントの使用についてもわざわざ進めるべき記述方法ではありません。
理由は?
それと「進める」ではなく「薦める(勧める)」です。

>トピ主
私の回答はNo.2の方にとっては正しくないとのことなので、ポイントはつけないでください。

投稿日時 - 2009-03-30 23:57:12

ANo.3

sqlの最後に「;」っていらないんでしょうか?
phpの1文の終わりではなく、sqlの文の終わりとして。

私が以前↑で動かなかったことがあったので、違っていたら申し訳ないですが…。

投稿日時 - 2009-03-30 23:12:48

ANo.1

この手の問題の場合、可読性とセキュリティを考慮して、以下の3つを施すのが効果的と考えております。
・$_POSTを信用しない→データのサニタイズを行うこと。
・直接$_POSTデータを使わずに、一度変数に入れておくこと。
・ヒアドキュメントを使って、できるだけ見やすくすること。
e.g.
$email = trim(htmlspecialchars(strip_tags($_POST['email'])));
$name = trim(htmlspecialchars(strip_tags($_POST['name'])));
//========================================
$sql = <<< EOF
insert into member(email,name) values({$email},{$name})
EOF;
//========================================

なお、上記はDB接続が正常に行われていることを前提に書いていますが、その辺の確認は終わっているのですよね?

あと、「mysql_close($link);」もお忘れなく。

投稿日時 - 2009-03-30 10:05:34

あなたにオススメの質問