[精讚] [會員登入]
1056

[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] 類別中要怎麼使用callback function 召回函數(回呼函數)? 在類別中使用標準函數,若其中的callback 函數也是在類別中,該怎麼使用?

Smarty安裝 smarty 是著名的樣版引擎,非常的好用,用多了突然發現拿掉smarty反而不會寫php了,以下是安裝過程..

[PHP7] 利用Memcached 儲存 Session Memcached+ PHP7,利用Memcached 儲存 Session。

[PHP] 類別的繼承及建構子和解構子 PHP 類別的繼承及建構子和解構子

[CodeIgniter 3] 取得controller和method的方法 CodeIgniter 3 取得controller和method的方法

[CodeIgniter 3] COOKIE的使用 PHP CodeIgniter 3 中COOKIE的使用超簡單

隨機好文

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

[MAC] 截取螢幕畫面的方法 截取螢幕畫面的方法,在MAC中叫作螢幕快照,英文是screenshot

[jQuery] 利用load()來達成ajax的寫法 jQuery中利用load()來達成ajax的寫法,也有人稱他是假的ajax,作法就是..

HP SAS硬碟leds燈號說明 HP SAS硬碟leds燈號(hp g7/g6系統適用)說明

SELinux 常用指令和檔案 在Redhat系列中,Centos5以後加入了selinux,他並沒有這麼可怕,不必每次看到Selinux ,就想把他