[精讚] [會員登入]
1010

[PHP] 字串拆解函數substr 奇異的錯誤(札記)

偶然發現一個 substr函數拆解上的怪異之處

分享此文連結 //n.sfs.tw/13218

分享連結 [PHP] 字串拆解函數substr 奇異的錯誤(札記)@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-25 11:20:58 最後編修
2019-04-05 14:49:49 By 張○○
 

自動目錄

今天在寫程式時,使用 substr的一個簡單的想法,但是結果卻出乎我的意料,為此還花了十多分鐘查錯和半小時打這篇文章

substr在切字串時很有用,例如官網例[1]:

$rest = substr("abcdef", -1);    // "f"
$rest = substr("abcdef", -2);    // "ef"
$rest = substr("abcdef", -3, 1); // "d"

 

今天我的想法是,如果我字串最後面是數字的話,我就怎樣怎樣…

$roma="0123456";

$last=substr($roma, -1,1); //6
if( $last>='0' and $last<='9'){
  怎樣怎樣...
}

因為這個數字我把他視為字串,所以這樣的判斷沒有問題。

但是,

後來發現程式執行結果不正確,我一直找不出原因,後來發現,如果我傳入的$roma是空字串或是null,結果竟然會怎樣怎樣

太讓我吃驚了。(PHP 5.5)

$roma=null;

$last=substr($roma, -1,1); //空的,什麼都沒印
if( $last>='0' and $last<='9'){
  怎樣怎樣...竟然被執行了,你也可以試試
}

在上面的判斷中,怎樣怎樣竟然被執行了。上面的 'and'換成 '&&',或是 '0','9'換成數字 0,9結果都一樣。

我試著判斷

$last='';
if( $last >= '0' && $last <='9'){ 怎樣怎樣... }

$last=null;
if( $last >= '0' && $last <='9'){ 怎樣怎樣... }

都不會成功,但是substr切出來的就會成功。

這太神奇了!解決方法請看結論。

結論

substr 遇到空字串或null,切出來的不知道是什麼?留給有興趣的人去研究。

這個BUG到了php>7.0以後就被修正。

使用mb_substr取代 substr得到的結果就是正確的。

程式隨時會有意想不到的BUG,在估時間的時候要留多一點時間。

 

參考資料

[1] https://www.php.net/manual/en/function.substr.php

 

 

 

 

 

END

你可能感興趣的文章

PHP程式經驗 #2 -- print和echo的差異 常在寫php的人一定會想知道echo和print這兩個函數有什麼不一樣 驗證 1. 比較print 和echo 函式的執

[PHP] 檢查IP是否在某個網段內 mtachcidr 要檢查IP是否在某個網段內,要寫幾行?10行?5行? 不用,只要2行。以下是我寫的 code /** * matchCI

[CodeIgniter3] CI3 Session 失敗的問題 這次把我的程式放到Centos8,結果sesssion 一直沒作用,真的不知道發生了什麼事?

[PHP] codeignitor4+ smarty4 這篇整合 php 的framework codeignitor4 + smarty4。

[PHP] 好用的php常數 介紹PHP中 __DIR__, __FILE__, __FUNCTION__, __CLASS__, __METHOD__, __LINE__, __NAMESPACE__等常數

[Smarty5] 如何在樣版中使用php本身的函式 解決 smarty5版後不能直接叫用 php函式的問題

隨機好文

使用Google尋找你的手機 這近發現google竟然可以用來找android的手機,而且不需要經過什麼設定或安裝軟體。

沒有非誰做不可的事,也沒有不可被取代的人 沒有非誰做不可的事,也沒有不可被取代的人

外匯課程經驗 有天遇到某個朋友的正妹朋友,說她有個很棒的外匯投資課程,要我們去聽,只收場地費200大洋。她又說續效最差一個月也有1%,誰還在苦哈哈上班?

真正的喜悅 幾種喜悅的類型,雖然很簡單,卻是很多人百思不得其解的難題..

[CodeIgniter 3] 自寫找不到頁面(page404)的方法 使用CI3框架中如果找不到頁面,就會導到一個自定的404頁面,該怎麼做?