将相同的记录多次添加到数据库而不是一次
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,请注意代码中的注释(//如果按钮是提交,则无需关注点击处理程序)以上是关于将相同的记录多次添加到数据库而不是一次的主要内容,如果未能解决你的问题,请参考以下文章
在 nedb 中添加的记录是单一的,但为啥 VUE 会多次存储相同的记录?