2016-10-18 2 views
0

を使用してフォームの再提出を防止し、これは私のコードです:PHPは、だから私はセッション を使用してフォームの再提出を阻止しようとしていたセッション

<?php 
session_start(); 
if(isset($_GET['unid'])) 
{ 
    if ($_GET['unid']==$_SESSION["uid"]) 
    { 
     echo "Form is Submited do something"; 
    } 
    else 
    { 
     echo "no you can't do that"; 
    } 
} 
$unid = md5(uniqid()); 
$_SESSION["uid"] = $unid; 
?> 
<form method="GET"> 
    <input name="name" value="test"> 
    <input name="unid" value="<?php echo $unid;?>"> 
<input type="submit"> 

、それが動作します...しかし、ユーザーが別のタブを開いた場合、それは解除されますどうすれば修正できますか?

+0

「それは壊れます」とはどういう意味ですか?これは、フォームが($ unidの既存の値で)再度提出できることを意味しますか? '$ _SESSION'に' unid'値があることが検出されたらどうなりますか? –

+0

同じページの2つのタブがある場合、そのうちの1つはフォームを送信し、もう1つのページは表示されません –

答えて

0

これはわかりませんが、新しいグローバルセッション変数を割り当てることができます(例:$_SESSION['checkSub'])。したがって、フォームが提出されたら1またはtrueに設定し、1またはfalseでない場合はフォーム提出のみにしてください。

0

新しい一意のIDを生成する前に、セッションにunidが設定されているかどうかを確認できます。以下の更新されたコードを参照してください。

<?php 
    session_start(); 
    if(isset($_GET['unid'])) 
    { 
     if (isset($_SESSION['unid']) && $_GET['unid']==$_SESSION['unid']) 
     { 
      //form has been submitted with matching unid - process it as needed 
      unset($_SESSION['unid']); 
     } 
     else 
     { 
      // Form was resubmitted or some other logic error 
     } 
    } 
    $unid = ''; //declare here for good scope 
    if (isset($_SESSION["unid"])) { 
      $unid = $_SESSION["unid"]; 
    } 
    else { 
      $unid = md5(uniqid()); 
      $_SESSION["unid"] = $unid; 
    } 
    ?> 
    <form method="GET"> 
     <input name="name" value="test"> 
     <input name="unid" value="<?php echo $unid;?>"> 
    <input type="submit"> 
+0

あなたのコードは良いですが、問題はまだ解決していません。 –

+0

[@Charlie](http: /stackoverflow.com/users/145976/charlie)[unset() 'call](http://stackoverflow.com/posts/40098410/revisions)を追加しないと、フォームは両方とも提出されます(最初と2番目タブ)を同じunid値で –

0

はむしろフォームメソッドGETを使用するよりも、POSTを使用するようにしてください。それはあなたのために働くでしょう。 $_POST配列にはフォームが送信されるときにデータが格納されるだけなので、フォームを送信するかどうかを知るためにセッションを使用する必要はありません。

関連する問題