• 写在工作三年+的BUG总结


    2015年毕业至今,第一份工作即将结束,总结一下自己写出的bug,权当自省,待以后当作checklist使用。

    bug环境:Yii2 Advanced框架,Mysql数据库

    1. 列表共性问题

    (1)排序规则:按某个字段常规升降序不能满足需求

    方案:使用mysql的order by field(column,v1,v2,v3)解决

    (2)搜索规则:搜索字段,匹配规则(模糊或精确)

    (3)搜索状态保留问题:从列表页进到其他页面操作在跳回到列表页时搜索状态应保留

    方案:

            1)页面跳转时将列表页状态信息通过url传递到目标页面(当时只能想到这样的笨方法)

            2)借助H5的sessionStorage在离开页面时存储页面状态信息,能够在一次会话内保留,不同窗口间不共享(不同于localStorge)
    (4)搜索内容过滤:前后空格,特殊字符

    (5)列表页条目数问题:当展示联表查询结果时,若存在一对多的关系,会出现展示出的条目数与分页条目数不一致的情况

    问题原因:Yii的ActiveRecord会对每一页的联表查询结果进行去重处理,所以若联表查询的主表与关联表存在一对多关系时会被过滤掉,只保留第一条,导致某些页面条目数不足整页;

    从源码来看:

     1)首先GridView小部件会先获取查询结果总条数:yiidataBaseActiveDataProvider::getTotalCount() --> yiidataActiveDataProvider::prepareTotalCount() --> yiidbQuery::count() ,此时查询结果并不会进行去重。

     2)yiidbActiveQuery::all() --> yiidbQuery::all() --> yiidbActiveQuery::populate() --> yiidbActiveQuery::removeDuplicatedModels()

    removeDuplicatedModels()默认根据主键对查询结果去重,但是这一方法的执行需要满足两个条件:1)存在联表查询;2)未指定indexBy信息。

    解决方案:若明确存在一对多关联,且不关心关联表的具体数据,则在查询时使用distinct()方法去重,保障gridView显示的条目数量也为去重后的结果。

    (6)列表项内容宽度溢出或内容过少的样式处理

    2. 表单共性问题

    (1)表单重复提交:提交按钮可重复点击,导致表单重复提交;

    方案:定义一个变量记录表单是否已成功提交,提交表单前先判断是否可以提交。

    (2)输入格式校验:必填校验,字符长度(中英文),数值(整数,小数,分数,百分数),手机号,邮箱,身份证号,全角字符

    (3)客户端校验:时机,提示方式

    (4)服务端校验:注意要和客户端校验规则一致

    (5)数值类型:

    • 范围:上限,下限
    • 负值和零
    • 浮点数精度:js,php,mysql
    • 资金:(1) decimal (2) bigint 按分/厘来存   

    (6)日期类型需注意

    • h5的日期选择控件在录入非法日期时会取到空的value;
    • 超过四位数年份会引起数据库datetime字段溢出;
    • 日期区间合法性判断

    3. 弹出框共性问题

    (1)多次打开关闭的状态保留问题:通常要求不保留关闭前的状态

    (2)bootstrap模态框Modal嵌套弹框存在bug:弹框中嵌套弹框时,点击半透明区域关闭所有弹框后仍有一个半透明遮罩保留。

    方案:关键是避免点击半透明区域关闭弹框,方法是将class为‘modal-dialog’的div的宽和高设为100%,因其背景透明即时将遮罩层盖住,也不会影响视觉,但是半透明区域不会接收到点击事件,不会触发上述bug。

    4. 程序错误

    (1)程序逻辑问题

    (2)sql逻辑问题

    (3)异常分支没有跑到导致隐藏bug

    (4)功能耦合:难以掌控现有功能修改对其他模块的影响

    (5)与产品或测试对需求理解不一致

    5. 切记要确认的需求细节

    (1)数据细节:数据来源,可用数据过滤条件

    (2)交互细节:联动,自动计算,校验时机,校验条件

    (3)页面跳转:新窗口,弹出框,当前页面打开,是否允许回退(对于已删除内容应回退到哪里)

    (4)边界问题:理想状态不会发生的场景

    (5)命名统一:标题,字段,类型/状态

    (6)输入内容前后空格处理方式

    6.
    需注意的样式细节

    (1)对齐:元素对齐,边距居中

    (2)状态:点击(down,up),获得焦点,失去焦点,鼠标滑过,悬浮,滑出

    (3)间距:留白

    (4)数据:空数据,有数据,数据过长,换行

    7. 错误处理方式

    (1)前台操作失误/失败:提示方式与提示内容

    (2)后台操作异常/错误:前台的响应方式,后台的异常/错误处理方式

    8. 安全

    (1)js脚本注入,html代码注入

    $html = '<div>div</div><script>alert("htmlxss");</script>';
    echo $html;//会弹框
    
    echo htmlentities($html);//输出div元素和其它字符
    echo '<br>';
    echo htmlspecialchars($html);//原样输出所有字符
    echo '<br>';
    echo addslashes($html);//输出div元素,与转义后的脚本(审查元素可见脚本)
    echo '<br>';
    echo urlencode($html);//输出url编码后的字符串
    echo '<br>';
    
    $url = 'index.php?r=site/about&id=<script>alert("urlxss");</script>';
    echo $url;//会弹框
    echo htmlspecialchars($url);//原样输出所有字符
    echo '<br>';
    echo addslashes($url);//原样输出脚本外的所有字符,审查元素可见转义后的脚本
    echo '<br>';
    echo urlencode($url);//输出url编码后的字符串
    echo '<br>';

    (2)sql脚本注入

    (3)文件上传:文件类型伪装,上传文件大小溢出

    /**
    * 获取文件真实类型
    * @param $filename 文件路径
    * @param $onlyExt 只返回文件后缀
    */
    public function getRealType($filename,$onlyExt = true){
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $realType = finfo_file($finfo, $filename);
        finfo_close($finfo);
        return $onlyExt ? basename($realType) : $realType;        
    }
  • 相关阅读:
    [转]项目需求范围管理
    JavaScript 王者归来
    [转]大文件上传组件
    [转]使用vs2005自带的sql2005 express
    JS判断Caps Lock
    [转]Web项目管理思考
    [转]JS严格验证身份证
    两分钟用C#搭建IE BHO勾子, 窃取密码
    asp.net性能提升十个方法(Microsoft)
    [转]Asp.net 将js文件打包进dll 方法
  • 原文地址:https://www.cnblogs.com/ling-diary/p/9549414.html
Copyright © 2020-2023  润新知