PHP中的Division by zero报错处理技巧
ecshop部分模板使用时,会出现“Warning: Division by zero inxxxxxlib_”错误,那么怎么处理呢?来看看小编的分享吧!
错误提示
在打开某些产品分类或者某些产品页面的时候,特定语言才报错。
错误是:Division by zero in xxx
错误原因
这个错误的原因,就是运算的过程中,被除数是0。上过小学的都知道“0是不可以作为被除数的”。
解决思路
1:判断值为0的时候跳过运算;
2:如果非要赋值给一个变量,可以做判断后赋固定值或者输出false,后面代码判断如果变量是true才使用它进行下一步代码的实现。
DEBUGING
解决问题之前,先来个两个小知识点:
1、在opencart中,vqmod的优先等级是最高的;
2、哪里报错不一定错误就在哪里,但是首先看的还是报错的地方。
从上图中,我们找到了vqcache下对应的文件对应行数,发现如下代码:
//Cosyonecustomcodestarts
if((float)$result['special']){
$sales_percantage=((($this->tax->calculate($result['price'],$result['tax_class_id'],$this->config->get('config_tax')))-($this->tax->calculate($result['special'],$result['tax_class_id'],$this->config->get('config_tax'))))/(($this->tax->calculate($result['price'],$result['tax_class_id'],$this->config->get('config_tax')))/100));
}else{
$sales_percantage=false;
}
从这个代码可以看出有若干个参数,我们留意“/”后面的被除数就好,这里被除数有两个地方,其中第二个是正整数100,可以排除。那么问题就在下面这段代码中:
$this->tax->calculate($result['price'],$result['tax_class_id'],$this->config->get('config_tax'))
我们从上面这个方法里看到三个参数,分别用print_r打印了下参数的值,结果发现第二个参数“$result['tax_class_id']”是“000000”。很显然,如果这个是0,我们就要让:
$sales_percantage = false ;
所以我们这里的代码要修改为:
//Cosyonecustomcodestarts
if((float)$result['special']&&$result['tax_class_id']){
$sales_percantage=((($this->tax->calculate($result['price'],$result['tax_class_id'],$this->config->get('config_tax')))-($this->tax->calculate($result['special'],$result['tax_class_id'],$this->config->get('config_tax'))))/(($this->tax->calculate($result['price'],$result['tax_class_id'],$this->config->get('config_tax')))/100));
}else{
$sales_percantage=false;
}
也就是,加多一个判断依据,必须满足两个值都存在的'前提下,才进行如下运算,否则是false。
修改代码,保存代码,上传文件,刷新页面,警告提示语消失,over。
但是,毕竟我们改的是缓存文件,真正要修改好代码,我们还是要把代码写到核心文件或者插件的文件里。
修改源
首先,我们从三个地方查找,分别是:
核心文件:/catalog/controller/product/;
vqmod:/vqmod/xml/*;
ocmod:上传插件的文件备份,或者数据库查看:oc_modification表xml字段;
虽然vqmod的优先等级高于ocmod,但是其实先从比较方便的地方找起也是可以的。有个方法可以排除是否ocmod。如果是ocmod插件的,缓存文件名必定有“system_storage_modification”。
但是也由于vqmod优先等级最高,所以被ocmod缓存的文件的文件名也可能有这个字样,所以排查的顺序如上所述。【如果报错指向“/system/storage/modification/”则一定是ocmod插件引起】
核心文件的话,编辑器打开ctrl+F进行关键字查找修改。
如果是vqmod的xml,要么排除法排除不可能是的文件,然后从可能是的文件里查找。如果文件太多就用notepad++等编辑器或者IDE工具,可以进行目录搜索,从中找到文件。
如果是ocmod,则用MYSQL工具进行字段like %...% 搜索,或者用SQL语句:
SELECT*FROM`oc_modification`WHERE`xml`like"%关键代码%"
由于这里存的数据被转义过,所以搜索的内容不要带有换行之类的,抓取比较有特点的代码进行查找和修改。修改的时候注意转义的影响哈。当然现在很多MYSQL管理工具这一点做的还是挺好的。建议最好修改插件的文件,然后重新上传一次。平时插件装了后自己留备份还是有必要的。如果没文件就导出备份再修改。
扩展
上面的示例代码刚好是刚遇到的,所以拿来举例子。授人以鱼不如授人以渔,有的小问题大家花钱又心疼,想自己折腾也未尝不可以,以后还是会提供更多这类比较初级的解决方案给大家。下面另外举例子:
$a=0;
$value=$key/$a;
//这样可能会提示警告语
if($a){
$value=$key/$a;
}else{
$value=false;
}
//对$value进行赋值计算结果或者false,也可以赋值预设数字,以便后面进行引用。
上面的方法只是一些示例和排错的技巧,一种思路,具体情况具体分析,但是解决问题要有清晰的思路哈。学会一种技巧少走一些弯路,少花一些钱还是可以的。不过如果要赚钱,舍得花钱找技术开发更适合自己的网站,是很有必要的,花钱减少自己的时间浪费,也少出现一些不必要的麻烦,最重要的是专业的代码和业余的代码还是很大区别的。再者,一个很简单的道理“花钱就是投资”。
-
如何实现yii2 数据库读写分离配置
导语:开始使用数据库首先需要配置数据库连接组件,下面小编给大家提供了如何实现yii2数据库读写分离配置,大家可以参考阅读,更多详情请关注应届毕业生考试网。开始使用数据库首先需要配置数据库连接组件,通过添加db组件到应用配置实现("基础的"Web应用是config/),DSN(Da...
-
PHP面试之php自带的几个防止sql注入的函数
毕业季又到了,同学们是不是正为此烦恼呢?以下是本站小编精心为大家整理的PHP面试之php自带的几个防止sql注入的函数,希望对大家有所帮助!更多内容请关注应届毕业生网!SQL注入攻击是黑客攻击网站最常用的手段。如果你的站点没有使用严格的用户输入检验,那么常容易...
-
PHP数据类型之数组变量详解
导语:PHP是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。下面我们来看看PHP数据类型之数组变量详解,希望对大家有所帮助。PHP中的数组实际上是一个有序图,是一种把values映射到keys的类型。一个数组实际上就...
-
PHP的漏洞-如何防止PHP漏洞
漏洞无非这么几类,XSS、sql注入、命令执行、上传漏洞、本地包含、远程包含、权限绕过、信息泄露、cookie伪造、CSRF(跨站请求)等。下面是小编为大家带来的关于PHP的漏洞的知识,欢迎阅读。+sql注入其中占大头的自然是XSS与SQL注入,对于框架类型或者有公共文件的,建...
相关文章
- The Opinion of Buying Cars英语作文
- Jolie drops battle over perfume named Shilohy英语作文
- A Bitter Experience in My Childhood初中英语作文
- Zend studio for eclipse中使php可以调用mysql相关函数的设置方
- 七年级英语Unit2Is this your pencil Period1说课稿
- 有关JavaScript中的prototype.bind()方法介绍
- Think Positive Thoughts Every Day英语作文
- Why Public Speaking Is So Important 公共演说的重要性大学英语
- 英语阅读:Why Apple says it's slowing down older iPhone
- Time To Stop Worrying About Invasive Species美文欣赏