哈佛公開課:構建動態網站——第五講SQL(續)

1.在這個課程中的服務器關於目錄的配置,默認是在項目0下面

通常供用戶訪問的文件夾html設置爲701或711權限。而php文件通常是600,而另外幾乎所有文件比如css和非動態html還有圖片等等最好設置爲644權限。


2,凡是從用戶獲取輸入是都應該使用mysql_real_escape_string函數

3.注意數據庫中註冊用戶的密碼要加密。而在PHP中提供了幾種可用方法,不僅加密還有些其他在查詢時對數據和信息進行相關操作:


4.這裏使用了PASSWORD函數進行處理,但這樣還不夠好,只是弱哈希,知道原理的人都有可能從生成的哈希字符串中獲取回實際密碼。

5.使用SELECT 1 FROM……是一種用於做用戶登錄驗證的捷徑,我本就不需從mysql中獲取所有數據,這樣查詢結果是會返回1,如果查詢失敗則是返回空,這樣最小化傳遞數據量 是最好的。

6.前面提到了AES_ENCRYPT('%s','secret')函數,有兩個參數,第一個是待加密的字符串,第二個是加密密鑰。這個函數就比生成哈希串的PASSWORD函數要更安全。另外需要記住的是如果使用了AES_ENCRYPT函數,那麼對應的pass項的Type應該選擇varbinary而不是varchar之類。

7.當數據庫表格中用了varbinary這類二進制類型,當要轉移數據庫的表格時,就要格外留意了,若把這類數據導入導出(尤其存入文本文檔),則可能導致最後密碼不匹配,也就是密碼並非是以前的那個二進制了。

8.前面使用AES_ENCRYPT函數中用的密鑰是我們明文給出的,這樣也不安全,因爲一旦有攻擊者獲得了這個密鑰那用戶的密碼也會暴露出來,所以替代方法是用用戶自己輸入的密碼作爲密鑰要加密用戶的密碼。

9.對應的還有解密函數,通過調用數據庫中加密後的密碼然後解密出原本密碼。


以下是在phpmyadmin中使用後返回的效果圖


10.使用INSERT插入一個新註冊的用戶


11.使用不同的數據類型都需要不同存儲空間和計算能力,因此對程序性能影響很大


12. 比如在設計一個賽車比賽數據的數據庫時,如果一張表格中有選手的名字,車型,參加的何種比賽,參加日期,天氣狀況等等,其中不同選手之間都有可能出現參加了同一個比賽,同一天等等,因而導致這個表格中光是何種比賽就有許多個重複,因此把這些分開到不同表格中去,比如參賽選手錶就只有選手獨有的信息,還有一張賽事表記錄了不同的賽事,將賽車表和車手錶分開,因爲同一個賽車可能有多個車手去駕駛,若存在一個表中,也會出現大量的重複項,綜上也就是說將表格分開存儲。


然後將driver_id,event_id,car_id設置成三個聯合主鍵。

13.ID項最好做成無符號型,開啓每添加一項後自動增長。當簡單數據類型能達到使用目的時,就不要使用複雜的數據類型,因爲有時將數據轉移到其他類型數據庫,基本數據類型移植性更好,有些複雜類型可能只支持mysql。

14.查詢車手錶中的姓名字段以及用時表中的所有字段,當用時表中的driver_id字段匹配車手錶中的id字段時。


這樣返回的結果就把兩個不同表的信息合併到同一個表中了,這就是所謂的內連接(inner join)。

14.還有一種叫做交叉連接(cross join),它會給出所有的可能的結果, 這個不常用,但調試時常用,因爲可以給出大範圍的結果。


15.左外連接(left outer join),下例中將車手錶作爲左表,左連接將執行所有兩表的匹配,同時還會給出右表中無匹配的其他左表內容。這樣就可以看到匹配和不匹配的所有行。


結果就是:


16.通過內連接,組合所有信息,將多個表結合起來


17.對於一些有唯一ID的項最好不要輕易刪除,比如一輛賽車信息,如果這輛車不再使用了,那麼可以添加一個賽車是否禁用項進行一個設置,而不要直接從數據表格中刪除掉它,同理註冊用戶也得有個是否可用的標誌項。

18.這裏用到了count,對結果集的行數進行計數。


19.從某個選手的參賽記錄中,查看他最早參加的比賽是什麼。ODER BY後面是要排序的數據,ASC是升序的縮寫,而且LIMIT 0,1限制了僅一條記錄,即我希望它能從最老到最新排序,並且只給出一條記錄,也就是最老的那條記錄。


20.在設計數據庫時儘量減少不必要的信息記錄,就是那些可以通過已知數據計算出來的信息,就沒必要單獨列出一項來記錄它們。

21.內連接的基本形式:


常用內連接的簡記形式:



22.競態條件的例子:比如發出請求要同伴幫忙買牛奶但回家後發現冰箱裏面沒有牛奶,發出請求,但沒有任何獲得,這就是競態條件。

又比如下面想表格的a,b,c項插入值1,2,3,但假若a是主鍵並且有1了,那麼此時插入數據會失敗。因此有了下面的ON DUPLICATE KEY,作用是如果有重複的了則做後面的動作。此時等價於後面的那句話UPDATE table SET c=c+1 WHERE a=1;


23.事務(TRANSACTION),當我要把一個賬戶中的錢轉移到另一個賬戶中時。這樣就能避免競態條件了。這個事務只有在最後COMMIT語句執行時纔會開始,COMMIT表示兩個語句會原子執行,中間不會存競態條件


24.同樣的還有ROLLBACK語句,就是當發現一些糟糕的事發生了,你可以解除之前的嘗試。比如不小心連續誤點擊了兩次轉賬,這時由於有ROLLBACK就可以撤銷多點擊的那次操作。


25.InnoDB能支持這種事務,但這個功能使用的計算資源大於MyISAM,因此只有確定要使用事務時才選InnoDB,一般使用MyISAM的表格鎖定即可,表格鎖定的缺點在於它對所有人鎖定整個表格,優點在於可以進行一些原子操作,而其他人此時不能接觸到表格,不過解鎖之前所有人無法接觸確實存在缺點。比如下面我們可以鎖定表格,用的是寫鎖定


還有種讀鎖定,作用就是所有人都不能寫人包括你,都只能讀,常用在備份表格的時候。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章