AJAX:重复条目

AJAX: Duplicate Entries

本文关键字:AJAX      更新时间:2023-09-26

我使用AJAX通过SQL在表中创建新行。我的代码相当直接,但我注意到它偶尔会在数据库中创建重复的条目(有时甚至是3个(。有办法防止这种情况发生吗?这是我的代码(通过php echo发送(。

更新主页

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();
}
?>

检查以下内容:

  • 请确保只绑定一次事件。

  • 您可以解除特定选择器的所有事件绑定,然后重新绑定。

  • 您还可以添加preventDefault方法(http://api.jquery.com/event.preventDefault/(

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

$(function() {
    $('#newreportBTN').live('click', function(e) {
        e.preventDefault();
        /*Code here*/
        /*on success*/
        $('#newreportBTN').unbind();
        $('#newreportBTN').bind('click');
    });
});

除非您多次按下按钮,否则此代码不应创建多个记录。此外,你不需要逃离点击这里

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

同时尝试使用.click()而不是.live()

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函数,这将避免重复数据

这有点偏离主题,但您可以大大简化表单提交,如下所示:

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

这也遵循了约定(由HTTP谓词本身暗示(,即GET请求只应用于检索数据,而POST或PUT用于将数据发送到服务器进行处理。希望这是有用的。。。

终于明白了这一点。对于未来有此问题的任何人:

我使用PHP echo在点击一个项目时打印出javascript代码。尽可能避免这种情况。我认为发生的情况是,代码段可能已经被回显了好几次,可能也会导致它运行好几次。我将该代码从PHP echo移到了HTML页面的标题部分(尽管它可能并不总是被使用,但它可以防止此错误。(