将相同的记录多次添加到数据库而不是一次

Posted

技术标签:

【中文标题】将相同的记录多次添加到数据库而不是一次【英文标题】: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注入 【参考方案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 event 到document。你可能想给.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,请注意代码中的注释(//如果按钮是提交,则无需关注点击处理程序)

以上是关于将相同的记录多次添加到数据库而不是一次的主要内容,如果未能解决你的问题,请参考以下文章

Android通知会多次打开,而不是只打开一次

在 nedb 中添加的记录是单一的,但为啥 VUE 会多次存储相同的记录?

sql语句 分次(多次)获取不重复记录,请高手赐教!

gtkmm 是不是可以多次将相同的小部件添加到 vbox

Kendo UI Grid添加新记录而不是将数据发布到服务器端

MPMediaItem 的唯一 ID,而不是 persistentID