PHP 使用 PDO 讀取 MySQL , 判斷登入帳號

PHP 使用 PDO 讀取 MySQL , 判斷登入帳號完成....(雖然寫得不是很漂亮)

原理:
一支 PHP 程式, 用 POST 送登入訊息給自己, 所以程式剛開始先判斷有沒有 POST 資料, POST 資料有"動作"一項, 分為 登入 跟 登出 , 再呼叫對應的 function , 如果是登出, 則清除相關變數, 再 refresh 自己, 如果是登入, 再比對輸入是否正確, 讀取 MySQL 如果帳號檔可以查到, 表示帳號密碼正確, 並把帳號另外存在變數內.

如果沒有 POST 資料, 則比對變數內是否有帳號資料, 如果有, 就 require 主選單, 如果沒有, 則呼叫 function login() ; 顯示登入畫面.

沒有寫得很漂亮的地方在於:
1. 變數有點多, 又分在 $_POST , $_SESSION , 還有一些是 global 以便 function 取用, 沒有寫完整規格書. (感謝以前的同事幫忙發現我概念不足.)
2. 以前用 mysql 直接呼叫, PHP7 改用 mysqli , PDO , 有些語法已經忘掉(60%)或不合用(40%), 所以乾脆重學 PDO ....
3. 對陣列處理的不熟悉....
PHP 變數心得-2 :

可以跨不同程式的變數, 要這樣設定:
1. setcookie
2. POST/GET

只用 $_COOKIE["abc"] 無效, $_SESSION 也不行, 一般變數更不行....

PHP 傳送變數心得

原本有: 一般變數, 全域(global), 靜態(static)

另外有: $_COOKIE(存在瀏覽器), $_SESSION(存在server), $_POST/$_GET(由瀏覽器的表頭送給Server).

而 $_POST 有個特殊的情況, 因為瀏覽器本身有一份, 而每次 reload 程式時, 會再送出, 所以就算 server 端執行 unset($_POST) 等方式, 每次 reload 就會重送一次, 而又產生一次.

簡論: 漢字思維與拼音字母思維差異

簡論: 漢字思維與拼音字母思維差異

歐美用的是拼音字母, "字根"本身有累積其意思, 所以像嚴格的德語有定義嚴格的陽性, 陰性等, 美語則有些常見規則, 但仍有很多例外. 而字母組合成字根, 大多需要靠學習字根的含意, 所以, 學會一定字根後, 才能對話, 但字母的數量少, 拼音字母的學習上比較快.

漢字的發展則有許多字本身包含字根, 也有半數包含拼音, 所以學習漢字時, 常常是同時學習字根與拼音; 但漢字發展與簡化過程中, 一則字根的複雜性, 二則可以書寫的工具往往只有官員與商人, 所以生活用語在漢語中其實較少, 而且漢字的拼音也比羅馬字母的拼音少.

而在台語的使用上, 用漢字或拼音, 則需要依用途回到拼音與字義的考慮, 採用羅馬拼音可以接近原音.
而台語或粵語, 客語的"用詞", 個人認為有六成左右受到中原地區影響, 所以雖然很多發音不同, 但都可以透過漢字"理解"其意思.

而這就是已經習慣用漢字的人, 常有兩種誤會:
1. 台語可以用漢字, 這個問題在於漢字本身有字根與發音, 但台語還有(個人觀察)約四成的用詞, 沒有漢字的字根, 這些用漢字並不能表達.
2. 羅馬字母看不懂, 這個問題在於羅馬字母本來就不包含"字義", 而台語又不像歐美有"字根", 所以就算學過英文的人來看台語羅馬字, 仍要重頭學台語的文法.

至於透過政治打壓台語, 就屬於另一層次的問題了....


用 LINE 當臨時筆記....

由於手機裝軟體會考慮記憶體用量, 雖然 Evernote 很方便, 但很多時候只是記個帳, 記車子的里程等小事, 不想另外開軟體甚至裝軟體.

之前是用 Facebook 貼文然後設定隱私為"只限個人", 不過由於 Facebook 一直改演算法, 或有時轉貼其他訊息後, 短期的筆記就不太好找.

最近發現 LINE 群組也不錯用, 先開一個只有自己的群組, 命名時群組名稱前面可以多加幾個空白, 會讓群組排到最前面.
然後這種小資料, 就可以筆記在群組內, 如果有需要, 也可以直接轉貼給 LINE 的其他使用者.


電腦裝 Lubuntu Linux + 新酷音 + Dvorak 完成

這兩天試著在電腦上安裝 Lubuntu , 原本卡在鍵盤配置, 輸入法間, 如果預設鍵盤配置為 Dvorak , 新酷音的注音就會出問題.

