【问题标题】:Adds same record multiple times to database instead of just once将相同的记录多次添加到数据库而不是一次
【发布时间】:2013-10-16 23:34:50
【问题描述】:

我的 php 脚本有问题,它添加的记录比它想象的要多。我有几个“子表”的大表,其中包含人们的薪水及其分布:

姓名#PayRate#分配#Annual

约翰·史密斯 # 10,000 # 20.00% # 50,000 # 编辑 # 删除
彼得潘 # 100,000 # 100.00% # 100,000 # 编辑 # 删除

添加新人

当您单击新人员时,弹出表单,键入所有信息,将人员添加到数据库,ajax 返回信息并将人员添加到列表末尾。这里是问题,当我点击一个“子表”添加人员时,它添加了一个人并正确打印,但是当我转到第二个“子表”并添加一个人时,它会添加两次人员(插入两条相同的记录到数据库),如果我单击第三个“子表”上的添加人员,它将添加一条记录三次......它应该只添加一次记录。这是我的js脚本:

$('.addbtt').on('click', function(){
    value= "";
    document.getElementById("updform").reset();
    var glnumber = $(this).parent().parent().find('#glno').text();
    var objid = glnumber.substring(7,12);
    value += glnumber.substring(10,12);
    if(objid=='51001'){
        $('.modal-title').html("Add person - Full time");
        $('#glnumber').empty().val(glnumber);
    }else if(objid=='51002'){
        $('.modal-title').html("Add person - Part time");
        $('#glnumber').empty().val(glnumber);
    }else if(objid=='51009'){
        $('.modal-title').html("Add person - GA");
        $('#glnumber').empty().val(glnumber);
    }else if(objid=='51010'){
        $('.modal-title').html("Add person - GE");
        $('#glnumber').empty().val(glnumber);
    };

    $('#updform').submit(function(){
        var formData = $(this).serialize();
        $.post('includes/updatesal.php',formData,processData);
        function processData(data){
            if(value == 01){
                $('#addperson1').before(data);
            }else if(value == 02){
                $('#addperson2').before(data);
            }else if(value == 09){
                $('#addperson3').before(data);
            }else if(value == 10){
                $('#addperson4').before(data);
            }else{
                alert("Your are doing something you shouldn't! :)") 
            };
        }; //end of processData
        return false;
    });
});

我认为问题在于我的“添加人员按钮”,因为它还向数据库添加了两条记录。这是我的php函数:

$insertSQL1 = "INSERT INTO salaries (gl_number,name,pay_rate,distribution,annual)
                VALUES ('".$glnumber."','".$name."','".$payRate."','".$dist."','".$annual."')";
        $insertSQL1 .= "; SELECT SCOPE_IDENTITY() AS RECORD_ID";    
        $stmt1 = sqlsrv_query(Database::GetInstance()->databaseConnection, $insertSQL1);
        # IF THERE IS AN ERROR
        if(!$stmt1){
            echo "Error";   
        }else{
            $id = Database::GetInstance()->LastInsertId($stmt1);
        }
        # IF ALL QUERIES WERE SUCCSESSFUL, COMMIT THE TRANSACTION, OTHERWISE ROLLBACK
        if($stmt1 && !$errors){
            sqlsrv_commit(Database::GetInstance()->databaseConnection);
            # FREE THE STATEMENT
            Database::GetInstance()->FreeDBStatement($stmt1);

我正在努力解决这个问题一个星期,有人可以帮忙吗?

【问题讨论】:

  • 您是否使用浏览器调试器(如 firebug)?你看到两个帖子了吗?
  • 他们给出了正确的答案。我想给你一个建议:不要使用字符串连接产生sql,这会导致sql注入

标签: javascript php jquery sql


【解决方案1】:

问题是由您的.submit() 事件处理程序.click() 事件处理程序引起的——因此您每次点击都会创建一个新的、相同的.submit() 处理程序。 p>

要修复,只需将.submit() 处理程序从那里取出:

$('.addbtt').on('click', function(){
    value= "";
    document.getElementById("updform").reset();
    var glnumber = $(this).parent().parent().find('#glno').text();
    var objid = glnumber.substring(7,12);
    value += glnumber.substring(10,12);
    if(objid=='51001'){
        $('.modal-title').html("Add person - Full time");
        $('#glnumber').empty().val(glnumber);
    }else if(objid=='51002'){
        $('.modal-title').html("Add person - Part time");
        $('#glnumber').empty().val(glnumber);
    }else if(objid=='51009'){
        $('.modal-title').html("Add person - GA");
        $('#glnumber').empty().val(glnumber);
    }else if(objid=='51010'){
        $('.modal-title').html("Add person - GE");
        $('#glnumber').empty().val(glnumber);
    };
});

$('#updform').submit(function(){
    var formData = $(this).serialize();
    $.post('includes/updatesal.php',formData,processData);
    function processData(data){
        if(value == 01){
            $('#addperson1').before(data);
        }else if(value == 02){
            $('#addperson2').before(data);
        }else if(value == 09){
            $('#addperson3').before(data);
        }else if(value == 10){
            $('#addperson4').before(data);
        }else{
            alert("Your are doing something you shouldn't! :)") 
        };
    }; //end of processData
    return false;
});

【讨论】:

  • $('#updform').submit(function(){ var formData = $(this).serialize(); $.post('includes/updatesal.php',formData,processData) ; 函数处理数据(数据){...
  • 它应该可以正常工作。您是否正在动态添加该表单?尝试用$(document).on('submit', '#updform', function(){替换$('#updform').submit(function(){
  • $(document).on('submit', '#updform', function(){} 有效...我不明白为什么其他人没有
  • 您必须在创建 #updform 元素(在 HTML 中)之前创建了 .submit 事件处理程序(在 JS 中)。改用$(document).on('submit,'#updform delegates the eventdocument。你可能想给.addbtt同样的待遇。
  • 就是这样,表单是使用 .load() 加载的,所以它是在 .submit 之后创建的
【解决方案2】:

您还可以将表单清除脚本移动到“提交处理程序”内部

// No need following on click handler, if button is submit
$('.addbtt').on('click', function(){

});

$('#updform').submit(function(){
value= "";
    document.getElementById("updform").reset();
    var glnumber = $(this).parent().parent().find('#glno').text();
    var objid = glnumber.substring(7,12);
    value += glnumber.substring(10,12);
    if(objid=='51001'){
        $('.modal-title').html("Add person - Full time");
        $('#glnumber').empty().val(glnumber);
    }else if(objid=='51002'){
        $('.modal-title').html("Add person - Part time");
        $('#glnumber').empty().val(glnumber);
    }else if(objid=='51009'){
        $('.modal-title').html("Add person - GA");
        $('#glnumber').empty().val(glnumber);
    }else if(objid=='51010'){
        $('.modal-title').html("Add person - GE");
        $('#glnumber').empty().val(glnumber);
    };

    var formData = $(this).serialize();
    $.post('includes/updatesal.php',formData,processData);
    function processData(data){
        if(value == 01){
            $('#addperson1').before(data);
        }else if(value == 02){
            $('#addperson2').before(data);
        }else if(value == 09){
            $('#addperson3').before(data);
        }else if(value == 10){
            $('#addperson4').before(data);
        }else{
            alert("Your are doing something you shouldn't! :)") 
        };
    }; //end of processData
    return false;
});

【讨论】:

  • 谁说.addbtt 按钮是#updform 的一部分?
  • @Blazemonger,请注意代码中的注释(//如果按钮是提交,则无需关注点击处理程序)
猜你喜欢
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 2010-11-02
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多