2011-11-05 118 views
3

可能重複:
Avoiding form resubmit in php when pressing f5尋找一個解決方案,GET/POST DOUBLE數據提交

我需要如何防止雙數據提交給mysql數據庫的幫助。

這通常發生在提交後,用戶點擊REFRESH按鈕。

每當我發送數據使用HTML網頁形式來處理他們在服務器端我最好省略表單的動作屬性,它解釋了文件將被自己處理,並從第一行開始我將服務器端PHP腳本。在發送數據之前,我會嚴格檢查所有字段是否填寫正確,然後將該數據發送給將來的處理。使用PHP腳本我會檢查被點擊的web表單按鈕是否爲空,然後通過建立的連接到mysql執行操作查詢。 使用頭部函數重定向到自己是防止雙重數據提交的最佳方式?

你有什麼想法嗎?

此外,我會包括代碼

<?php 
    include_once '../config.php'; 
    include_once '../functions.php'; 


    if (isset($_POST['bDep'])){ 
     $flt=$_POST['flt']; 
     $num=$_POST['fltNum']; 
     $acr=$_POST['acr']; 
     $city=$_POST['city']; 
     $fTime=$_POST['fTime']; 
     $bReg=$_POST['bReg']; 
     $eReg=$_POST['eReg']; 
     $acomp=$_POST['aircomp']; 
     $gate=$_POST['gate']; 
     $dte=$_POST['data']; 

     $tm=explode(":",$fTime); 
     if ($tm[0]<3) $p=1; 
     else $p=0; 

     $otmena=$_POST['cancel']; 
     if ($otmena==1) $stat=4; 
     else $stat=7; 



     $sql="INSERT INTO fltdep(FID, FLT, NUM, DEP, TO_FROM, IN_OUT, dte, Stat, BReg, EReg, Gate, AType, ALn, Cir, Hide) VALUES (0, '$flt', '$num','$fTime', $city,1, '$dte',$stat,'$bReg','$eReg','$gate',$acr,$acomp,$p,0)"; 
     if (mysql_query($sql)){ 
      echo "<p style='text-color:red;text-align:center;'>Успешно добавлена запись № </p>"; 
     }else { 
      echo "<p style='text-color:red;text-align:center;'>Ощибка при добавлении к базе</p>"; 

     } 
    unset($_POST['bDep']); 
    unset($_POST['flt']); 
    } 


