AJAX:重复条目

时间:2011-09-05 11:14:15

标签: javascript ajax jquery

我正在使用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();
}
?>

5 个答案:

答案 0 :(得分:1)

检查以下内容:

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

$(function() {

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

        /*Code here*/

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

});

答案 1 :(得分:0)

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

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

还尝试使用.click()代替.live()

答案 2 :(得分: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函数作为数组,这将防止重复数据

答案 3 :(得分: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>

这也遵循惯例(HTTP动词本身暗示)GET请求应仅用于检索数据,而POST或PUT用于将数据发送到服务器进行处理。希望这很有用......

答案 4 :(得分:0)

终于弄明白了。对于将来遇到此问题的任何人:

我使用PHP echo在点击项目时打印出javascript代码。如果可能,请避免这种情况。我认为发生的事情是代码段可能已多次回声,可能会激发它多次运行。我将代码从PHP回显移动到HTML页面中的标题部分(尽管可能并不总是使用它,但它可以防止出现此错误。)