一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

php語(yǔ)言

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

時(shí)間:2025-03-03 12:34:05 藹媚 php語(yǔ)言 我要投稿
  • 相關(guān)推薦

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

  ecshop部分模板使用時(shí),會(huì )出現“Warning: Division by zero inxxxxxlib_goods.php”錯誤,那么怎么處理呢?來(lái)看看小編的分享吧!

  錯誤提示

  在打開(kāi)某些產(chǎn)品分類(lèi)或者某些產(chǎn)品頁(yè)面的時(shí)候,特定語(yǔ)言才報錯。

  錯誤是:Division by zero in xxx

  錯誤原因

  這個(gè)錯誤的原因,就是運算的過(guò)程中,被除數是0。上過(guò)小學(xué)的都知道“0是不可以作為被除數的”。

  解決思路

  1:判斷值為0的時(shí)候跳過(guò)運算;

  2:如果非要賦值給一個(gè)變量,可以做判斷后賦固定值或者輸出false,后面代碼判斷如果變量是true才使用它進(jìn)行下一步代碼的實(shí)現。

  DEBUGING

  解決問(wèn)題之前,先來(lái)個(gè)兩個(gè)小知識點(diǎn):

  1、在opencart中,vqmod的優(yōu)先等級是最高的;

  2、哪里報錯不一定錯誤就在哪里,但是首先看的還是報錯的地方。

  從上圖中,我們找到了vqcache下對應的文件對應行數,發(fā)現如下代碼:

  //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;

  }

  從這個(gè)代碼可以看出有若干個(gè)參數,我們留意“/”后面的被除數就好,這里被除數有兩個(gè)地方,其中第二個(gè)是正整數100,可以排除。那么問(wèn)題就在下面這段代碼中:

  $this->tax->calculate($result['price'],$result['tax_class_id'],$this->config->get('config_tax'))

  我們從上面這個(gè)方法里看到三個(gè)參數,分別用print_r打印了下參數的值,結果發(fā)現第二個(gè)參數“$result['tax_class_id']”是“000000”。很顯然,如果這個(gè)是0,我們就要讓?zhuān)?/p>

  $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;

  }

  也就是,加多一個(gè)判斷依據,必須滿(mǎn)足兩個(gè)值都存在的前提下,才進(jìn)行如下運算,否則是false。

  修改代碼,保存代碼,上傳文件,刷新頁(yè)面,警告提示語(yǔ)消失,over。

  但是,畢竟我們改的是緩存文件,真正要修改好代碼,我們還是要把代碼寫(xiě)到核心文件或者插件的文件里。

  修改源

  首先,我們從三個(gè)地方查找,分別是:

  核心文件:/catalog/controller/product/category.php;

  vqmod:/vqmod/xml/*.xml;

  ocmod:上傳插件的ocmod.xml文件備份,或者數據庫查看:oc_modification表xml字段;

  雖然vqmod的優(yōu)先等級高于ocmod,但是其實(shí)先從比較方便的地方找起也是可以的。有個(gè)方法可以排除是否ocmod。如果是ocmod插件的,緩存文件名必定有“system_storage_modification”。

  但是也由于vqmod優(yōu)先等級最高,所以被ocmod緩存的文件的文件名也可能有這個(gè)字樣,所以排查的順序如上所述!救绻麍箦e指向“/system/storage/modification/”則一定是ocmod插件引起】

  核心文件的話(huà),編輯器打開(kāi)ctrl+F進(jìn)行關(guān)鍵字查找修改。

  如果是vqmod的xml,要么排除法排除不可能是的文件,然后從可能是的文件里查找。如果文件太多就用notepad++等編輯器或者IDE工具,可以進(jìn)行目錄搜索,從中找到文件。

  如果是ocmod,則用MYSQL工具進(jìn)行字段like %...% 搜索,或者用SQL語(yǔ)句:

  SELECT*FROM`oc_modification`WHERE`xml`like"%關(guān)鍵代碼%"

  由于這里存的數據被轉義過(guò),所以搜索的內容不要帶有換行之類(lèi)的,抓取比較有特點(diǎn)的代碼進(jìn)行查找和修改。修改的時(shí)候注意轉義的影響哈。當然現在很多MYSQL管理工具這一點(diǎn)做的還是挺好的。建議最好修改插件的ocmod.xml文件,然后重新上傳一次。平時(shí)插件裝了后自己留備份還是有必要的。如果沒(méi)文件就導出備份再修改。

  擴展

  上面的示例代碼剛好是剛遇到的,所以拿來(lái)舉例子。授人以魚(yú)不如授人以漁,有的小問(wèn)題大家花錢(qián)又心疼,想自己折騰也未嘗不可以,以后還是會(huì )提供更多這類(lèi)比較初級的解決方案給大家。下面另外舉例子:

  $a=0;

  $value=$key/$a;

  //這樣可能會(huì )提示警告語(yǔ)

  if($a){

  $value=$key/$a;

  }else{

  $value=false;

  }

  //對$value進(jìn)行賦值計算結果或者false,也可以賦值預設數字,以便后面進(jìn)行引用。

  上面的方法只是一些示例和排錯的技巧,一種思路,具體情況具體分析,但是解決問(wèn)題要有清晰的思路哈。學(xué)會(huì )一種技巧少走一些彎路,少花一些錢(qián)還是可以的。不過(guò)如果要賺錢(qián),舍得花錢(qián)找技術(shù)開(kāi)發(fā)更適合自己的網(wǎng)站,是很有必要的,花錢(qián)減少自己的時(shí)間浪費,也少出現一些不必要的麻煩,最重要的是專(zhuān)業(yè)的代碼和業(yè)余的代碼還是很大區別的。再者,一個(gè)很簡(jiǎn)單的道理“花錢(qián)就是投資”。

  PHP7系列中的異常處理

  在PHP7中異;蛘哒f(shuō)錯誤被分為不同的等級

  1. 語(yǔ)法錯誤級別,也就是經(jīng)?吹降腜arse Error,這種錯誤,會(huì )在Zend引擎進(jìn)行語(yǔ)法分析和編譯的時(shí)候就提示錯誤,注意這種錯誤一般都是比較低級的手寫(xiě)錯誤,或者是關(guān)鍵詞寫(xiě)錯,或者是少些一些分號等。對于這類(lèi)錯誤,一般設置error_reporting(E_ALL)或者ini_set('display_errors','on'),在發(fā)生錯誤的時(shí)候,就會(huì )拋出異常,通過(guò)追蹤異常堆棧就可以發(fā)現問(wèn)題所在

  2. Fatal Error錯誤,這種錯誤一般會(huì )導致PHP進(jìn)程直接退出,也就是導致場(chǎng)景的白屏現象或者webserver返回500。這種錯誤是不能捕獲的,無(wú)法通過(guò)try...catch或者其他手段進(jìn)行處理。(PHP7在這一塊做了比較明顯的升級,方便我們更好的處理部分異常,詳見(jiàn)后文分析)

  3. 正常的Exception。對于Exception我們常見(jiàn)的處理方式有兩種,一種是用try...catch語(yǔ)句。

  另一種的寫(xiě)法常見(jiàn)于MVC框架,就是調用鉤子函數,在作者寫(xiě)的Pfinal MVC框架中就用了這種方法,可以做到全局處理異常,當有未捕獲的異常的時(shí)候,使用鉤子函數注冊的處理函數進(jìn)行處理,不至于會(huì )把異常堆棧丟給用戶(hù),這是PHP5中高級一點(diǎn)的異常處理方法。以下是作者的Pfinal框架中的異常處理核心文件

  PHP7中的異常處理升級

  PHP7的改動(dòng)中,影響比較大的,包括異常處理。PHP7實(shí)現了一個(gè)全局的throwable接口,原來(lái)的Exception和部分Error都實(shí)現了這個(gè)接口(interface), 以接口的方式定義了異常的繼承結構。于是,PHP7中更多的Error變?yōu)榭刹东@的Exception返回給開(kāi)發(fā)者,如果不進(jìn)行捕獲則為Error,如果捕獲就變?yōu)橐粋(gè)可在程序內處理的Exception。這些可被捕獲的Error通常都是不會(huì )對程序造成致命傷害的Error,例如函數不存。

  PHP7中,基于/Error exception,派生了5個(gè)新的engine exception:ArithmeticError / AssertionError / DivisionByZeroError / ParseError / TypeError。在PHP7里,無(wú)論是老的/Exception還是新的/Error,它們都實(shí)現了一個(gè)共同的interface: /Throwable。

  對比原來(lái)的PHP5,處理語(yǔ)法錯誤Parse Error,針對于語(yǔ)法錯誤,原來(lái)的PHP5是遇到語(yǔ)法錯誤,就會(huì )終止PHP進(jìn)程,同時(shí)拋出語(yǔ)法錯誤的提示。在新的PHP7中,這種異常類(lèi)型被封裝為ParseError異常類(lèi),你可以在代碼中通過(guò)try...catch(ParseError $e){}來(lái)處理,媽媽在也不用擔心我少寫(xiě)一個(gè)分號會(huì )導致系統直接奔潰了

  處理Fatal Error,例如以下代碼函數參數定義是classInstanceA的類(lèi)型,但是實(shí)際調用的時(shí)候傳入了classInstanceB的類(lèi)型,在PHP5中,會(huì )觸發(fā)一個(gè)Fatal Error,導致進(jìn)程終止運行。

  現在在PHP7中,可以通過(guò)捕獲異常,處理以上錯誤,不會(huì )拋出Fatal Error

【PHP中的Division by zero報錯處理技巧】相關(guān)文章:

PHP中的表單處理09-19

PHP中cron的批處理09-10

PHP編程中字符串處理的5個(gè)技巧09-13

PHP7系列中的異常處理08-11

PHP中文文字處理技巧08-14

PHP的中文文字處理技巧08-28

如何在PHP中處理Protocol Buffers數據08-02

PHP中date函數常用時(shí)間處理方法09-24

PHP怎么處理密碼08-28

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看