最近修改的几个小bug

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

最近修改的几个 bug,问题不大,查找起来却几番周折,汇总起来如下。

1.诡异电话号码

客服邮件反馈,很多用户服务热线变成了“0371-45875487”。看到这问题的第一反映是可能因为程序某个地方有人不小心写死了“0371-45875487”,因为服务热线对应数据库为一个字段ServiceTelephone,自然的把“0371-45875487”想象成了一个整体,在web解决方案中查找关键字“0371-45875487”,没有结果,数据库存储过程查找一遍,也没有结果,思路中断了,就先把数据处理了下,原因待查。

没几天,客服又反馈用户服务热线好多又变成了“0371-45875487”,再次超找问题,方式和上次一样,只是搜索关键词变成了“45875487”,没想到很顺利的定位到了问题。出现问题是在个人资料修改页,截取部分代码如下:

<tr><tdalign="right"valign="middle"bgcolor="#F9F9F9">服务热线:</td><tdalign="left"valign="middle"><inputname="mendiantelephone1"type="text"id="mendiantelephone1"style="width: 30px;"value="0371"size="4"maxlength="5"runat="server"/>-<inputname="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("-") <0?"": AgentInfo.MendianTelephone.Substring(0, AgentInfo.MendianTelephone.IndexOf("-"));

mendiantelephone2.Value= AgentInfo.MendianTelephone.IndexOf("-") <0? AgentInfo.MendianTelephone : AgentInfo.MendianTelephone.Substring(AgentInfo.MendianTelephone.IndexOf("-") +1);

}

资料修改aspx.cs代码

如果用户原来没有填写服务热线,在修改页这两个控件的值默认成了“0371”和“45875487”,用户好不知情的情况下把自己的服务热线修改错了。问题修改也很容易,直接把默认值去掉即可。

这问题告诉我们看似诡异的问题肯定也有其原因的,查找问题时可以缩小搜索关键词。

2.同名缓存带来的问题

问题描述:惠州房源信息,同一楼盘对应的区县、商圈竟然出现了不同值,如小区三千俊林对应的区县商圈出现了两组“惠州 惠阳区”和“惠阳 淡水"。查找原因原来是用到了同名缓存造成的,代码如下:

///<summary>///根据newcode 获取楼盘字典信息///</summary>publicDataTable GetBuildingDicByNewcode(CityBase citySite,longnewcode,stringPRojtype)

{

DataTable dt=newDataTable();stringoewname ="districtinfo_bus_around"+ newcode.ToString() +"_"+ projtype +"new";stringcachename = 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(1));

}returndt;

}

区县商圈都是根据楼盘编号获取的,而楼盘编号在全国都是唯一的,不会重复,这段代码看似没什么问题,那问题在哪呢?原来还有一个异地楼盘业务,就是深圳可以调用惠州的楼盘,调用的时候惠州就成了深圳的区县了,相当于深圳和惠州同一楼盘的区县商圈属性不同。

这问题出现是因为新业务的出现造成了老代码出现问题,新做业务时方方面面得考虑周全才行。

3.重复提交问题

问题描述:在用户进行放心房操作时,有个计数的字段,每设置一条计数字段+1,每取消一次计算字段-1,但这计数字段却出现了负数的情况。查找问题,最终出现在了用户重复提交上,而且从数据上看是有用户发现了这一漏洞,恶意提交了数据。

publicboolCancelRealHouse(CityBase citySite, HouSEOptEntity optEntity, HouseType htype =HouseType.Sale)

{//刷新房源并设置标签rowCount = houseDAO.UpdateRealHouseStatus(citySite, htype, optEntity.AgentId, optEntity.HouseIds,string.Empty,false);//调整操作数,只有设置上了放心房标签才会去调整if(rowCount >0)

{this.houseBizMember.AgentPowerUsingBiz.HouseAction(citySite, htype, HouseAction.UnRealHouse, optEntity.AgentId, rowCount, rowCount,0);

}

}publicintUpdateRealHouseStatus(CityBase citySite, HouseType houseType,intagentId, List<int> houseIds,stringinfoCode,boolisSet)

{intretVal =0;intisRealHouse = isSet ?1:0;

DBHelper db=DBHelper.GetDBHelper(BusinessType.AgentHouseWrite, citySite, agentId);stringtableName = GetTableName(citySite, houseType,true);stringrefTableName =GetRefreshTableName(citySite, houseType);stringhouseIdsStr =string.Join<int>(",", houseIds);stringsql = 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);returnretVal;

}

问题出现在函数UpdateRealHouseStatus()上,这个函数执行了两个操作,一个是更新是否放心房,其实这步骤是没问题的,取消状态时,如果原本就是取消状态,这个返回的就是0,但问题出现在第二个操作上,重新给返回值赋值了,致使重复提交了返回值仍然为1,进而造成最终的计数有问题。

这问题告诉我们在重要操作上,一定要做好重复提交的判断。这问题发现的隐蔽性在于一个函数做了两件事,也和函数功能单一化原则相悖,合理的函数代码也有助于降低这种错误的概率。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航