Ting-Jun (snsd0805)

Ting-Jun (snsd0805)

Developer. Student

© 2019

[工程日誌]科學班成績查詢系統

近期要更改去年寫的資優班成績查詢系統給科學班使用,預計三~四天更改完畢
本篇稍微為自己做個紀錄

日誌

2018 3/3

現在是寫3/3(六)的進度,今天還沒有讀課內書,
除了中午搶票出去匯款之外都坐在電腦前。

因為去年8月寫舊系統時才剛學PHP大概兩三個月,
所以寫出來的都還是很雜亂的程式碼,
分頁也分得有點雜亂,
早上8點起床大概花了一個半小時重新讀一次code,
因為註解有點少,而且那些code原本就是接續其他人的進度,
完全忘記為什麼會這樣寫,所以讀的很痛苦。

去年8月本來預計只有用在自己學校,所以程式碼寫的很死,
但是系統開放前兩天被通知要增加兩間學校放在同一個系統,
而因為這些程式碼可維護性很低,因此花了不少時間修改,
甚至還差點趕不出來,所以這次目標還要重新把code整理成物件導向的方式。

今天整天把前端介面和登入以及查詢重新寫好
這次所有學校名稱、開放時間、以及其他相關變數都放在config.ini文件中
方便後面修改時不用直接從code裏面翻
但今天做的更改在後續撰寫程式碼時有遇到一些困難點
例如$school這個代表學校的變數在函式的帶入中, 在某些時候要用”chsh”之類的字串(學校名稱)做判斷
但有時候又是以’1’這類的整數型態(學校代碼)做判斷
後續可能要先畫好系統規劃圖

另外,與資料庫操作相關的操作都改成統一寫在DataManager.php內,
同樣以方便維護為重點而更改,
這裡分成管理者與使用者的不同而寫在不同class裡。
前後端分離顯然做的不夠好,
這部份要再問問學長和老師的建議。

今天進度算不錯,再來剩下上傳成績文件管理者介面了!
(2018 03/04 01:30 update)

2018 3/4

昨天太晚睡,所以今天很晚起床,
起床吃個飯頹廢了一陣子,讀了一下書
下午四點半才開始繼續寫code。
今天原本預計把上傳成績文件的部份寫完,
畢竟週日還是想要好好休息。

去年的code是把三校的上傳系統寫在不同頁面,
這次想放到class裡面方便維護,透過function的引數來決定寫入的資料庫,
稍微研究一下原本的code,對form傳遞的檔案並沒有詳細檢查,
安全性可能令人堪憂,有可能因格式不對而造成資料庫寫入錯誤。
預計先判斷file是否為空,接著判斷檔案格式是否為系統需要的CSV檔案,
最後才是判斷CSV檔內的欄位是否符合說明文件的格式。

另外,去年曾經因文字編碼而吃了大虧,
因為我在做開發時是用Linux系統,編寫系統時是預設為處理UTF-8編碼,
而在做系統測試時是用Libreoffice編寫上傳文件,
匯出成CSV檔時未考慮到微軟Windows使用者常用編碼為BIG-5,
因此當時直接用Libreoffice預設的UTF-8編碼,
所以並沒有發現錯誤。
到了系統預先開放給各校管理者上傳最終成績文件時,
發生了學生姓名到了資料庫產生亂碼的情形,
所以當時是請管理者將文件發送至我這邊,
讓我先將原本文件轉成UTF-8格式。

這次為了更符合使用者使用情況,將會另外編寫BIG-5的處理系統,
若使用者的文件為BIG-5編碼,系統要先將其轉為UTF-8,
有找到一個字串編碼處理的函式iconv("原始編碼","目標編碼","字串"),以下為範例。

$string="轉碼測試";
$result=iconv("big5","UTF-8",$string);
echo $result;

最後會印出結果,但搜尋到資料說有些中文字其實並無法正確轉換,
例如:銹、裏這些字。
用iconv()可能會造成後段文字停止處理,
因此許多人建議改用mb_convert_encoding("字串","目標編碼","原始編碼")
雖然還是無法轉換前述的某些字,但他不會像iconv一樣停止,
而是會略過無法轉換的字,接著處理後面的文字,下面為使用範例。

$string="轉碼測試";
$result=mb_convert_encoding($string,"UTF-8","BIG5");
echo $result;




然後在處理file的上傳的時候使用以下函式將資料移動到將要處理的目錄。

move_uploaded_file($_FILES["file"]["tmp_name"], "CSV/" . $_FILES["file"]["name"]);

去年文件的存放位址是用絕對位址的方式移動檔案,
但剛剛在測試的時候竟然無法移動,最後是用相對位置才成功,
這部份有可能是伺服器權限有設定錯誤,但是目前還沒有發現是哪裡出了問題,
過一陣子再來研究。

今天耗太多時間在研究檔案的移動,
晚點回學校宿舍看看有沒有時間繼續把上傳的部份完成,
沒有的話只能等明天放學後繼續寫,
可能會遲個一兩天完成這個系統了!
(2018 03/04 18:00 update)

2018 3/5

昨天的進度太慢了!不過今天應該可以簡單完成基本功能,
如果有要再增加的部份後續再補上其他function
因為「上傳」這個部份真的很複雜,所以我分了好幾個方法,
可是最後好幾個function指來指去真的跟c++指標有得比,真TM有夠複雜。
不過就像前幾天說的要先畫系統規劃圖,如此一來應該會更清楚一點。
因為也還不熟悉物件導向,所以也不太確定這些function這樣分到底好不好,
過幾天要拿code去問老師看看他的意見。
大致先紀錄一下「上傳」這部份有哪些function,以免以後又忘記。

upload.php先判斷post過來的exam是屬於哪一種考試成績,

然後分別送「初試」的Upload_FirstExam()、「複試」的Upload_FinalExam()

相關的參數在建立物件時就先透過__construct()傳遞。

接著是判斷文件是否成功上傳的Check_Upload()

再來是CSV檔案逐行讀取,並透過static的function stu_exist("$sn")exam_exist("$sn","$exam")

判斷此筆資料是否已經存在在database裡。


原本打算將讀取CSV檔寫入資料庫再另外分成幾個function,
想說程式碼會不會看起來比較簡潔,
但是試過後疑似在物件傳遞過程有哪裡出了錯,
所以今天花了不少時間在debug,最後毅然決定先照原先的程式碼,
後續有時間再來將它寫好看一些。

那今天工作進度差不多到這邊,過幾天可能會再改一些細部的項目
目前還沒有規劃,明天再想想看有沒有什麼地方可以改進的。
然後明天要把現在初步的code拿給學弟看,
畢竟過不久也要把一些工作交給他們了。
過幾天拿去demo給老師確認,沒問題後可能就要製作系統說明文件送交教務處處理了。

這次系統的在這幾天應該就要告一個段落了,
先紀錄一下自己這幾天來的想法:

  1. 還不熟悉物件導向,導致寫起來並沒有更有效率。

  2. 對於系統的規劃並沒有很完善,常常程式碼改了又改,造成後續開發的麻煩

  3. 工作進度沒有徹底執行。

  4. 最近一直以來都沒有碰程式,很多細節都沒有記住

  5. 對database還不熟悉,學了資料庫已經大約有半年了,可是還是一直停留在SELECT,INSERT這些語法,卻沒有進一步學習新的東西


(2018 03/06 00:00 update)