询问一简单的Mysql问题,新增时偶尔会出现两条相同记录 我们有一个表,因为不能加唯一的主键,在操作该表的时候,偶尔会同时新增两条相同的记录,只是自增的ID不同。无论是前台提交还是后台程序的新增,都出现过这种情况,不知各位牛大侠们有遇到过否?前台提交,因为是人工操作,可能会涉及到鼠标触发两次的情况,但后台程序运行的新增应该不关两次提交的事吧,所以郁闷中~注:每次新增前都有记录是否存在的判断。在线等答案! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可能的原因:1、鼠标触发两次2、退后刷新解决办法:针对问题1:提交表单后,button按钮变为灰色(disabled 为 true)参考代码:function validate(theform) { theform.topicsubmit.value = '正在提交订单, 请稍后……'; theform.topicsubmit.disabled = true; return true;}针对问题2的参考代码:<?phpsession_start();$allow_sep = "3";if (isset($_SESSION["post_sep"])) { if (time() - $_SESSION["post_sep"] < $allow_sep) { exit("请不要反复刷新"); } else { $_SESSION["post_sep"] = time(); }} else { $_SESSION["post_sep"] = time();}?> To abest $return = DB::getRow("tb_personal_login",array("PL_LoginName" => trim($loginName)),DBName_personal,"PL_SnatchLogID,PL_ID");if (empty($return)) { $insertID = DB::add("tb_personal_login",$data,DBName_personal);} 俺是楼主,兄弟们,这是俺的判断代码$return = DB::getRow("tb_personal_login",array("PL_LoginName" => trim($loginName)),DBName_personal,"PL_SnatchLogID,PL_ID"); //...其它的一些与tb_personal_login无关的数据操作if (empty($return)) { $insertID = DB::add("tb_personal_login",$data,DBName_personal); } 为什么不用主键呢?用UUID做主键不是很好么。 楼上说的正解,我也想用主键的,但这个表的数据已经是千万级。数据表原来不是我设计的,现在要改用主键,系统的成本已经变得非常昂贵,其实二楼提供的解决方案对前台提交我想应该是有效的。这个问题出现的原因是高并发,数据库被阻时出现的状况。因为用mysql不久,所以请问一个各高人! 2 楼的改进下:<?phpsession_start();$allow_sep = "3";if (isset($_SESSION["post_sep"])){if (time() - $_SESSION["post_sep"] < $allow_sep){ exit("您两次操作太快了!");}else{ return true; $_SESSION["post_sep"] = time(); }}else{ return true; $_SESSION["post_sep"] = time();}?> 此外:$return = DB::getRow("tb_personal_login",array("PL_LoginName" => trim($loginName)),DBName_personal,"PL_SnatchLogID,PL_ID");//...其它的一些与tb_personal_login无关的数据操作 无关的数据操作有没有用到$return这个变量 这与是否有主键无关这与现有程序无关主要表现是因为表单被重复提交了,注意并不特指2楼罗列的原因。ie6时代这个问题比较严重,是内部问题而非外部问题解决的办法是检查是否为重复提交:session_start();$form = md5(serialize($_REQUEST)); //构造提交内容的索引if($_SESSION['last'] == $form) { //检查是否重复提交 exit(); //是,则中断处理}$_SESSION['last'] = $form;//以下为正常时的处理代码 To abest $return = DB::getRow("tb_personal_login",array("PL_LoginName" => trim($loginName)),DBName_personal,"PL_SnatchLogID,PL_ID");//...其它的一些与tb_personal_login无关的数据操作其它一些数据操作用到了$return中的一些值判断,但没有改变$return里的值。To xuzuning 大哥说得在理,只是这种重复提交的速度是否会快于数据库的判断呢,毕竟新增是在判断数据是否存在之后。 估计是在FORM 的 SUBMIT按钮上,和FORM 上做了ONSUBMIT 没RETURN Magento简体中文版 论坛怎么分类的? 高分求PHP如何进行 增 删 改 并且把当前操作步骤生成日志进行保留 Drupal6问题 PHP做图表什么库比较好? 投分问路.... 检测按钮所在行 有没人做过友邻B2B的开发 PHPB2B里电话号码图片化 php怎么对距离远近进一步进行条件的筛选 那位高手有 PHP 通用的分页代码呢? 共享 共享呗 加分 55.la程序是什么原理
2、退后刷新解决办法:针对问题1:提交表单后,button按钮变为灰色(disabled 为 true)参考代码:function validate(theform) {
theform.topicsubmit.value = '正在提交订单, 请稍后……';
theform.topicsubmit.disabled = true;
return true;
}针对问题2的参考代码:
<?php
session_start();
$allow_sep = "3";
if (isset($_SESSION["post_sep"])) {
if (time() - $_SESSION["post_sep"] < $allow_sep) {
exit("请不要反复刷新");
} else {
$_SESSION["post_sep"] = time();
}
} else {
$_SESSION["post_sep"] = time();
}
?>
if (empty($return)) {
$insertID = DB::add("tb_personal_login",$data,DBName_personal);
}
$insertID = DB::add("tb_personal_login",$data,DBName_personal);
}
<?php
session_start();
$allow_sep = "3";
if (isset($_SESSION["post_sep"])){
if (time() - $_SESSION["post_sep"] < $allow_sep){
exit("您两次操作太快了!");
}
else{
return true;
$_SESSION["post_sep"] = time();
}
}
else{
return true;
$_SESSION["post_sep"] = time();
}
?>
这与现有程序无关
主要表现是因为表单被重复提交了,注意并不特指2楼罗列的原因。ie6时代这个问题比较严重,是内部问题而非外部问题解决的办法是检查是否为重复提交:session_start();
$form = md5(serialize($_REQUEST)); //构造提交内容的索引
if($_SESSION['last'] == $form) { //检查是否重复提交
exit(); //是,则中断处理
}
$_SESSION['last'] = $form;//以下为正常时的处理代码
$return = DB::getRow("tb_personal_login",array("PL_LoginName" => trim($loginName)),DBName_personal,"PL_SnatchLogID,PL_ID");//...其它的一些与tb_personal_login无关的数据操作
其它一些数据操作用到了$return中的一些值判断,但没有改变$return里的值。To xuzuning 大哥说得在理,只是这种重复提交的速度是否会快于数据库的判断呢,毕竟新增是在判断数据是否存在之后。