最近修改的几个小bug
最近修改的几个 bug,问题不大,查找起来却几番周折,汇总起来如下。
1.诡异电话号码
客服邮件反馈,很多用户服务热线变成了“0371-45875487”。看到这问题的第一反映是可能因为程序某个地方有人不小心写死了“0371-45875487”,因为服务热线对应数据库为一个字段ServiceTelephone,自然的把“0371-45875487”想象成了一个整体,在web解决方案中查找关键字“0371-45875487”,没有结果,数据库存储过程查找一遍,也没有结果,思路中断了,就先把数据处理了下,原因待查。
没几天,客服又反馈用户服务热线好多又变成了“0371-45875487”,再次超找问题,方式和上次一样,只是搜索关键词变成了“45875487”,没想到很顺利的定位到了问题。出现问题是在个人资料修改页,截取部分代码如下:
<tr>
<td align="right" valign="middle" bgcolor="#F9F9F9">
服务热线:</td>
<td align="left" valign="middle">
<input name="mendiantelephone1" type="text" id="mendiantelephone1" style="width: 30px;"
value="0371" size="4" maxlength="5" runat="server" />
-
<input name="mendiantelephone2" type="text" id="mendiantelephone2" style="width: 50px;"
value="45875487" maxlength="8" runat="server" /></td>
</tr>
资料修改aspx代码
if (!string.IsNullOrEmpty(AgentInfo.MendianTelephone))
{
mendiantelephone1.Value = AgentInfo.MendianTelephone.IndexOf("-") < ? "" : AgentInfo.MendianTelephone.Substring(, AgentInfo.MendianTelephone.IndexOf("-"));
mendiantelephone2.Value = AgentInfo.MendianTelephone.IndexOf("-") < ? AgentInfo.MendianTelephone : AgentInfo.MendianTelephone.Substring(AgentInfo.MendianTelephone.IndexOf("-") + );
}
资料修改aspx.cs代码
如果用户原来没有填写服务热线,在修改页这两个控件的值默认成了“0371”和“45875487”,用户好不知情的情况下把自己的服务热线修改错了。问题修改也很容易,直接把默认值去掉即可。
这问题告诉我们看似诡异的问题肯定也有其原因的,查找问题时可以缩小搜索关键词。
2.同名缓存带来的问题
问题描述:惠州房源信息,同一楼盘对应的区县、商圈竟然出现了不同值,如小区三千俊林对应的区县商圈出现了两组“惠州 惠阳区”和“惠阳 淡水"。查找原因原来是用到了同名缓存造成的,代码如下:
/// <summary>
/// 根据newcode 获取楼盘字典信息
/// </summary>
public DataTable GetBuildingDicByNewcode(CityBase citySite, long newcode, string projtype)
{
DataTable dt = new DataTable();
string oewname = "districtinfo_bus_around" + newcode.ToString() + "_" + projtype + "new";
string cachename = CacheType.housedic + "_" + oewname; //先取数据缓存
if (this.MemCache.KeyExists(cachename))
{
dt = this.MemCache.Get<DataTable>(cachename);
}
else
{
dt = buildingErrorData.GetBuildingDicByNewcode(citySite, newcode, projtype);
this.MemCache.Set(cachename, dt, DateTime.Now.AddDays());
}
return dt;
}
区县商圈都是根据楼盘编号获取的,而楼盘编号在全国都是唯一的,不会重复,这段代码看似没什么问题,那问题在哪呢?原来还有一个异地楼盘业务,就是深圳可以调用惠州的楼盘,调用的时候惠州就成了深圳的区县了,相当于深圳和惠州同一楼盘的区县商圈属性不同。
这问题出现是因为新业务的出现造成了老代码出现问题,新做业务时方方面面得考虑周全才行。
3.重复提交问题
问题描述:在用户进行放心房操作时,有个计数的字段,每设置一条计数字段+1,每取消一次计算字段-1,但这计数字段却出现了负数的情况。查找问题,最终出现在了用户重复提交上,而且从数据上看是有用户发现了这一漏洞,恶意提交了数据。
public bool CancelRealHouse(CityBase citySite, HouseOptEntity optEntity, HouseType htype = HouseType.Sale)
{
//刷新房源并设置标签
rowCount = houseDAO.UpdateRealHouseStatus(citySite, htype, optEntity.AgentId, optEntity.HouseIds, string.Empty, false); //调整操作数,只有设置上了放心房标签才会去调整
if (rowCount > )
{
this.houseBizMember.AgentPowerUsingBiz.HouseAction(citySite, htype, HouseAction.UnRealHouse, optEntity.AgentId, rowCount, rowCount, );
}
} public int UpdateRealHouseStatus(CityBase citySite, HouseType houseType, int agentId, List<int> houseIds, string infoCode, bool isSet)
{
int retVal = ;
int isRealHouse = isSet ? : ;
DBHelper db = DBHelper.GetDBHelper(BusinessType.AgentHouseWrite, citySite, agentId);
string tableName = GetTableName(citySite, houseType, true);
string refTableName = GetRefreshTableName(citySite, houseType);
string houseIdsStr = string.Join<int>(",", houseIds);
string sql = sql = string.Format("update {0} set isRealHouse = {1} where agentid={2} and status = 1 and isRealHouse != {1} and houseid in ({3});", tableName, isRealHouse, agentId, houseIdsStr);
retVal = db.ExecuteNonQuery(CommandType.Text, sql);
sql = string.Format("update s set s.registdate = getdate(),s.dtimestamp=getdate() from {0} s inner join {1} h with(nolock) on s.houseid = h.houseid where h.agentid={2} and h.[status]=1 and h.houseid in ({3})", refTableName, tableName, agentId, houseIdsStr);
retVal = db.ExecuteNonQuery(CommandType.Text, sql); return retVal;
}
问题出现在函数UpdateRealHouseStatus()上,这个函数执行了两个操作,一个是更新是否放心房,其实这步骤是没问题的,取消状态时,如果原本就是取消状态,这个返回的就是0,但问题出现在第二个操作上,重新给返回值赋值了,致使重复提交了返回值仍然为1,进而造成最终的计数有问题。
这问题告诉我们在重要操作上,一定要做好重复提交的判断。这问题发现的隐蔽性在于一个函数做了两件事,也和函数功能单一化原则相悖,合理的函数代码也有助于降低这种错误的概率。
最近修改的几个小bug的更多相关文章
- Chrome出了个小bug:论如何在Chrome下劫持原生只读对象
Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...
- Fundebug前端JavaScript插件更新至1.8.2,修复2个小BUG
摘要: 修复2个BUG,请大家及时更新. Fundebug前端异常监控服务 Fundebug是专业的程序异常监控平台,我们JavaScript插件可以提供全方位的异常监控,可以帮助开发者第一时间定位各 ...
- (原创)WinForm中莫名其妙的小BUG——ComboBox 尺寸高度问题
一.前言 使用WinForm很久了,多多少少遇到一些小BUG. 这些小BUG影响并不严重,而且只要稍微设置一下就能正常使用,所以微软也一直没有修复这些小BUG. 本来并不足以写篇文章去记录,但是昨天遇 ...
- 从一个小Bug,到Azure DevOps
1. 一个小Bug 最近和同事提起一个几年前的 Bug,那是一个很小很小的 Bug,没什么技术含量.那时候我刚入职,正好公司卖了一款仪器到某个国家,但是那边说配套的软件运行不起来,一打开就报错.经过排 ...
- 解决JqueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug
前些日子不是在做 使用Jquery-UI实现一次拖拽多个选中的元素操作嘛,在持续完善这个组件时遇到了一个关于拖放排序的bug.今天就着图片和代码重现一下,也顺便告诉大家如何解决这个问题. 首先先上图描 ...
- 淘宝WAP版小BUG分析
前几天发现的一个淘宝WAP版的小BUG,就是用桌面版chrome看的时候产品评价中的图片显示不出来,都是图裂了. 这是什么原因呢?图片为什么会显示不出来呢?淘宝的技术人员.测试人员不可能没发现啊.开启 ...
- 关于一个小bug的修正
python初学者,非常喜欢虫师的文章. 练习时发现一个小bug,http://www.cnblogs.com/fnng/p/3782515.html 验证邮箱格式一题中,第三个x不允许有数字,但是测 ...
- 用 parseInt()解决的 小 bug
在做轮播模块的时候遇到问题是:你在 连续指示小按钮 时候再去 只有 点击 下一张按钮,出现bug: 指示小按钮的 className 当前显示的 calssName 为 undefined ! // ...
- 少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小
少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小 有一道题(BZOJ 1901)是这样的:n个数,m个询问,询问有两种:修改某个数/询问区间第k小. 不带修改的区间第k小用主席树很好写 ...
随机推荐
- android ProgressBar 进度条的进度两端是圆角的方法
转自 http://www.jianshu.com/p/6e7ea842d5ce 另外工作原理可以参考http://blog.csdn.net/lan603168/article/details/44 ...
- vertica在电信的应用
本文介绍了什么 ´ 电信级大数据分析典型需求 ´ Vertica数据库特点及与其他数据库对比 ´ Vertica核心技术介绍 ´ 基于Vertica的典型分系统架构简介 电信级大数据分析典型需求 ´ ...
- C++内存对齐的理解
程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式. 编译器中提供了#pragma pack(n)来设 ...
- project.VERSION_NAME定义
android { compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION) buildToolsVersion pr ...
- Android 环境搭建
一.Android 环境搭建 开发工具: Android Studio(开发工具,前提是先装 java JDK) 下载地址:http://www.androiddevtools.cn/ Oracl ...
- the diff typeof and instanceof
instanceof和typeof都能用来判断一个变量是否为空或是什么类型的变量. typeof用以获取一个变量的类型,typeof一般只能返回如下几个结果:number,boolean,string ...
- IM系统中聊天记录模块的设计与实现
看到很多开发IM系统的朋友都想实现聊天记录存储和查询这一不可或缺的功能,这里我就把自己前段时间为傲瑞通(OrayTalk)开发聊天记录模块的经验分享出来,供需要的朋友参考下. 一.总体设计 1.存储位 ...
- 防止开发人员获取到敏感数据(SQL Server的数据加密简介)
背景 有时候,我们还真的会碰到这样的需求:防止开发人员获取到敏感数据.也许你觉得很简单,把开发和运营分开不就可以了吗?是的,如果公司有专门的运营团队的话,但对于很多小公司来说,几个人的开发团队就兼顾了 ...
- DNS拾遗(二)
MX Record补充 MX记录有优先级的概念,数字越小表示优先级越高.所以一个域可以配置多个不同优先级的MX记录,如果邮件通过第一优先级记录无法递送,则采用第二优先级,以此类推. TXT Recor ...
- MFC:在OnInitDialog 里面关闭窗体
解决步骤 在对应的dialogcpp 文件里面的在OnInitDialog函数里面,找到对应的位置,您需要结束窗体显示的地方.(感觉这是废话) 经过验证,使用EndDialog(IDCANCEL);/ ...