PHP中的Division by zero報錯處理技巧

ecshop部分模板使用時,會出現“Warning: Division by zero inxxxxxlib_”錯誤,那麼怎麼處理呢?來看看小編的分享吧!

PHP中的Division by zero報錯處理技巧

  錯誤提示

在打開某些產品分類或者某些產品頁面的時候,特定語言才報錯。

錯誤是: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,也可以賦值預設數字,以便後面進行引用。

上面的方法只是一些示例和排錯的技巧,一種思路,具體情況具體分析,但是解決問題要有清晰的思路哈。學會一種技巧少走一些彎路,少花一些錢還是可以的。不過如果要賺錢,捨得花錢找技術開發更適合自己的網站,是很有必要的,花錢減少自己的時間浪費,也少出現一些不必要的麻煩,最重要的是專業的代碼和業餘的代碼還是很大區別的。再者,一個很簡單的道理“花錢就是投資”。