2017-11-17 3 views
0

私はPHPがとても新しいです。私はここに私のコードに適合する答えを見つけようとしましたが、何も見つかりませんでした。リフレッシュ時にDBの挿入が重複しないようにするにはどうすればよいですか?

F5キーを押すと、フォームからの最後の挿入がデータベースに複製されます。別のページにリダイレクトせずにどうやってそれを防ぐのですか?

私は$_SESSIONについていくつかの回答を見ましたが、私はそれを使用する方法を理解していませんでした。 私は訂正コードの説明をしたいと思います、ありがとうございます。

PS、db接続は別のファイルにあります。私に答える必要がある場合は、それを入れます。

は、ここに私のコードです:

addToMembersList.php

<DOCTYPE html5> 
<html> 
    <head> 
    <?php 
     include_once "db_connect.php"; 

     $member=mysqli_query($mysqli,"select * from members"); 
    ?> 
    <style> 
     table,tr,td{ 
     border: 1px solid black; 
     border-collapse: collapse; 
     } 
    </style> 
    </head> 
    <body> 
    <table> 
     <tr> 
     <td><b>First name</b></td> 
     <td><b>Last name</b></td> 
     <td><b>Email</b></td> 
     <td><b>Website</b></td> 
     <td><b>Comment</b></td> 
     <td><b>Gender</b></td> 
     </tr> 
     <?php 
     if($member){ 
      while($row = $member->fetch_assoc()){ ?> 
      <tr> 
       <td><?php echo $row['first_name'];?></td> 
       <td><?php echo $row['last_name'];?></td> 
       <td><?php echo $row['email'];?></td> 
       <td><?php echo '<a href="'.$row['website'].'">'.$row['website'].'</a>';?></td> 
       <td><?php echo $row['comment'];?></td> 
       <td><?php echo $row['gender'];?></td> 
       <td><button type="submit" onclick="deleteMember.php" value="$row['id']">Delete</button></td> 
      </tr> 
      <?php } 
     }?> 
    </table> 
    </body> 
</html> 



$query = "insert into members (first_name, last_name, email, website, comment, gender) values ('%s', '%s', '%s', '%s', '%s', '%s')"; 
     $query = sprintf($query,$_POST['fName'], $_POST['lName'], $_POST['email'], $_POST['website'], $_POST['comment'], $_POST[$gender_select]); 
     $result = $mysqli ->query($query); 
    } 
    } 

?> 

のindex.php

<DOCTYPE html5> 
<html> 
    <head> 
    <script src="https://code.jquery.com/jquery-1.12.4.js"></script> 
    <script> 
     function loadmembersList(response,textStatus,jqXHR){ 
     request = $.ajax({ 
     url:"memberListRequest.php", 
     type:"get" 
     }) 
     request.done(function(response,textStatus,jqXHR){ 
      $("#member_list").html(response); 
     }); 
     } 
     $(document).ready(loadmembersList); 
    </script> 
    </head> 
    <body> 
    <form action="", method="POST"> 
     First name:<input type="text" name="fName"> 
     <br> 
     Last name:<input type="text" name="lName"> 
     <br> 
     Email:<input type="text" name="email"> 
     <br> 
     Website:<input type="text" name="website"> 
     <br> 
     Comment:<input type="textarea" name="comment" placeholder="your text here"> 
     <br> 
     Gender:<input type="radio" name="Male"> Male <input type="radio" 
name="Female"> Female <input type="radio" name="Other"> Other 
     <br> 
     <input type="submit"> 
    </form> 
    <div id="member_list"></div> 
    </body> 
</html> 
+3

一方、 ''には '!'がありません。今、あなたが重複を避けたいのであれば、これを行う/修正する方法があまりにも多くあります。あなたはそれをGoogleにすることができます。多くの結果がありますが、私はそれを100%確信しています。 –

+0

解決策は、クライアントがそのページに座らないようにすることです。 302を別のステータス/確認ページに発行します。 – Sammitch

+0

'

答えて

1

一般的な解決策は、ポストリダイレクト-getのパターンを使用することです。 DB操作を行うスクリプトへのユーザー投稿からのデータ収集フォームは、結果を示すページへの302リダイレクトで応答する。これの欠点は、次のページに移動するためにサーバーに少なくとも2回連続してラウンドトリップする必要があることです。

あなたのコードにはsql injectionが付いていますが、あなたが記述した動作を考えると、cross site request forgeryの脆弱性もあります。 csrfトークンを使用して、重複したサブミットを検出することができます。

適切な主キー/ユニークインデックスを設定し、重複した送信を無視すると、重複するレコードが作成されなくなります。

ユーザーがjavascriptを使用して送信ボタンを押すと、フォーム内にフラグを設定することもできます。その後、フラグがパラメータに設定されている場合にのみインサートを実行しますが、JavaScriptが無効な場合の計画を立てることを忘れないでください。

もう1つの解決策は、ページナビゲーションイベントではなく、ajaxリクエストでデータサーバーサイドを送信することです。

おそらくもっと解決策があります。

関連する問題