奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

php語言

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

時間:2024-08-31 22:59:38 藹媚 php語言 我要投稿
  • 相關推薦

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

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

  錯誤提示

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

  錯誤是: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/category.php;

  vqmod:/vqmod/xml/*.xml;

  ocmod:上傳插件的ocmod.xml文件備份,或者數據庫查看: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管理工具這一點做的還是挺好的。建議最好修改插件的ocmod.xml文件,然后重新上傳一次。平時插件裝了后自己留備份還是有必要的。如果沒文件就導出備份再修改。

  擴展

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

  $a=0;

  $value=$key/$a;

  //這樣可能會提示警告語

  if($a){

  $value=$key/$a;

  }else{

  $value=false;

  }

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

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

  PHP7系列中的異常處理

  在PHP7中異常或者說錯誤被分為不同的等級

  1. 語法錯誤級別,也就是經常看到的Parse Error,這種錯誤,會在Zend引擎進行語法分析和編譯的時候就提示錯誤,注意這種錯誤一般都是比較低級的手寫錯誤,或者是關鍵詞寫錯,或者是少些一些分號等。對于這類錯誤,一般設置error_reporting(E_ALL)或者ini_set('display_errors','on'),在發生錯誤的時候,就會拋出異常,通過追蹤異常堆棧就可以發現問題所在

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

  3. 正常的Exception。對于Exception我們常見的處理方式有兩種,一種是用try...catch語句。

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

  PHP7中的異常處理升級

  PHP7的改動中,影響比較大的,包括異常處理。PHP7實現了一個全局的throwable接口,原來的Exception和部分Error都實現了這個接口(interface), 以接口的方式定義了異常的繼承結構。于是,PHP7中更多的Error變為可捕獲的Exception返回給開發者,如果不進行捕獲則為Error,如果捕獲就變為一個可在程序內處理的Exception。這些可被捕獲的Error通常都是不會對程序造成致命傷害的Error,例如函數不存。

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

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

  處理Fatal Error,例如以下代碼函數參數定義是classInstanceA的類型,但是實際調用的時候傳入了classInstanceB的類型,在PHP5中,會觸發一個Fatal Error,導致進程終止運行。

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

【PHP中的Division by zero報錯處理技巧】相關文章:

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

PHP怎么處理密碼08-28

PHP數組長度的技巧03-28

PHP開發CS結構的技巧11-09

PHP頁面跳轉實現技巧12-06

PHP處理密碼的幾種方式實例03-29

php常用的url處理函數集03-20

PHP頁面跳轉幾種實現技巧12-04

10個常用的PHP技術技巧03-01

主站蜘蛛池模板: 香河县| 淳化县| 呼伦贝尔市| 栾城县| 九寨沟县| 卢湾区| 冕宁县| 嘉义市| 遂平县| 临沧市| 无极县| 长白| 定州市| 七台河市| 林州市| 汨罗市| 陆丰市| 内江市| 鹤山市| 竹山县| 海城市| 河北省| 都兰县| 沂源县| 三门县| 河曲县| 鄯善县| 泸水县| 隆昌县| 滁州市| 铁岭县| 承德县| 芒康县| 仙桃市| 瓦房店市| 南投市| 吴川市| 伊金霍洛旗| 高雄市| 巴南区| 年辖:市辖区|