プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっています。

早速質問です。
ユーザ登録フォームの作成をしています。
Select文を使って2重登録の確認後、DBに登録するのですが
2重登録はちゃんと機能しているのに、登録が出来ません。
どのようにしたらいいか、アドバイスいただけますか?
お手数ですが、よろしくお願いします。

mysql_query("lock tables user_data write");

$sql = "select USER from user_data where USER = '" . $_POST["USER"] . "'";
$res = mysql_query($sql);

if (mysql_num_rows($res) > 0) {
echo "すでに登録済みです。";
mysql_query("unlock tables");
mysql_close($con);
exit;
}

$sql = "insert into user_data(USER, pass) values ('" . $_POST["USER"] . "','" . $_POST["pass"] . "');";
mysql_query($sql);

mysql_query("unlock tables");
mysql_close($con);

A 回答 (6件)

たびたびです。



>mysql_query($sql)は何にも表示されませんでした。

print_fじゃなかったですね。print_rかvar_dumpで表示させてみて下さい。trueかfalseになると思います。trueだとしたらinsert文は成功している事になります。それで挿入されてないとしたらちょっとわからないです。もしfalseだとしたら、その直後にmysql_error関数を実行すると、エラーメッセージが取得できます。

あとこれはトラブルの原因とは関係ないと思いますが、前の画面で入力チェックを行っていたとしても、ここでもやった方がいいですよ。例えば閲覧者がスクリプトなど組んで直接この画面を叩く事も有り得る訳ですから。フォームから入力は意図しないものがある事を常に想定していた方が安全です。
    • good
    • 0
この回答へのお礼

出来ました!

なるほど、こうやって一つづつ確認しながらやっていくんですね。
もっと本にもこういうことが書いてあればいいのに…。
お勧めの本とかありますか?

結局問題は基本的なことで、省略していた部分に不要な'があり上手く行ってませんでした。

本当にありがとうございました。

お礼日時:2005/06/08 17:57

オススメの本というのは特に思い当たらないんですが、プログラムというのは理屈なのでうまく動かない時はほぼ100%どこかにミスがあるもんです。

ですから、一つ一つ変数の中を確認してミスを探すしかない、という事ですね。

特に原因がわからないトラブルほど、タイプミスや恥ずかしいミスです(^^;。これを心に留めておいて下さい。
    • good
    • 0
この回答へのお礼

まさに今回のミスも本当に小さなミスでした。
よく心に留めて行いたいと思います。

本当にありがとうございました。

お礼日時:2005/06/08 19:17

書き忘れました。



そのテーブルのフィールドはUSERとpassだけですか?他にnullを許さないフィールドはないんですよね?
    • good
    • 0
この回答へのお礼

他のフィールドはNULLを可にしてテストしています。

それと、入力値の確認は2重にした方が良いんですね。
これは是非反映させたいと思います。

問題は解決しましたが、締め切ってしまうと回答が受け付けられないので、19時ごろに締め切る予定です。

何回も丁寧な対応、ありがとうございました。

お礼日時:2005/06/08 18:00

select文のリターンの$res、それとinsert文のmysql_queryの返り値をprint_fで表示させてみましょう。

falseになってるという事はありませんか?

期待通りに動かない時は関数の返り値を一つ一つ確認していくしかないと思いますよ。それがデバッグというものです。

で、生成されているSQL文に間違いはないんですよね?入力チェックなどが行われていないのは単にテストプログラムなのか、抜粋なのだと思いはしましたが。
    • good
    • 0
この回答へのお礼

ありがとうございます。

$resはResource ID
$sqlは"insert..."というSQL文(単体で動くので間違いはなさそう)
mysql_query($sql)は何にも表示されませんでした。

入力チェックはもう一つ前に行っています。
入力画面→確認画面→登録画面

宜しくお願いします。

お礼日時:2005/06/08 15:45

;が不要です。



$sql = "insert into user_data(USER, pass) values ('" . $_POST["USER"] . "','" . $_POST["pass"] . "')";

こうでしょう。
    • good
    • 0
この回答へのお礼

あー!すいません。
色々チューニングしているときに試しで入れた間違えのまま貼り付けちゃいました。
;抜きのでも動かないんですよ。

ご指摘ありがとうございます。

お礼日時:2005/06/08 13:46

insert文の実行時にエラーか何か出てないのでしょうか?



sqlの実行前に$sqlをprintして、それをmysqlクライアントから実行したらうまく行きますか?最初のselect文もやってみたら良いと思います。mysqlクライアントでエラーが出ればSQLの生成がうまく行ってない、エラーが出ていなければスクリプトでのmysqlとの接続などが疑われます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
以前同じスクリプトで問題なく登録できたのですが、今回は出来ません。
エラーが出ないところを見るとスクリプトでのmysqlへの接続のようですね。
どこをいじったらいいかアドバイスをいただいても宜しいですか?

お礼日時:2005/06/08 13:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!