Mybb1.8数据库核心操作update_query存在低级bug致数据丢失

巴扎黑
发布: 2016-11-11 15:33:40
原创
1178人浏览过

<p>Mybb1.6升级到1.8升级的过程中,遇到问题无数,近日发现了一个Mybb1.8数据库核心操作update_query的代码中存在严重bug,导致数据存入时漏掉前面的零,折腾数小时,发现错不在俺,而在mybb的升级代码。 <br/><br/>数据表:test <br/>字段 <br/>ID  int(10) AUTO_INCREMENT <br/>name varchar(60) not null <br/>category varchar(5) <br/><br/>在此表中category来表示分类,分类釆用常见的代码表示,共五位数字,前二位0l一99表示大类,后三位表示小类。在更新语句中通过Ajax提文更新,在台后语句中通过update_query更新数据。程序在1·6时工作正常,在开级1·8时更新混乱,检查下来发现category字段前面的“0”丢失。通过变化各种手段均不能解决问题。最后把Mybb的数据操作核心文件翻出来,对比其1.6版本发现代码存在低级bug,导致错误发生。 <br/><br/>下面是1.8版数据更新过程 <br/></p><p>Php代码  </p><pre class="brush:php;toolbar:false">function update_query($table, $array, $where="", $limit="", $no_quote=false)   {       global $mybb;          if(!is_array($array))       {           return false;       }          $comma = "";       $query = "";       $quote = "'";          if($no_quote == true)       {           $quote = "";       }          foreach($array as $field => $value)       {           if(isset($mybb->binary_fields[$table][$field]) && $mybb->binary_fields[$table][$field])           {               if($value[0] != 'X') // Not escaped?               {                   $value = $this->escape_binary($value);               }                              $query .= $comma."`".$field."`={$value}";           }           else           {               if(is_numeric($value))               {                   $query .= $comma."`".$field."`={$value}";               }               else               {                   $query .= $comma."`".$field."`={$quote}{$value}{$quote}";               }           }           $comma = ', ';       }          if(!emptyempty($where))       {           $query .= " WHERE $where";       }          if(!emptyempty($limit))       {           $query .= " LIMIT $limit";       }          return $this->write_query("           UPDATE {$this->table_prefix}$table           SET $query       ");   }</pre><p><br/><br/>而1.6版本是这样的 <br/></p><p>Php代码  </p><pre class="brush:php;toolbar:false">function update_query($table, $array, $where="", $limit="", $no_quote=false)       {           if(!is_array($array))           {               return false;           }                      $comma = "";           $query = "";           $quote = "'";                      if($no_quote == true)           {               $quote = "";           }                      foreach($array as $field => $value)           {               $query .= $comma."`".$field."`={$quote}{$value}{$quote}";               $comma = ', ';           }                      if(!emptyempty($where))           {               $query .= " WHERE $where";           }                      if(!emptyempty($limit))           {               $query .= " LIMIT $limit";           }              return $this->write_query("               UPDATE {$this->table_prefix}$table               SET $query           ");       }</pre><p><br/><br/>发生错误的是这样几句 <br/><br/></p><p>Php代码  </p><pre class="brush:php;toolbar:false">if(is_numeric($value))               {                   $query .= $comma."`".$field."`={$value}";               }               else               {                   $query .= $comma."`".$field."`={$quote}{$value}{$quote}";               }</pre><p><br/>传过来category的值可能是01002或08003,只要is_numeric($value)为真就是数字类型?!这是什么逻辑。其时mysql能自动处理识别字符型和数字型的差别,升级的1.8版把简单的事情复杂化,错误的逻辑导致bug发生,导致传过来的由数字组成的字符串存入数据库时前面的0丢失。如果前面不为0,就不会出错,这样导致数据一片混乱。 <br/><br/>一直以来很欣赏Mybb简洁的代码和漂亮的系统架构,2M代码包括图片CSS等竟然能完成如此多的功能,给予用户良好的扩展能力。没想到翻出这样一个bug,见笑了。1.6至1.8改动很大,发布过于仓促。总体说来,Mybb不失一个漂亮简洁的php论坛。<br/></p><p><br/></p>

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号