[精讚] [會員登入]
1079

[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

你可能感興趣的文章

[CodeIgniter 3] 資料庫的使用方法整理2/2 CI3 承襲 CI2,有很多的builder class可以用,依各人的使用習慣,有人喜歡一堆sql字串,有人喜歡用helper

[phpmyadmin] 設定預設語言(Language) phpmyadmin預設進來是會選擇你瀏覽器預設的語系,改成正體中文

[PHP] 字串拆解函數substr 奇異的錯誤(札記) 偶然發現一個 substr函數拆解上的怪異之處

[PHP8] 使用autoload autoload+ namespace +use 到了php7之後,namespace和use越來越重要,此篇整理autoload和namespace、use的結合使用。

設定Google analytics API #3 -- 查詢範例 讓你的網站能夠存取你的Google analytics上面的資料

[PHP] 如何寫callback function 召回函數(回呼函數) PHP如何寫召回函數或回呼函數(callback function)?

隨機好文

[Win7] 燒錄 iso 檔 在Windows7 中內建燒錄程式,可以直接把檔案拉到光碟機裡,再執行燒錄。

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

海棉寶寶超泡杯演奏的sweet victory 章魚哥和海棉寶寶在超泡杯的演奏歌曲

[Bootstrap] Datepicker使用/Bootstrap日期選日期選擇器的使用 Bootstrap日期選日期選擇器的使用

[Mysql] 資料型態int, float, double, text, char, varchar, blob大小 Mysql中資料型態int, float, text, char, varchar, blob大小