アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHP,HTMLで顧客登録画面を作っていて、同じ情報を登録できないようにしたいのですが、どうやったらそんなプログラムができるんでしょうか?いろんな人の意見を知りたいです。

一応ソースコードを載せておきます。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta charset="utf8">
<meta name="viewport" content="width=device-width">
<title>顧客登録</title>
<link rel="stylesheet" href="ser_style.css">
<script type="text/javascript">
function check(){
var flag = 0;
if(document.form1.C_name.value == ""){
flag = 1;
}
else if(document.form1.C_num.value == ""){
flag = 1;
}
else if(document.form1.C_phon.value == ""){
flag = 1;
}
else if(document.form1.C_sa.value == ""){
flag = 1;
}
if(flag){
window.alert('項目に未入力がありました'); // 入力漏れがあれば警告ダイアログを表示
return false;
}
else{
return true;
}
}
</script>
</head>
<body>

<div class="content">
<h1>顧客登録</h1>
<form action="c_regi_veri.php" method="GET" name="form1" onSubmit="return check()">
<div class="control">
<label for="C_name">顧客名(全角カナのみ入力可)<span class="required">必須</span></label>
<input pattern="[^\x20-\x7E]*" id="C_name" type="text" name="C_name" value=""/>
</div>
<div class="control">
<label for="C_num">顧客番号(修正不可、半角数字のみ入力可)<span class="required">必須</span></label>
<input id="C_num" type="number" name="C_num" value=""/>
</div>
<div class="control">
<label for="C_phon">顧客電話番号(11桁まで入力可)<span class="required">必須</span></label>
<input id="C_phon" type="tel" type="tel" maxlength="11" name="C_phon" value=""/>
</div>
<div class="control">
<label for="C_sa">顧客住所<span class="required">必須</span></label>
<input id="C_sa" type="text" name="C_sa" value=""/>
</div>
<div class="control">
<input type="submit" value="登録">
</div>
</form>
<form action="menu.php" method="GET">
<div class="control">
<input type="submit" value="メニューへ">
</div>
</form>
</div>
</body>
</html>

質問者からの補足コメント

  • 皆さん、回答ありがとうございます。

    ちなみにですが、既存の情報の登録を防止するのにもセッション変数が役に立つのでしょうか?

    個人的には既存の情報が登録済みの場合、「既に登録済みです」というコメントを出力できるようにしたいです。

      補足日時:2021/01/26 17:39

A 回答 (3件)

案1. 識別子(token)で重複対策


(No.1 の回答にある「シリアル番号」と同じです)

PHP にてセッションを使用する様に設定する
https://www.php.net/manual/ja/intro.session.php

入力画面 PHP にて識別子を生成 (one time token)
識別子をフォーム内に加える (hidden要素)
セッションに識別子を記憶する

登録画面 PHP にて、フォーム情報とセッションから両者を読み出す
両者を突き合わせて一致したら成功
成功したら、セッションから識別子を削除

重複送信しても、二回目は一致せず失敗する
おまけに CSRF による外部からの攻撃も失敗する

案2. 登録済み情報を検証して重複対策

名寄せの精度を高めるため、入力フォーム値を正規化する
例) 電話番号はハイフンや括弧を削除、全角は半角に変換

登録済み情報を検索して、同じ値があるか検証
例) 顧客番号に同じ値があるなら登録失敗

名寄せして危険な値があれば警告 or 確認画面を表示する
例) 名前と住所が一致する値があれば、重複の可能性が高いと警告
例) 携帯型の電話番号で一致する値があれば、重複の可能性が高いと警告
例) 名前と電話番号と住所が一致するなら、ほぼ重複として失敗
    • good
    • 1
この回答へのお礼

回答ありがとうございました。
なんとか案2の方で上手くなりました。
ありがとうございました。

お礼日時:2021/01/26 22:06

>ここでいうシリアル番号



多重登録の防止なので、ページにたいしてなにかユニークなキーをつける、ということです。セッションキーのようなものです。あくまで、例えば、なので。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
とりあえず、ユニークの設定ができていなかったので気づけてよかったです。
ありがとうございました。

お礼日時:2021/01/26 19:49

同じ画面の二度押し防止ならいくつか手段があります。



1)サブミットボタンが押されたら、ボタンをJSで無効にする。
 →JSをハックされたらダメですが、そこまで想定しなくていいなら簡単

2)ページにシリアル番号をHIDDENで埋め込み、登録時にチェックする

など。

同一人物からの、意図的な二重登録禁止は、「名寄せ」という概念であるていど判別できます。

面倒なことを避けたいなら、上記だと、「電話番号」かな・・・
名前は、女性だと苗字が変わることもあるし。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
すいません、回答でわからないところがあるのですが、ここでいうシリアル番号というのは顧客名や顧客番号などのことをいうのですか?

お礼日時:2021/01/26 09:57

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