第二題二解完成

雖然只是照進度把題目練習完了,不過今天完成的解題模式大概就是之後的定案了,在不使用framework的狀況下,利用pdo及自訂函式來協助解題,的確可以減少打字上的錯誤,同時也增加了效率和安全性;在每一個項目的解法上,目前也大致都定形了,沒有什麼新的做法可以研究了,之後應該就是照著這套模式把題目練熟就可以了。

簡單說一下目前的解題策略及順序:

  1. 先建立PDO的連線物件,
  2. 接著撰寫四到五個自訂函式,包括了新增/修改/刪除/取用資料等常用的動作,
  3. 建立前後台的所有功能頁面基本HTML語法
  4. 逐項功能製作及建資料表
  5. 微調及測試

之後的安排就是每天100題學科的練習及每周兩題術科的複習,看來是妥妥的了。




利用函式來協助解題

這周的進度是第一,二題的練習,上周原本應該是三四題,結果只練了第三題,這周如果時間夠,要把第四題的進度補上。

這次解第一題,延續上周使用PDO的方式,實際用下來,除了仍然要手動打sql語法這點之外,整體對解題來說是有不小的幫助,至少不會像以前那樣常發生括號裏要放的變數打錯字或忘了放之類的,不過這次解題上幫助最大的應該是函式的代入,這是很早就想嘗試的做法,但是之前一直沒有時間好好的來研究,今天試了一下,果然很棒;原理就是把一些常用的資料庫操作包成函式來處理,其實PDO本身有提供前置語法的做法可以達到和函式相同的功能,不過那塊我還不是很清楚,再加上,我的需求會用到陣列的代入,目前找不到PDO有類似的用法,所以還是採用函式的方式來處理。

我目前做的函式有四個分別是刪除資料(delData($table,$seq)) / 新增資料(newData($table,$data)) / 修改資料(upData($table,$seq,$data)) / 整表取出(allData($table)),參數中的$data是陣列的資料,因此我在函式中會用迴圈的方式去取出陣列資料,再組合成需要的sql語句來送出,比如delData的內容;

function delData($table,$seq){
  global $pdo;
  $pdo->query("DELETE FROM ".$table." WHERE seq='".$seq."';");
}

這樣的做法,讓我省掉不少檢查sql語句的時間,只需要把參數代入就好了,目前還是有些地方是使用完整的語句,比如分頁的部份不是很麻煩,特別去寫一個函式好象也沒有省多少時間,所以類似這樣的情境我還在考慮要不要換成函式,比如計算資料表的總筆數這件事,做一個函式的確可以省不少時間,但是因為在題目中只有分頁會使用到這個功能,而分頁做到後來基本上都是直接複製貼上到所有需要分頁的功能去的,這樣算起來似乎弄個函式也不一定會省時間,不過就長期來看,這樣的做法還是很有幫助的。




開始練習 PDO的使用及網頁乙級第三題的練習

這周主要目標的第三和第四題的重新練習,不過因為最近開始在研究一些新的框架和技術,所以除了先前的解法外,也打算試試用新的語法來解題,PDO是最先想到的改變,PDO是目前PHP官方推薦的資料庫連線方式,除了安全性的強化之外,最主要的改進就是對於多種資料庫的相容,以往如果要連接不同的資料庫,就得使用不同的資料庫語法,mysql的話是一連串mysqli_XXX的函式,PostgreSQL的話就是一堆pg_XXX的函式,如果將來有可能更換資料庫的話,那整個程式的語法都得改,PDO的功能就是整合連接資料庫的介面,只需要一套語法,就可以對應各種資料庫了。

之前一直沒有碰PDO是因為對物件導向的操作有點恐懼,不過最近在接觸的東西幾乎都是物件導向了,無法再逃避了,所以利用解題的機會直接就拿來使用了,由於PDO只有資料庫連接的部份算是使用了物件導向,其它的部份並沒有需要也跟著改成物件導向,所以其實我只花了半小時了解一下怎麼連接資料庫和撈資料後就上手了,解題不需要利用到預處理的機制,所以那塊我就先跳過了,這樣使用下來其實也和之前使用mysqli_的方式沒有太大差異。

使用心得上,我覺得對比之前的做法,PDO的一些函式用法的確簡化了一些程式的撰寫,整個結構也不會太亂,甚至因為可以少打一些符號和指令,我反而覺得在解題上使用PDO還比較快一些,比如之前在做分頁時,如果要計算總筆數,我會一行式的指令來寫;

$total=mysqli_num_rows(mysqli_query($link,”SELECT  * FROM post”))[0];

改成PDO之後的語法會變成;

$total=$pdo->query(“SELECT * FROM post”)->rowCount();

sql語法的部份並沒有什麼不同,但是在函式的應用上,從原本的一個包一個的語法變成直接用物件來取用,習慣之後其實縮短了不少打字時間,另外,像是PDO滿鼓勵直接用fetchALL()的方式把撈出來的資料丟到陣列去處理,雖然原本也是有mysqli_fetch_all()這樣的用法,但是一般坊間的書或課程很少有提這種用法,以我今天在解第三題的首頁動畫部份來說,如果是傳統的方式,我在海報主圖和按鈕的地方要分別去撈兩次一樣的資料,這其實滿消耗資料庫資源的,我今天的解法就改成直接fetchAll()到一個陣列後,直接在兩個地方把陣列的內容拿來使用就可以了,不用擔心資料指標的問題。

至於第三題的解題心得部份,因為這陣子在接觸canvas的操作,所以對jQuery的使用有些新的心得,因此在做動畫的部份,我也改了做法,原本是利用函式直接在DOM中找到元素再做字串處理再丟去放動畫,這樣其實要了解不少DOM的尋找,字串的取代技巧等等,我的新做法是直接把DOM的id和對應的動畫做成兩個陣列放在script區域中,這樣就不太需要去管DOM的部份,專心在陣列的操作上就可以了,程式架構就簡化不少,不過今天還是有遇到一個比較卡關的問題,就是jQuery的animate()這個動畫函式只能操作數值型的屬性,非數值型的屬性是起不了作用的,比如顏色;另外也發現一個字型的問題,當字型被縮到系統預設字型大小時,似乎就無法再縮小了,比如我想做一個字型由50px縮小到0px的動畫,然後發現字型到了12px時就停住了,等動畫跑到0px時字就直接消失,雖然這點小問題對解題成果來說不是什麼會扣分的要素,不過我倒是花了快一小時在研究這個問題,最後能用的解法就是使用CSS原生的動畫方式來解決。

接下來的幾周練習,我都會開始把一些新的做法直接帶入乙級的解題中,試試看能不能找到更快速的解法來