先稍微說明一下結構....

由於電腦鍵盤本身有自己的 key code , 而作業系統處理時, 就分成兩種方式:
一種是直接把 key code 轉送給軟體,
一種是先把 key code 轉成 ascii 碼或類似原理, 再轉給軟體.

在歐美國家不管哪種方式, 問題都不大, 因為拉丁字母數量不多, 大概只有鍵盤配置的差別.
但在亞洲文字(含中亞地區)就有問題了, 因為亞洲文字有許多不是拉丁文字, 除了需要不同的文字編碼(如 Unicode ), 還需要輸入法把使用者從字母鍵盤按的鍵, 轉譯成應用軟體能理解的文字.

因為多了這一層, 輸入法的處理就變得有點複雜, Windows 2000, XP, 7 跟 MacOS X 的輸入法, 都可以跟系統語系分開, 而 Linux 由於大多是開放軟體, 所以也有許多不同的輸入法平台, 目前常見的有: iBus, SCIM, Fcitx, 而 Lubuntu 17.10 預設是使用 Fcitx .

因為新酷音(支援注音輸入方式)是在 Fcitx 平台上運作, 所以使用者從鍵盤按的鍵, 會先經過 Fcitx 處理, 如果系統預設鍵盤為 Dvorak 時, Fcitx 就會以 Dvorak 排列的方式, 傳給新酷音, 反而打出來的是錯的.

所以要使用 Dvorak 當鍵盤配置時, 就需要修改新酷音的設定, 這次整個安裝過程大約是:
1. Lubuntu 17.10 隨身碟開機, 清空硬碟安裝, 語言選 中文(繁體) 鍵盤配置先選 英文(美國), 這樣會自動裝 Fcitx 及新酷音.
2. 在語言與文字把 漢語(台灣) 拉到底下, 這只是個人習慣, 系統顯示都是英文.
3. 了解 Fcitx 結構, Fcitx 把輸入法的第一項稱為"未啟用(inactive)", 其他的輸入法稱為"啟用".
4. 調整 Fcitx 設定, 主要有: a. 切換輸入法包含"未啟用"的輸入法 b. Share State Among Window 改為 PerProgram , 然後輸入法選 Dvorak 跟新酷音兩個.

5. 最後修改 ~/.config/fcitx/conf/fcitx-chewing.config , 增加 Layout=Dvorak Keyboard

6. 登出再登入, 就可以得到預設輸入法是 Dvorak , 而按 Ctrl-Space 或 Ctrl-Shift 都可以切換成新酷音了, 也就更接近原本 Windows 2000, XP, 7 或 MacOS X 的方式.

(Windows 8/8.1/10那種把語系跟輸入法綁得亂七八糟的就別管了....)

PHP&MySQL學習(續.登入)

可能架構上希望比較有彈性.

網路上的範例大多為:首頁 -> 登入 -> 使用功能.

而我想的是: 登入為獨立系統, 在檢查未曾登入或已經過期, 就會跳出來確認, 而且確認後可以繼續使用原功能.

目前已經用mysqli連線, 但"首頁->登入"建立的SQL連線, 在登入頁的<form>轉向驗證後的PHP, 原本的SQL連線就無效了.

另外在安全性&預防SQL injection考慮下, 密碼檔的帳號是MySQL加密, 而密碼檔的密碼是PHP讀寫時就加密, 這樣就算直接讀資料庫也無法得知帳號.

另外看起來趨勢是改用PDO, 還要學一下OO概念跟寫法....

PHP&SQL登入考慮

  • 存放項目
    • SQL: 帳號, 密碼, 目前的session辨識碼, 登入時間或到期時間
    • 瀏覽器Cookie: session辨識碼, 到期時間.
    • PHP不同程式: 載入時寫一個變數, 平常執行時會檢查變數是否已經設定.
  • 處理的條件:
    • 登入時(瀏覽器無Cookie, SQL內無session辨識碼及時間.
      • 首頁->登入頁->輸入帳密->檢查帳號密碼是否與SQL相符->正確的話給一組session辨識碼, 同時記錄於SQL及cookie.
    • 正常運作程式
      • 隔一陣子更新一次session, 同時更新cookie與SQL內記錄
    • 過一陣子開程式
      • 功能頁->檢查cookie session是否到期->如果已經到期->重新檢查帳號密碼->更新session->回到原畫面或登入頁.
    • 登出時
      • 清除cookie, SQL的session辨識碼
    • 在另一台電腦登入時,
      • 比對session不同, 依應用面決定允許多個登入, 或踢掉原登入.