如果引用或轉貼,麻煩註明出處與本網誌連結,否則視為侵權。

2020年1月31日

PHP-Codeigniter系統異常登出問題(使用者登入資訊消失)與解決方法

作者: Fred F.M. Wang (FW知識瑣記) 日期:20200131

最近開發PHP+Codeigniter架構的網站發生奇怪的問題。

其中一段程式碼 :
$this->session->set_userdata("message",$msg);
redirect($prev_page);

上述程式碼執行到redirect(重導)到另一個網頁,就發現登入者自動被登出。

經過一番測試,終於發現問題在哪裡了。

我系統的設計是 : 
1. 用Session儲存使用者登入的資訊(如下列),系統各個頁面會根據此登入資訊判斷是否處於登入狀態。
$this->session->set_userdata("username",$username);  // $username為認證通過的用戶帳號
***** 因此,顯然上面的問題是Session中使用者登入資訊已經消失了。*****
2. 用Session儲存訊息,如上面的$this->session->set_userdata("message",$msg); 重導到另一個網頁時,再讀出此資料顯示在頁面上,如$message = $this->session->userdata("message");。

原因為 : 
$this->session->set_userdata("message",$msg);
這行程式的$msg變數中包含Big5中文編碼的文字

Codeigniter系統設定application/config/config.php中預設編碼為UTF-8
$config['charset'] = "UTF-8"; 

因此,造成Session資料的消失,只要將上面$msg轉換為UTF-8編碼格式就不會有問題了。

 -- Fred F.M. Wang

參考 :  網路上其他類似的問題與Session data lost可能的原因






2020年1月18日

謠言查證網站整理

作者: Fred F.M. Wang (FW知識瑣記) 日期:2020/1/18

"謠言止於智者",雖然,我們不一定有能力判別接受的訊息是否是謠言,仍可以透過下面一些謠言查證網站,確認一下,避免謠言的流傳。

民間的謠言查證網站
1. 台灣事實查核中心
   三則最近查證出來的謠言 :
   .  網傳圖片「這是每400年在喜馬拉雅山盛開一次的Mahameru花...」 (X)
   .  網傳「反分裂法/反滲透法 1/15生效,選舉的PO文不分藍綠,請全部刪掉以免惹事生非。...」? (X)
   . 網傳「宣布票數的時候可以設計每差票數幾張就會自動灌票」、「電腦工程師的朋友告訴我,是在計票系統植入後門程式...」? (X)


2. MyGoPen
  三則最近查證出來的謠言 :
  . 港大袁國勇醫生一席話、衛生局發出的通知:這次的「流感」很嚴重,有「預防的方式」,就是要保持「喉嚨黏膜的濕潤  (X)
  . 宏碁施振榮給他子女的一封信,... 我在前年(2018)的九合一選舉前, 我寫了一封信給你們; 籲請你們慎重地投下你們手中的票... (X)
  . 氣炸鍋高溫恐致癌!營養師:2食物(加工食物及蔬菜)絕不能放 (X)

3. 蘭姆酒吐司
    三則最近查證出來的謠言 : 
    . 做票?總統票比政黨票多113多萬票? (X)
    . 總統開票作弊影片!?明明開票是2號~但卻畫記3號? (X)
    . 好羨慕 芬蘭總理推「週休3日 」、「每日工時6小時」 (X) 

4. NowNews網路追追追

5. Cofaces


6. 網路追追追臉書

7. 公共電視 流言追追追
    有關生活中的流言,追查是否為真

政府單位的闢謠專區
1. 內政部警政署165反詐騙-詐騙闢謠專區

2. 衛生福利部食品藥物管理署 食藥闢謠專區
  「泰國榴槤浸泡有毒黃色液體?」、「電療器材可以治百病?」、「可樂會殺精?」,謠言滿天飛,誰能揭穿真相!食品藥物管理署(以下簡稱食藥署)自今(104)年4月24日起,在食藥署網站成立「食藥闢謠專區」...


3. 衛生福利部國民健康署-真相與闢謠

4. 衛生福利部疾病管制署-澄清專區

5. 行政院農業委員會-農產品爭議訊息澄清專區(含食安)




2020年1月15日

給新手程式設計師 - 養成幾個程式設計的習慣,對您將來有很大的幫助

作者: Fred F.M. Wang (FW知識瑣記) 日期: 2020-1-15

筆者超過三十年的程式設計生涯,寫過各類的程式語言,不變的部分是一些程式設計的習慣,這些習慣將影響您的工作甚大。

1. 註解,註解,註解
    不要以為你記得所有你寫過的程式,人的大腦記憶永遠是有限的,寫註解是幫助自己看懂寫過的程式,對團隊而言,註解是提升程式可讀性與可維護性的要素。

    程式開頭註解的重點是甚麼? 有下列幾點 :
    a. 這支程式是甚麼?目的是甚麼? 要解決甚麼問題? 需求來自哪裡?
    b. 誰寫的? 何時開始寫?
    c. 改了甚麼? 為甚麼修改? 何時改了? 誰改的? -- 將來不清楚可以找這個人問

   區塊的註解重點是說明下面程式區塊的目的,對複雜的邏輯進行解說,對變數的說明等等

   行內的註解重點是說明該行程式的目的,修改後的註解等等。

   另外,較大的程式結構,建議在結構的結束列加上註解,例如 :
   if(strpos($maindata,$checkdata) !== false) {
       ....
   }
   如果這個程式結構超過十行,或是包含多重的if結構,建議在結尾大括號加上註解,這樣才可以在閱讀程式時很快可以知道這個結尾括號對應於哪個起始括號,如下
   }  // if(strpos($maindata,$checkdata) !== false)
   這樣就很清楚這個 結尾大括號對應哪個if條件式。