?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html> 
    <head> 
     <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
     <title>Заполнение вылетов</title> 
     <link rel="stylesheet" href="../css/validationEngine.jquery.css" type="text/css"/> 
     <link rel="stylesheet" href="../css/template.css" type="text/css"/> 
     <link rel="stylesheet" href="../themes/base/jquery.ui.all.css" type="text/css"> 
     <link rel="stylesheet" href="../themes/base/flts.css" type="text/css"> 
     <link rel="stylesheet" href="../themes/base/tipsy.css" type="text/css" /> 
     <link rel="stylesheet" href="../themes/base/tipsy-main.css" type="text/css" /> 
     <link href="../themes/base/table.css" rel="stylesheet" type="text/css" /> 

     <script src="../js/jquery-1.6.min.js" type="text/javascript"></script> 
     <script src="../js/languages/jquery.validationEngine-en.js" type="text/javascript" charset="utf-8"></script> 
     <script src="../js/jquery.validationEngine.js" type="text/javascript" charset="utf-8"></script> 
     <script src="../js/jquery.maskedinput-1.3.js" type="text/javascript"></script> 

     <script src="../ui/jquery.ui.core.js"></script> 
     <script src="../ui/jquery.ui.widget.js"></script> 
     <script src="../ui/jquery.ui.button.js"></script> 
     <script src="../ui/jquery.ui.tabs.js"></script> 
     <script src="../ui/jquery.ui.datepicker.js"></script> 
     <script type="text/javascript" language="javascript"> 

      jQuery(document).ready(function(){ 
       // binds form submission and fields to the validation engine 
       $("#data").datepicker({ numberOfMonths: 1, dateFormat: 'yy-mm-dd' });        
       jQuery("#Departures").validationEngine(); 
      }); 
      $(function(){ 
       $('#fTime').mask('99:99',{placeholder:"_"});     
       $('#bReg').mask('99:99',{placeholder: "_"});     
       $('#eReg').mask('99:99',{placeholder: "_"});     
      }); 
      function SetAline() 
      { 
       var fl=new String($('#flt').val()); 
       if (fl.substr(0,2)=='TD' || fl.substr(0,2)=='td')  { $('#aircomp').val(1); $('#gate').val(2);} 
       else if (fl.substr(0,2)=='TJ' || fl.substr(0,2)=='tj') { $('#aircomp').val(1); $('#gate').val(1);} 
       else if (fl.substr(0,2)=='SM' || fl.substr(0,2)=='sm') { $('#aircomp').val(2); $('#gate').val(1);} 
       else if (fl.substr(0,2)=='SB' || fl.substr(0,2)=='sb') { $('#aircomp').val(3); $('#gate').val(1);} 
       else if (fl.substr(0,2)=='OR' || fl.substr(0,2)=='or') { $('#aircomp').val(4); $('#gate').val(1);} 
       else if (fl.substr(0,2)=='TA' || fl.substr(0,2)=='ta') { $('#aircomp').val(5); $('#gate').val(1);} 
       else if (fl.substr(0,2)=='SV' || fl.substr(0,2)=='sv') { $('#aircomp').val(6); $('#gate').val(1);} 
       else if (fl.substr(0,2)=='UT' || fl.substr(0,2)=='ut') { $('#aircomp').val(7); $('#gate').val(1);} 
       else if (fl.substr(0,2)=='SD' || fl.substr(0,2)=='sd') { $('#aircomp').val(8); $('#gate').val(1);} 
       else if (fl.substr(0,2)=='YA' || fl.substr(0,2)=='ya') { $('#aircomp').val(9); $('#gate').val(1);} 
       else if (fl.substr(0,2)=='CS' || fl.substr(0,2)=='cs') { $('#aircomp').val(10);$('#gate').val(1);} 
       else if (fl.substr(0,2)=='D9' || fl.substr(0,2)=='d9') { $('#aircomp').val(11);$('#gate').val(1);} 
      } 
      function SetRegTime() 
      { 
       var depTime=$('#fTime').val(); 

       var fl=new String($('#flt').val()); 
       var start,end; 
       if (fl.substr(0,2)=='TD' || fl.substr(0,2)=='td'){ 
        start='01:30'; 
        end='00:20'; 
       }else { 
        start='03:00'; 
        end='00:40'; 
       } 

       $('#bReg').val(TimeDiff(depTime,start));  
       $('#eReg').val(TimeDiff(depTime,end)); 
      } 
      function TimeDiff(a,b) 
      { 

       var first = a.split(":") 
       var second = b.split(":") 

        var xx; 
        var yy; 

        if(parseInt(first[0]) < parseInt(second[0])){   

         if(parseInt(first[1]) < parseInt(second[1])){ 

          yy = parseInt(first[1]) + 60 - parseInt(second[1]); 
          xx = parseInt(first[0]) + 24 - 1 - parseInt(second[0]) 

         }else{ 
          yy = parseInt(first[1]) - parseInt(second[1]); 
          xx = parseInt(first[0]) + 24 - parseInt(second[0]) 
         } 



        }else if(parseInt(first[0]) == parseInt(second[0])){ 

         if(parseInt(first[1]) < parseInt(second[1])){ 

          yy = parseInt(first[1]) + 60 - parseInt(second[1]); 
          xx = parseInt(first[0]) + 24 - 1 - parseInt(second[0]) 

         }else{ 
          yy = parseInt(first[1]) - parseInt(second[1]); 
          xx = parseInt(first[0]) - parseInt(second[0]) 
         } 

        }else{ 


         if(parseInt(first[1]) < parseInt(second[1])){ 

          yy = parseInt(first[1]) + 60 - parseInt(second[1]); 
          xx = parseInt(first[0]) - 1 - parseInt(second[0]) 

         }else{ 
          yy = parseInt(first[1]) - parseInt(second[1]); 
          xx = parseInt(first[0]) - parseInt(second[0]) 
         } 

        } 
       if(xx < 10) 
        xx = "0" + xx 
       if(yy < 10) 
        yy = "0" + yy 
       return (xx + ":" + yy); 
      } 
     </script> 
    </head> 
    <body> 
     <form id="Departures" class="formular" method="post" action=""> 
      <fieldset> 
       <legend> 
       ЗАПОЛНЕНИЕ ВЫЛЕТОВ <a href="FillArr.php"><i>Прилет</i></a> 

       </legend> 
       <label> 
        <span>Дата : </span> 
        <input class="validate[required] text-input" type="text" name="data" id="data" maxlength="12" value="<? (isset($_POST['data']))?($_POST['data']): date('Y-m-d') ;?>" /> 
       </label> 
       <label> 
        <span>Рейс : </span> 
        <input value="" class="validate[required] text-input" type="text" name="flt" id="flt" maxlength="5" onkeyup="SetAline();"/> 
       </label> 
       <label> 
        <label> 
        <span>№ рейса : </span> 
        <input value="" class="validate[required] text-input" type="text" name="fltNum" id="fltNum" maxlength="5"/> 
       </label> 
       <label> 
        <span>Тип ВС :</span> 
        <select name="acr" id="acr" class="validate[required]"> 
        <option value="">Выберите</option> 

        <?php 
         $AC= & getAC(); 
         while ($rowAC=mysql_fetch_array($AC)){ 
          $i++; 
           echo "<option value='".$rowAC['acode']."'>".$rowAC['name_ru']."</option>"; 
         } 
        ?> 
        </select> 
       </label> 
       <label> 
        <span>А/П прибт :</span> 
        <select name="city" id="city" class="validate[required]"> 
         <option value="">Выберите</option> 
         <?php 
          $city= & getCity(); 
          while ($rowCi=mysql_fetch_array($city)){ 
           $i++; 
            echo "<option value='".$rowCi['code']."'>".$rowCi['abbr_ru']."</option>"; 
          } 
         ?> 
       </select> 
       </label> 
       <label> 
        <label> 
        <span>Время отправления : </span> 
        <input value="" class="validate[required] text-input" type="text" name="fTime" id="fTime" maxlength="5" onBlur="SetRegTime();"/> 
       </label> 
       <label> 
        <label> 
        <span>Начало регистрации : </span> 
        <input value="" class="validate[required] text-input" type="text" name="bReg" id="bReg" maxlength="5" readonly="readonly" /> 
       </label> 
       <label> 
        <label> 
        <span>Конец регистрации : </span> 
        <input value="" class="validate[required] text-input" type="text" name="eReg" id="eReg" maxlength="5" readonly="readonly"/> 
       </label> 
       <label> 
        <span>Авиакомпания :</span> 
        <select name="aircomp" id="aircomp" class="validate[required]"> 
         <option value="">Выберите авиакомпанию</option> 
         <option value="option1">Таджик Эйр</option> 
         <?php 
          $Aline= & getAComp(); 
          while ($rowAline=mysql_fetch_array($Aline)){ 
           $i++; 
            echo "<option value='".$rowAline['acode']."'>".$rowAline['name_ru']."</option>"; 
          } 
         ?> 
        </select> 
       </label>  
      <label> 
        <span>Терминал :</span> 
        <select name="gate" id="gate" class="validate[required]"> 
         <option value="">Выберите</option> 
         <option value="1">1</option> 
         <option value="2">2</option> 

        </select> 
       </label> 
       <label> 
       <span>Отмена</span> 
        <input class="checkbox" type="checkbox" name="cancel" id="cancel" value="1"/> 
       </label> 
      </fieldset> 



      <input name="bDep" class="submit" type="submit" value="Заполнить"/><hr/> 
     </form> 
    </body> 
</html> 
+0

有很多關於這方面的問題。搜索「防止表單重新提交」並閱讀Post-Redirect-Get模式。 –

+0

好吧,我應該嘗試使用'header('Location:some_url');' –

回答

-2

你的方法(頭後重定向後)是必要的,但還不夠。

某些用戶按鏈接兩次(雙擊)。有時你的代碼可能會在這種情況下插入相同的記錄兩次。你需要編寫一個JavaScript,在第一次點擊後禁用提交按鈕。

相關問題