2016-10-18 4 views
0

So verwenden Ich versuche Form Wiedervorlage mit Sitzungen und dies ist mein Code zu verhindern:php verhindern Form Neuvorlage Sitzungen

<?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"> 

und es funktioniert ... aber wenn der Benutzer einen anderen Tab geöffnet wird, dann wird es brechen Wie kann ich es reparieren?

+0

was genau bedeutet "es wird brechen"? Bedeutet das, dass das Formular erneut übergeben werden kann (mit einem vorhandenen Wert für $ unid)? Was soll passieren, wenn wir in '$ _SESSION' einen' unid' Wert finden? –

+0

Wenn Sie zwei Registerkarten für die gleiche Seite haben, wird einer von ihnen das Formular und die andere Seite wird nicht gesendet –

Antwort

0

Ich bin mir nicht sicher, aber möglicherweise zuweisen eine neue globale Session-Variable wird funktionieren, sagen $_SESSION['checkSub']. Sobald das Formular gesendet wurde, legen Sie es auf 1 oder true fest und lassen Sie das Formular nur dann senden, wenn es nicht 1 oder false ist.

0

Sie können überprüfen, ob die in der Sitzung festgelegt ist, bevor Sie eine neue eindeutige ID generieren. Siehe aktualisierte Code unten:

<?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

Ich kann sagen, dass Ihr Code ist besser, aber das Problem ist noch nicht gelöst .. –

+0

[@Charlie] (http://stackoverflow.com/users/145976/charlie) [hinzugefügt, dass 'unset()' call] (http://stackoverflow.com/posts/40098410/revisions) - ohne das, werden die Formulare beide (in erster und zweiter Tabs) mit demselben unid-Wert –

0

Anstatt mit Formularmethode GET, versuchen POST zu verwenden. Es wird für Sie arbeiten. Das Array $_POST enthält nur Daten, wenn das Formular gesendet wird. Sie sollten daher die Sitzung nicht verwenden müssen, um zu wissen, ob das Formular gesendet wurde oder nicht.