2011-09-05 118 views
2

我正在使用AJAX通過SQL在表中創建新行。我的代碼非常簡單,但我注意到它偶爾會在數據庫中創建重複條目(有時甚至是3)。有沒有辦法來防止這種情況?這裏是我的代碼(通過PHP回聲發送)。AJAX:重複條目

已更新的主要PAGE

echo " 
    <script language='javascript'> 


$('#newreportBTN').live(\"click\", function() { 

//Get variables from boxes 
     var data = $(\"#newreport\").serialize(); 

    $.ajax({ 
      type: 'POST', 
      url: \"report_new.php\",   
      data: data, 
      success: function (html) {    
       //if process.php returned 1/true (send mail success) 
       if (html==1) {     
        //Send notification to user 
        $('#adminReportInfo').fadeOut(300); 

       //if process.php returned 0/false (send mail failed) 
       } else alert('Sorry, unexpected error. Please try again later.');    
      }  
     }); 

     //cancel the submit button default behaviours 
     return false; 
    }); 


    </script> 
    "; 

report_new.php

<?php 
//Start session 
session_start(); 

//Include database connection details 
require_once('config.php'); 

//Array to store validation errors 
$errmsg_arr = array(); 

//Validation error flag 
$errflag = false; 

//Connect to mysql server 
$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); 
if(!$link) { 
    die('Failed to connect to server: ' . mysql_error()); 
} 

//Select database 
$db = mysql_select_db(DB_DATABASE); 
if(!$db) { 
    die("Unable to select database"); 
} 

//Function to sanitize values received from the form. Prevents SQL injection 
function clean($str) { 
    $str = @trim($str); 
    if(get_magic_quotes_gpc()) { 
     $str = stripslashes($str); 
    } 
    return mysql_real_escape_string($str); 
} 



$company = $_POST['company']; 
$claimnumber = $_POST['claimnumber']; 
$fullname = $_POST['fullname']; 
$dateofloss = $_POST['dateofloss']; 
$foruser = $_POST['foruser']; 
$status = $_POST['status']; 


//Input Validations 
if($company == '') { 
    $errmsg_arr[] = 'Company Missing'; 
    $errflag = true; 
} 
if($claimnumber == '') { 
    $errmsg_arr[] = 'Claim # Missing'; 
    $errflag = true; 
} 
if($fullname == '') { 
    $errmsg_arr[] = 'Full name missing'; 
    $errflag = true; 
} 


//If there are input validations, redirect back to the registration form 
if($errflag) { 
    $_SESSION['ERRMSG_ARR'] = $errmsg_arr; 
    session_write_close(); 
    header("location: user_error.php"); 
    exit(); 
} 

//Create INSERT query 
$qry = "INSERT INTO documents (company, claimnumber, fullname, dateofloss, foruser, status) VALUES ('$company', '$claimnumber','$fullname','$dateofloss','$foruser','$status')"; 
$result = @mysql_query($qry); 

//Check whether the query was successful or not 
if($result) { 
    //header("location: admin.php?status=new"); 
    echo '1'; 
    exit(); 
}else { 
    die("Query failed"); 
    echo mysql_error(); 
} 
?> 
+1

您確實不應該使用GET來插入數據。 GET應該只是讀取數據。你有這個特殊原因嗎? –

+0

@Tieson:使用本教程:http://www.queness.com/post/160/create-a-ajax-based-form-submission-with-jquery – Zakman411

+0

我明白了。你沒有義務接受我的建議,但現在你違反了慣例。使用POST也很容易,因爲可以使用'.post()'和''方便地序列化和提交表單。serialize()'方法。我會在下面發佈一些示例代碼。 –

回答

0

,除非你按下按鈕一次以上這段代碼不應該創建一個以上的記錄。你也不必逃避,請點擊這裏