2 縮排
    特定語言如早期的Fortran, COBOL 與現在的Python等需強制性的縮排,但是更多語言並沒有此種規定,造成較大較為複雜的程式結構不清楚,不容易閱讀。因此,槽狀程式,如多重迴圈與判斷式,一定要縮排。也可以使用一些程式編輯器,對程式進行縮排,透過縮排也可以檢討程式是否結構有問題。

3. 變數名稱可讀性
    許多程式設計師懶得打字,就將程式中的變數名稱用簡單的a, b, c, d等字母做為變數名稱,加上缺乏註解說明,程式就變得難以閱讀與維護。
    打字速度是程式設計師的基本能力,快慢沒有一定的標準,當然,越快對您的專業工作越有幫助。變數名稱應該是該變數用途的縮寫,至於有些人要加上變數型態在變數名稱中,各派說法不同,重點還是在變數名稱有意義絕對可以大幅提升可閱讀性。

4. 模組化
    開發軟體專案的過程中,為了趕進度,快點將程式寫完,常常忽略的是程式的模組化,沒能花點時間思考程式中有哪些可以再用的區塊,將此區塊寫成模組(或稱副程式/函式/程序等,不同程式語言名稱不同),這樣將錯過提高未來專案開發生產力的契機。
    程式模組化的幾大好處 :
    a. 提高程式的可讀性 : 越龐大的程式,閱讀上越困難,因此,將程式中的較複雜的處理或計算區塊,加以包裝成模組,簡化主程式的結構,在了解程式功能上更回快速。想要看特定細節再到模組(副程式)中去閱讀。為了提高可讀性將程式寫成階層性的結構,也有一些要注意的地方,第一要避免階層過多,第二避免過度包裝,也就是三到五行的程式就包裝成一個模組。
    b. 提高生產力 : 將可再用(可以重複使用)的模組/副程式/函式,做好的包裝,包含參數設計,註解說明,就成為具有價值得智慧財產,成為提高未來生產力的工具。

   c. 提高程式的可測試性與可維護性 : 越龐大的程式,越難以測試與維護,當我們遇到一個很複雜的問題,可以採用拆解再組合的方式,也就是將大問題,分成許多小問題,一個一個解決,再組合起來解決。測試龐大的程式也是這樣,經過模組化設計的程式,就可以針對程式使用到的模組(副程式)進行測試(針對模組開發測試程式),都沒問題了,再測試主程式。
  
   



2020年1月10日

PHP格式化金額數字顯示千位號但不顯示小數位後方的零

作者: Fred F.M. Wang (FW知識瑣記) 日期:2020/1/10


PHP程式想要格式化金額數字,顯示千位號與指定顯示小數幾位要使用number_format()函式,
但是如果要顯示千位號但不顯示小數位後方的零,如下面例子 :
$val1 = 12345.67;
echo number_format($val1,3);    // (1) 顯示 12,345.670
$val1 = 12345.6; 
echo number_format($val1,3);    // (2) 顯示 12,345.600
$val1 = 12345; 
echo number_format($val1,3);    // (3) 顯示 12,345.000
如果我希望(1)顯示 12,345.67  (2)顯示 12,345.6 (3) 顯示 12,345 
也就是不想要顯示數字後方的零,要怎麼做?

寫一個function number_format_notrailingzeros()
傳地參數 $number為要格式化的數字,$decimal是要顯示最長的小數位數,如下

function number_format_notrailingzeros($number,$decimal){
    $num = number_format($number,$decimal);    
    $pos = strpos($num, ".");
    if($pos === false) { // 無小數
       return $num;
    }else{ // 有小數
       return rtrim(rtrim($num, "0"), "."); // 先移除最後面的零, 再先移除最後面的小數點
    }
}

然後,用上面的number_format_notrailingzeros() 取代number_format(), 如下 :
$val1 = 12345.67;
echo number_format_notrailingzeros($val1,3);    // (1) 顯示 12,345.67
$val1 = 12345.6; 
echo number_format_notrailingzeros($val1,3);    // (2) 顯示 12,345.6
$val1 = 12345; 
echo number_format_notrailingzeros($val1,3);    // (3) 顯示 12,345





2020年1月6日

如果只允許一種聲音存在, 那麼唯一存在的那種聲音,基本上就是謊言

作者: Fred F.M. Wang (FW知識瑣記) 日期:

這句話說得好"如果只允許一種聲音存在, 那麼唯一存在的那種聲音,基本上就是謊言"

「人人有權享有主張和發表意見的自由;此項權利包括持有主張而不受干涉的自由,和透過任何媒介和不論國界以尋求、接受和傳遞消息及思想的自由。」 -- 聯合國《世界人權宣言》第19條 (1948年)

後來的"公民與政治權利國際公約"第12條(1966年)又加上但書 :
「上列權利不得限制,但法律所規定、保護國家安全、公共秩序、公共衛生或風化、或他人權利與自由所必要,且與本公約所確認之其他權利不牴觸之限制,不在此限。」

因此, 許多當權者便藉保護國家安全、公共秩序等理由來箝制反對者的言論

只能說這就是世道。