2008年9月22日 星期一

PHP請留意大小寫可能造成的隱形bug

  前陣子部落軌道遇到一個案例,某個使用者已經註冊軌道Widget好久了,也一直有將Widget掛在自己的部落格上.然而從她註冊完畢的那一天起,就沒有在Widget當中登入成功.

  對她很抱歉的是,因為先前遇到太多情況,是出自於瀏覽器差異(IE or Firefox)或是電腦本身設定(隱私權)所導致的問題,讓我一直認為這是一個特殊案例,除非能到現場檢查,否則難以解決.雖然她在官方部落格求助了好幾次,但所能作的就是協助她重新認證帳號與密碼,repeat瀏覽器清除cookies和cache,並降低瀏覽器隱私權.當然,結果是徒勞無功.

  幸運的是,道 - 相對‧太極‧空這位化工系的小老弟 Asi3715,在他開學典禮之前,心血來潮提醒我帳號密碼的大小寫會有問題,將導致不能使用推薦功能,也無法使用留言系統!這時我才恍然大悟...的確!軌道當中使用了不少cookies,並加了許多身分驗證的判斷,如果沒有驗證使用者的大小寫,會讓功能失效,甚至無法登入~~

  所以囉!現在在每一段需要身分比對的功能,都使用了strtolower()這個函式(strtoupper()也行),來將需要比對的每個字元先行轉換成小寫.因為對php來說,變數名稱變數值都是有大小寫區分的,就算是使用SQL語法可以成功藉由不區分大小寫的參數,成功地從資料庫裡取得資料列,但若在後續的配置上沒有考慮此參數的case sensitivity,就會有隱形的Bug產生喔!^^

  如果我早半年認識 Asi3715,那就不會發生這個錯誤了吧?!XD 而且我會叫他不要念化工,來念資工或是資科多好阿~~~:P (謎之音:轉系,轉系,轉系...)

william:

PHP 變數是 case sensitive 的,但 function name 卻是 case insensitive。

可能原由請參考這篇文章:http://www.wellho.net/mouth/93_Case-Sensitive-.html