這周主要目標的第三和第四題的重新練習,不過因為最近開始在研究一些新的框架和技術,所以除了先前的解法外,也打算試試用新的語法來解題,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原生的動畫方式來解決。
接下來的幾周練習,我都會開始把一些新的做法直接帶入乙級的解題中,試試看能不能找到更快速的解法來
留言