$('#newreportBTN').live(\"click\" ... 

也嘗試使用.live().click()代替

+0

它雖然。我沒有按兩次。不幸的是,我需要現場活動,因爲我所有發生這種情況的div最初是隱藏的 – Zakman411

+0

另外,轉義是因爲代碼是通過php回顯 – Zakman411

1

檢查以下內容:

例:http://jsfiddle.net/FZ7Dk/

$(function() { 

    $('#newreportBTN').live('click', function(e) { 
     e.preventDefault(); 

     /*Code here*/ 

     /*on success*/ 
     $('#newreportBTN').unbind(); 
     $('#newreportBTN').bind('click'); 
    }); 

}); 
+0

什麼是e.preventDefault()函數?你能解釋一下這些嗎?新的JavaScript ... – Zakman411

+1

@ Zakman411這是一個由jQuery提供的方法,以及防止元素的默認操作:http://api.jquery.com/event.preventDefault/ –

0
function addtoGrid(empid){ 

       var arraycp=new Array(); 

       var arraycp = $.merge([], myArray2); 

       var items= new Array(); 
       for(i=0;i<empid.length;i++){ 

        items[i]=empid[i]; 
       } 

       var u=1; 
       $.each(items,function(key, value){ 

        if(jQuery.inArray(value, arraycp)!=-1) 
        { 

         // ie of array index find bug sloved here// 
         if(!Array.indexOf){ 
          Array.prototype.indexOf = function(obj){ 
           for(var i=0; i<this.length; i++){ 
            if(this[i]==obj){ 
             return i; 
            } 
           } 
           return -1; 
          } 
         } 

         var idx = arraycp.indexOf(value); 
         if(idx!=-1) arraycp.splice(idx, 1); // Remove it if really found! 
         u=0; 

        } 
        else{ 

         arraycp.push(value); 

        } 


       } 


      ); 

       $.each(myArray2,function(key, value){ 
        if(jQuery.inArray(value, arraycp)!=-1) 
        { 

         // ie of array index find bug sloved here// 
         if(!Array.indexOf){ 
          Array.prototype.indexOf = function(obj){ 
           for(var i=0; i<this.length; i++){ 
            if(this[i]==obj){ 
             return i; 
            } 
           } 
           return -1; 
          } 
         } 

         var idx = arraycp.indexOf(value); // Find the index 
         if(idx!=-1) arraycp.splice(idx, 1); // Remove it if really found! 
         u=0; 

        } 
        else{ 


        } 


       } 


      ); 
       $.each(arraycp,function(key, value){ 
        myArray2.push(value); 
       } 


      );if(u==0){ 

       } 
       var courseId1=$('#courseid').val(); 
       $.post(

       "<?php echo url_for('payroll/LoadGrid') ?>", //Ajax file 



       { 'empid[]' : arraycp }, // create an object will all values 

       //function that is called when server returns a value. 
       function(data){ 


        //var childDiv; 
        var childdiv=""; 
        var i=0; 

        $.each(data[0], function(key, value) { 
         var word=value.split("|"); 
            var diable='<?php echo $disabled; ?>'; 
            childdiv="<div class='pagin' id='row_"+i+"' style='padding-top:10px;'>"; 
            childdiv+="<div class='centerCol' id='master' style='width:100px;'>"; 
            childdiv+="<div id='employeename' style='height:25px; padding-left:3px;'>"+word[0]+"</div>"; 
            childdiv+="</div>"; 

            childdiv+="<div class='centerCol' id='master' style='width:220px;'>"; 
            childdiv+="<div id='employeename' style='height:25px; padding-left:3px;'>"+word[1]+"</div>"; 
            childdiv+="</div>"; 

            childdiv+="<div class='centerCol' id='master' style='width:100px;'>"; 
            childdiv+="<div id='employeename' style='height:25px; padding-left:3px;'>"+word[2]+"</div>"; 
            childdiv+="</div>"; 

            childdiv+="<div class='centerCol' id='master' style='width:75px;'>"; 
            childdiv+="<div id='employeename' style='height:25px; padding-left:3px;'>"+word[3]+"</div>"; 
            childdiv+="</div>"; 

            childdiv+="<div class='centerCol' id='master' style='width:75px;'>"; 
            childdiv+="<div id='employeename' style='height:25px; padding-left:3px;'>"+word[4]+"</div>"; 
            childdiv+="</div>"; 

            childdiv+="<div class='centerCol' id='master' style='width:50px;'>"; 
            childdiv+="<input style='width:50px; height:13px; padding-left:0px; ' id='chkconfirm' name='chkconfirm[]' type='checkbox' value='1' "+diable+" '<?php if($SalarayIncrement->inc_confirm_flag==1){ echo "checked"; }; ?>' />"; 
            childdiv+="</div>"; 

            childdiv+="<div class='centerCol' id='master' style='width:100px;'>"; 
            childdiv+="<input style='width:90px; height:13px; padding-left:0px; ' id='txtcomment' name='txtcomment[]' type='text' maxlength='200' "+diable+" value='<?php echo $SalarayIncrement->inc_comment; ?>' />"; 
            childdiv+="</div>"; 

            childdiv+="<div class='centerCol' id='master' style='width:70px;' >"; 
            childdiv+="<div id='employeename' style='height:25px; padding-left:3px;'><a href='#' style='width:70px;' onclick='deleteCRow("+i+","+word[8]+")'><?php echo __('Remove') ?></a>"; 
            childdiv+="<input type='hidden' name='hiddenPreviousSalary[]' value="+word[2]+" >"; 
            childdiv+="<input type='hidden' name='hiddenNewSalary[]' value="+word[3]+" >"; 
            childdiv+="<input type='hidden' name='hiddenIncrement[]' value="+word[4]+" >"; 
            childdiv+="<input type='hidden' name='hiddenEmpNumber[]' value="+word[8]+" >"; 
            childdiv+="<input type='hidden' name='hiddenPreviousSal[]' value="+word[5]+" >"; 
            childdiv+="<input type='hidden' name='hiddenNewSal[]' value="+word[6]+" >"; 
            childdiv+="<input type='hidden' name='hiddenGrade[]' value="+word[7]+" >"; 
            childdiv+="</div>"; 
            childdiv+="</div>"; 
            childdiv+="</div>"; 
            // 

            $('#tohide').append(childdiv); 


         k=i; 
         i++; 
        }); 
        pagination++; 

        $(function() { 

         if(pagination > 1){ 
         $("#tohide").depagination(); 
         } 
         $("#tohide").pagination(); 
        }); 
       $.each(data[1], function(key, value) { 
         var Employee=value.split("|"); 
         alert(Employee[0]+" - "+Employee[1]+"<?php echo __(" can not perform increment, please edit the Basic salaray") ?>"); 
       }); 
       }, 

       //How you want the data formated when it is returned from the server. 
       "json" 

      ); 


      } 

通過你的ID,以addTogrid功能的陣列,這將prvent重複數據

0

這有點離題,但你可以大大簡化您的表單提交,就像這樣:

<script type="text/javascript"> 

    $('#newreportBTN').click(function(e) { 

     var data = $("#your_form_id_here").serialize(); 

     $.post({ 
      url: "report_new.php",   
      data: data, 
      success: function (html) {    
       // handle result    
      }  
     }); 

     //cancel the submit button default behaviours 
     e.preventDefault(); 
    }); 

</script> 

這也遵循GET請求應該只用於公約(在由HTTP動詞本身暗示)檢索數據,而使用POST或PUT將數據發送到服務器進行處理。希望這是有用的...

+0

感謝發佈 - 嘗試了這一點,我的report_new.php頁面不執行...要獲取該頁面上的值,我使用'\t $ company = $ _GET ['company'];'等它應該工作嗎?當我在討論的頁面上使用GET時,它可以正常工作。 – Zakman411

+0

@ Zakman411您必須更改您的.php代碼才能使用'$ _POST'數組,因爲$ _GET數組僅在GET提交時填充。但索引將保持不變,所以它應該只是查找和替換的問題。 –

+0

讓POST開始工作(使用您提供的代碼),但它只在我取出e.preventDefault()時才起作用; (這當然會使它重定向 - 打敗AJAX。任何幫助?不知道我在做什麼錯誤。) – Zakman411

0

終於明白了這一點。對於任何人在將來有這個問題:

我正在使用PHP回顯打印出的JavaScript代碼點擊一個項目。避免這種情況如果可能。我認爲發生的事情是這段代碼可能已經被多次回顯,可能會導致它多次運行。我將該代碼從PHP回顯中移至HTML頁面中的標題部分(儘管可能不總是使用它,但可以防止出現此錯誤。)