
使用SQL整合网页与资料库ppt课件.ppt
71页第十八章运用SQL整合網頁與資料庫張智星jang@mirlab.orgmirlab.org/jang台大資工系 MIR實驗室JavaScript 程式設計與應用:用於伺服器端的ASP環境本章大綱n大綱n本章說明如何运用 SQL 來進行 ASP 網頁與 Access 資料庫的整合,並有大量的實用範例,讓讀者知道如何經由網頁進行對資料庫的檢視、新增、修正、刪除等根本操作n主題n18-1:ODBC 與 DSN 簡介 n18-2:網頁與資料庫整合的根本範例 n18-3:运用 SQL 來檢視資料 n18-4:运用 SQL 來新增、修正、刪除資料 n18-5:資料隱碼〔SQL Injection〕JavaScript 程式設計與應用:用於伺服器端的ASP環境18-1:ODBC 與 DSN 簡介n本小節介紹ODBC與DSN的設定JavaScript 程式設計與應用:用於伺服器端的ASP環境运用資料庫的好處n資料的維護較為容易,可以运用標準的 SQL〔Structure Query Language〕指令來進行資料庫的各種資料處理,含查詢、新增、修正、刪除等運算n資料之間的關連也可以运用關連式資料庫〔Relational Databases〕來保證資料的正確、完好和一致性,並同時減少不用要的資料量。
n普通應用程式可以运用 ODBC〔請見以下說明〕來對資料庫進行標準的處理 n資料在不同資料庫之間的轉換較為容易,普通資料庫廠商都有提供相關的轉換程式 n資料與網頁的呈現是獨立的,可以分開進行,互不干擾 JavaScript 程式設計與應用:用於伺服器端的ASP環境ASP與資料庫整合要點n瞭解資料庫的根本概念 n瞭解 ASP 如何經由 ODBC 與資料庫溝通 n瞭解 如何运用 SQL 來對資料庫進行查詢、新增、修正等動作 JavaScript 程式設計與應用:用於伺服器端的ASP環境ODBCnODBC 是 Open DataBase Connectivity 的簡稱,它是一個工業界的標準n可以看成是各家資料庫廠商所提供的一個「應用程式介面」〔Application Program Interface,簡稱 API〕n可讓其他軟體或程式根據這個標準一致的程式介面,來對資料庫進行新增、讀取、修正、刪除等動作n對資料進行的動作,在資料庫的術語來講都是 「查詢」〔Query〕,而這些查詢動作都是根據 SQL 的標準資料庫語言來完成JavaScript 程式設計與應用:用於伺服器端的ASP環境ASP 經由 ODBC 與資料庫溝通n直接指定資料庫在本機硬碟的路徑n此種方法較具彈性,整個應用程式目錄可在不同的伺服器中搬動,但能對資料庫進行的設定有限。
n指定DSNn我們必須在控制台設定「資料來源名稱」〔Data Source Name,簡稱 DSN),以指定可經由 ODBC 連結的資料庫此種作法較不具彈性,但卻能經由本機對資料庫進行比較完好的設定 JavaScript 程式設計與應用:用於伺服器端的ASP環境設定DSN (1)n從微軟視窗系統左下角的「開始」選單進行選取,順序為「開始/控制台/系統管理工具/資料來源 (ODBC)」,此時所打開的「ODBC資料來源管理員」,其外觀如下:JavaScript 程式設計與應用:用於伺服器端的ASP環境設定DSN (2)n點選「資料來源(ODBC)」,開啟視窗後,再點選「系統資料來源名稱」JavaScript 程式設計與應用:用於伺服器端的ASP環境設定DSN (3)n說明n由「系統資料來源名稱」所設定的 DSN,是屬於系統級的 DSN,因此其他运用者〔含網頁瀏覽者〕也可以运用此 DSN假设要运用個人級的 DSN,那麼就可以运用「运用者資料來源名稱」,但此設定並不適用於網頁瀏覽JavaScript 程式設計與應用:用於伺服器端的ASP環境設定DSN (4)n點選「新增」,再選擇「Microsoft Access Driver (*.mdb)」,請留意:不要誤選另一個很類似的選項「Driver do Microsoft Access (*.mdb)」!JavaScript 程式設計與應用:用於伺服器端的ASP環境設定DSN (5)n輸入「資料來源名稱」,假設我們輸入的字串是 dsn4test。
JavaScript 程式設計與應用:用於伺服器端的ASP環境設定DSN (6)n再按下「選取」,就可以選取對應的 Access 資料庫,之後再一路點選「確定」,即可完成 DSN 的設定JavaScript 程式設計與應用:用於伺服器端的ASP環境MS資料庫的選擇nMS Access 並不是企業專用的資料庫引擎,因此效率並不是很好,而且也不援助許多大型的資料庫應有的功能,但是對於小型的網路應用而言〔例好像時上線人數少於10人左右〕,Access 還算堪用 nMS SQL Server 是微軟推出的資料庫引擎,專門對付大型網路應用,是普通中小企業較常採用的資料庫 JavaScript 程式設計與應用:用於伺服器端的ASP環境18-2:網頁與資料庫整合的根本範例n本小節介紹各種ASP與資料庫整合的方法JavaScript 程式設計與應用:用於伺服器端的ASP環境ADOn在ASP程式設計裡,用來存取資料庫或表格資料的物件統稱 ADO〔ActiveX Data Objects〕nADO是一個 ASP 內建的資料庫存取元件,可以經由 JavaScript/JScript、VBScript 等語言來控制資料庫的存取,並可連接多種資料庫,包括 SQL Server、Oracle、Access 等援助ODBC的資料庫。
nADO 主要包含 Connection、Recordset 及 Command 三種物件JavaScript 程式設計與應用:用於伺服器端的ASP環境Connection 物件n运用 ADO 的 Connection 物件來進行資料庫的檢視查詢,主要有以下四個步驟n建立資料庫連結,然後開啟資料庫n執行SQL指令,並將查詢結果儲存於 Recordset 中:假设是檢視查詢,我們可將結果存至 RecordSet 物件變數「rs」中,以便後續取用n获得欄位名稱及內容:假设是檢視查詢,我們可以运用以下的的方式來获得欄位名稱及內容等資訊n關閉 RecordSet 及資料庫連結JavaScript 程式設計與應用:用於伺服器端的ASP環境建立並開啟資料庫n运用「Server.CreateObject」定義一個 ADO 的 Connection 物件,然後运用其「Open」的方法來開啟資料庫來源n設定 conn 物件的 ConnectionString 性質來指定資料庫n連結到他想要連結的本機或遠端資料庫最後再用 conn 物件的 Open 方法,來開啟資料庫conn = Server.CreateObject("ADODB.Connection");conn.Open();JavaScript 程式設計與應用:用於伺服器端的ASP環境指定資料庫方法n直接指定 Access 資料庫在本機硬碟的路徑n指定 DSN〔資料來源名稱〕n直接連結至 SQL Server 資料庫n直接連結至 UNIX 的 MySQL 資料庫conn.ConnectionString = "DBQ=資料庫檔案;Driver={Microsoft Access Driver (*.mdb)};Driverld=25;FIL=MS Access;UID=**;PWD=**"; conn.ConnectionString = "資料來源名稱"; conn.ConnectionString = "Driver={SQL Server};Datebase=資料庫名稱;Server=位址;UID=**;PWD=**"; conn.ConnectionString = "Driver={MySQL};Datebase=資料庫名稱;Server=位址;UID=**;PWD=**"; JavaScript 程式設計與應用:用於伺服器端的ASP環境執行SQL指令n假设是檢視查詢,我們可將結果存至 RecordSet 物件變數「rs」中,以便後續取用。
n說明n以上的程式碼將 SQL 指令所查詢到的結果儲存到 Recordset 物件 rs 中假设不是檢視查詢,則不需求將結果存放於變數 rssql = "Select * from testTable"; rs = conn.Execute(sql);JavaScript 程式設計與應用:用於伺服器端的ASP環境获得欄位名稱及內容 (1)n假设是檢視查詢,我們可以运用以下的的方式來获得欄位名稱及內容等資訊指令指令說明說明rs.EOF是否已指到最後一筆資料,是為True,反之為False rs.Fields.CountRecordSets的欄位數 rs(i).Name第i個欄位的欄位名稱rs("欄位名稱")讀取某個特定欄位名稱的資料 rs(i)第i個欄位的資料 rs.MoveNext將指標移到下一筆 rs.MovePrev將指標移到上一筆 rs.MoveFirst將指標移到第一筆 rs.MoveLast將指標移到最後一筆JavaScript 程式設計與應用:用於伺服器端的ASP環境获得欄位名稱及內容 (2)n說明n要印出每一筆資料的每一個欄位名稱,可用以下典型程式碼:n印出每一筆資料的每一個欄位值,可以运用以下典型程式碼:n以上的程式碼由 rs(i) 讀取資料庫欄位的資料,rs.MoveNext() 將 Recordset 的資料指標移到下一筆,經由 rs.EOF 來判斷能否已到了最末筆資料,並配合 while 迴圈即可得到一切查詢結果的資料。
for (i=0; i
n最後一筆資料的 RealName 欄位和 欄位都未填入資料,但是 RealName 欄位的並無預設值,因此由資料庫抓回來的資料顯示為 null;另, 欄位的預設值是空字串,所以沒有印出任何東西這些欄位的屬性可由 Access 資料表的「設計檢視」選單來設定JavaScript 程式設計與應用:用於伺服器端的ASP環境範例18-1 (2)n假设上述範例發生錯誤,一個能够的缘由是:nOS 是64-bit,而 Access 資料庫是32-bit,解決方案請見httpmirlab.org/users/pony.chen/ 內的「Win7 64-bit上如何运用32-bit的ODBC」連結JavaScript 程式設計與應用:用於伺服器端的ASP環境將範例18-1改成DSN連結n假设要运用 DSN 連結資料庫,首先我們必須先在伺服器設定 DSN〔詳細流程請見上一小節〕,然後就可以在 ASP 內經由 DSN 來指定資料庫〔可以是近端或是遠端〕n以範例18-1而言,假设要由 DSN 來連結資料庫,而不直接指定資料庫,只需把下一列敘述:n改成下一列即可,其中 dsn4test 必須已被設定為指向 test.mdb 的 ODBC 資料來源。
nWebpage: remote host, local hostConn.ConnectionString = "DBQ=" + Server.MapPath("test.mdb") +";Driver={Microsoft Access Driver (*.mdb)};Driverld=25;FIL=MS Access;"; Conn.ConnectionString = "dsn4test";JavaScript 程式設計與應用:用於伺服器端的ASP環境範例18-3n主題:运用 listQueryResult() 函數進行查詢nWebpage: remote host, local hostn說明n此inc檔分別寫了適用於 JScript 和 VBScript 的函數,因此無論是运用 JScript 或 VBScript 的 ASP 網頁,都可以运用此包含檔來列出資料庫查詢的結果n普通而言,SQL 指令已經具有對資料庫進行檢視、新增、修正、刪除等功能,因此只需运用適當的 SQL 指令,再加上前述的方法,即可對資料庫進行完全的處理JavaScript 程式設計與應用:用於伺服器端的ASP環境18-3:运用 SQL 來檢視資料n本小節介紹查詢資料庫相關的SQL語法。
JavaScript 程式設計與應用:用於伺服器端的ASP環境SQL簡介nSQL 是「結構化查詢語言」〔Structured Query Language〕的簡稱,是由 IBM 公司於 1970 年代所發展出來,用於關連式資料庫 (Relational Databases) 當中的一種資料庫查詢語言,利用 SQL 可以用來進行各種與資料庫相關的處理,例如:n產生資料庫內的資料表 n定義資料表內的欄位與相關資料型態 n建立表格之間的關連性 n對資料進行處理:新增、修正、刪除、查詢 對資料進行統計 JavaScript 程式設計與應用:用於伺服器端的ASP環境SELECTn檢視資料庫的資料,运用的 SQL 主要指令是「SELECT」n根本結構n說明nSELECT 的欄位名稱為待查資料庫的欄位名稱 nFROM 的資料表名稱為待查資料庫的資料表名稱 nWHERE 的條件式為設定查詢的條件式nORDER BY 的欄位名稱為欲排序的欄位,可將查詢的資料根據這些欄位來排序指定多個欄位時,則以「欄位名稱1」排序,假设其資料一样則再依「欄位名稱2」排序,依此類推n中括號表示選擇性條件,也就是說只需SELECT和FROM是必要條件。
SELECT 欄位名稱1, 欄位名稱2, ... FROM 資料表名稱1, 資料表名稱2, ... [WHERE 條件式] [ORDER BY 欄位名稱1, 欄位名稱2, ...]JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例 (1)n我們以資料庫 basketball.mdb 為例,這個資料庫包含兩個資料表: nPlayer 包含球員的資料,其中 TeamID 是球員所隸屬的籃球隊代號〔載明在 Team 資料表〕,Percentage 是投籃的命中率 nTeam 包含籃球隊的資料,其中 WinNo 是本季的贏球次數 JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例 (2)nSELECT * FROM Teamn意義:一切球隊資料n說明:「*」代表 Team 資料表中一切的欄位n查詢結果:IDNameWinNo1 台北隊 12 2 新竹隊 7 3 台中隊 10 4 南投隊 12 5 台南隊 17 6 高雄隊 16 7 澎湖隊 11 JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例 (3)nSELECT TOP 3 * FROM Teamn意義:一切球隊資料,但只抓前三筆n說明:「TOP 3」代表只抓取前三筆資料。
也可以运用「TOP 25 percent」等,代表抓取一切資料的前百分之二十五n查詢結果:IDNameWinNo1 台北隊 12 2 新竹隊 7 3 台中隊 10 JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例 (4)nSELECT Name, Percentage FROM Player WHERE NickName=‘gavins’n意義:綽號為 gavins 的球員姓名及命中率n查詢結果:NamePercentage林政源 55.65 JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例 (5)nSELECT * FROM Team WHERE Name like ’台%’n意義:隊名以「台」開頭的球隊資料n說明:「%」代表恣意長度的字串n查詢結果:IDNameWinNo1 台北隊 12 3 台中隊 10 5 台南隊 17 JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例 (6)nSELECT Name, Percentage FROM Player WHERE Name like ’陳__’n意義:「姓陳且名字有三個字」的球員姓名及命中率n說明:「_」代表恣意單一字元。
n查詢結果:NamePercentage陳孜彬 50.26 陳俊傑 44.65 陳江村 48.76 JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例 (7)nSELECT Name, WinNo FROM Team WHERE WinNo>10n意義:「勝場數大於10」的球隊名稱及其勝場數n查詢結果:NameWinNo台北隊 12 南投隊 12 台南隊 17 高雄隊 16 澎湖隊 11 JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例 (8)nSELECT Name, WinNo FROM Team WHERE WinNo>10 ORDER BY WinNo DESCn意義:「勝場數大於10」的球隊名稱及其勝場數,並根據勝場數由大到小陈列n說明:假设不参与 DESC,則會進行由小到大的排序n查詢結果:NameWinNo台南隊 17 高雄隊 16 南投隊 12 台北隊 12 澎湖隊 11 JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例 (9)nSELECT TeamID, Name, Percentage FROM Player WHERE TeamID=5 ORDER BY Percentage DESCn意義:「球隊代碼為5」的球員命中率排行榜n查詢結果:TeamIDNamePercentage5 邱中人 67.45 5 陳晴 57.28 5 林政源 55.65 5 張秤嘉 49.77 5 陳俊傑 44.65 5 葉佳慧 33.33 JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例 (10)nSELECT * FROM Player ORDER BY TeamID, Percentage DESCn意義:每一隊的球員命中率排行榜n說明:列出結果會先按 TeamID 由小到大排序,再按 Percentage 由大到小排序。
n查詢結果:IDNickNameNameTeamIDPercentage18 Gao 高名揚 1 67.88 12 roland 吳瑞千 1 55.87 13 sony 林頌華 1 54.77 3 ben 陳孜彬 1 50.26 …JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例 (11)nSELECT count(*) FROM Team WHERE WinNo>10n意義:「勝場數大於10」的球隊總數n說明:count()函數會計算資料筆數,資料庫會自動產生暫時的欄位名稱 Expr1000n查詢結果:Expr10005 JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例 (12)nSELECT max(Percentage) as 最高命中率 FROM Playern意義:一切球員的最高命中率n說明:max(Percentage)函數會計算命中率最大值由於运用了「as 最高命中率」,資料庫會自動產生暫時的欄位名稱「最高命中率」n查詢結果:最高命中率最高命中率88.97 JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例 (13)nSELECT TOP 1 Name, Percentage FROM Player ORDER BY Percentage DESCn意義:具有最高命中率的球員資料n查詢結果:NamePercentage洪鵬翔 88.97 JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例 (14)nSELECT Name, Percentage FROM Player WHERE Percentage in (SELECT max(Percentage) FROM Player)n意義:具有最高命中率的球員資料n說明:功能同前一個範例,但是改用兩個 SQL 指令組合來達成同樣的效果。
n查詢結果:NamePercentage洪鵬翔 88.97 JavaScript 程式設計與應用:用於伺服器端的ASP環境GROUP BY與HAVINGn根本結構n說明nGROUP BY 其後所接的欄位名稱為需求聚合的欄位名稱〔所謂「聚合」,就是將一样欄位值的數筆資料合成一筆新資料nHAVING 其後所接的條件式,則會用在聚合後的資料篩選 SELECT 欄位名稱1, 欄位名稱2, ... FROM 資料表名稱1, 資料表名稱2, ... [WHERE 條件式] [GROUP BY 欄位名稱1, 欄位名稱2, ...] [HAVING 條件式] [ORDER BY 欄位名稱1, 欄位名稱2, ...]JavaScript 程式設計與應用:用於伺服器端的ASP環境GROUP BY與HAVING範例 (1)n意義:每個球隊的球員人數及平均命中率n說明:avg(Percentage) 可以計算命中率平均值,類似的 SQL 聚合函數有 Avg〔平均值〕、Count〔筆數〕、Max〔最大值〕、Min〔最小值〕、StDev〔母群體樣本標準差〕、StDevp〔母群體標準差〕、Sum 〔總和〕、Var〔母群體樣本變異數〕、VarP〔母群體變異數〕等。
由於這是對於每個球隊的統計數字,所以必須用到群組指令「GROUP BY」SELECT TeamID, count(*) as 球員人數, avg(Percentage) as 平均命中率 FROM Player GROUP BY TeamIDJavaScript 程式設計與應用:用於伺服器端的ASP環境GROUP BY與HAVING範例 (2)n查詢結果:TeamID球員人數球員人數平均命中率平均命中率1 6 50.61666666666667 2 1 25.88 3 3 44.54333333333333 4 1 65.55 5 6 51.355 6 2 79.975 7 1 65.87 JavaScript 程式設計與應用:用於伺服器端的ASP環境GROUP BY與HAVING範例 (3)n意義:每個球隊的球員人數,但只顯示球員人數大於 2 位的資料n說明:由於這是對於每個球隊的統計數字,所以必須用到群組指令「GROUP BY」,相關的條件則必須运用「HAVING」來指定n查詢結果:TeamID球員人數球員人數1 6 3 3 5 6 SELECT TeamID, count(*) as 球員人數 FROM Player GROUP BY TeamID HAVING count(*)>2JavaScript 程式設計與應用:用於伺服器端的ASP環境根據資料表關聯性檢視查詢 (1)n意義:台北隊的球員資料n說明:由於兩個資料表都有 Name 欄位,所以我們必須运用 Team.Name 及 Player.Name 來區分不同資料表的欄位。
另外,這兩個資料表的關聯性是由(Player.TeamID=Team.ID) 所建立,所以在後續的範例中,我們會不斷运用這個查詢條件SELECT Team.Name, Player.Name, Percentage FROM Player, Team WHERE ((Team.Name='台北隊') and (Player.TeamID=Team.ID))JavaScript 程式設計與應用:用於伺服器端的ASP環境根據資料表關聯性檢視查詢 (1)n查詢結果:NameNamePercentage台北隊 陳孜彬 50.26 台北隊 高名揚 67.88 台北隊 李宜揚 36.67 台北隊 林頌華 54.77 台北隊 吳瑞千 55.87 台北隊 吳志銘 38.25 JavaScript 程式設計與應用:用於伺服器端的ASP環境根據資料表關聯性檢視查詢 (2)n意義:高雄隊和台中隊的射手排行榜n查詢結果:NameNamePercentage台中隊 陳江村 48.76 台中隊 許嘉晉 47.65 台中隊 林惠娟 37.22 高雄隊 洪鵬翔 88.97 高雄隊 許文豪 70.98 SELECT Team.Name, Player.Name, Percentage FROM Player, Team WHERE (Player.TeamID=Team.ID) and (Team.Name IN ('高雄隊', '台中隊')) ORDER BY Team.Name, Percentage DESCJavaScript 程式設計與應用:用於伺服器端的ASP環境根據資料表關聯性檢視查詢 (2)n意義:每個球隊的相關統計數字n說明:由於這是對於每個球隊的統計數字,所以必須用到群組指令「GROUP BY」。
同時由於被選取的欄位中,Team.Name 和 Team.WinNo 都沒有用到任何聚合函數,所以在 GROUP BY 之後也必須要加上這兩個欄位SELECT Team.Name as 球隊名稱, Team.WinNo as 贏場次數, count(*) as 球員人數, max(Percentage) as 最高命中率, min(Percentage) as 最低命中率, avg(Percentage) as 平均命中率 FROM Player, Team WHERE ((Player.TeamID=Team.ID)) GROUP BY Team.Name, Team.WinNoJavaScript 程式設計與應用:用於伺服器端的ASP環境根據資料表關聯性檢視查詢 (3)n查詢結果:球隊名稱球隊名稱贏場次數贏場次數球員人數球員人數 最高命中率最高命中率 最低命中率最低命中率平均命中率平均命中率台中隊 10 3 48.76 37.22 44.54333333333333 台北隊 12 6 67.88 36.67 50.61666666666667 台南隊 17 6 67.45 33.33 51.355 南投隊 12 1 65.55 65.55 65.55 高雄隊 16 2 88.97 70.98 79.975 新竹隊 7 1 25.88 25.88 25.88 澎湖隊 11 1 65.87 65.87 65.87 JavaScript 程式設計與應用:用於伺服器端的ASP環境18-4:运用 SQL 來新增、修正、刪除資料n本小節介紹如何用SQL語法管理資料表。
JavaScript 程式設計與應用:用於伺服器端的ASP環境CREATE TABLEn新增資料表:运用的 SQL 指令是"CREATE TABLE"n根本結構n說明n假设新增的資料非一列可以表示的,就需求新增資料表n論壇中新增討論區就會运用這個指令新增討論區資料表CREATE TABLE 資料表名稱 (欄位名稱1 欄位1資料型態, 欄位名稱2 欄位2資料型態, ...)JavaScript 程式設計與應用:用於伺服器端的ASP環境INSERTn新增資料:运用的 SQL 指令是「INSERT」n根本結構n說明n假设欄位名稱沒有指定完全,則資料庫會自動取用此欄位之預設值n我們可由 Access 資料庫的「設計檢視」來檢視每一個欄位的預設值INSERT INTO 資料表名稱(欄位名稱1, 欄位名稱2, ...) VALUES (欄位1的資料, 欄位2的資料, ...)JavaScript 程式設計與應用:用於伺服器端的ASP環境UPDATEn修正資料:运用的 SQL 指令是「UPDATE」n根本結構n說明n用來修正資料表欄位中的值n網站上修正會員個人資料時會用到UPDATE 資料表名稱 SET 欄位名稱1=欄位1的資料, 欄位名稱2=欄位2的資料,... WHERE 條件式JavaScript 程式設計與應用:用於伺服器端的ASP環境DELETEn刪除資料:运用的 SQL 指令是「DELETE」n根本結構n說明n假设沒有指定任何條件式,此 SQL 指令會刪除一個資料表內的一切紀錄,所以要特別小心。
n管理Blog時刪除文章會用到DELETE FROM 資料表名稱 WHERE 條件式JavaScript 程式設計與應用:用於伺服器端的ASP環境DROP TABLEn刪除資料表:运用的 SQL 指令是「DROP TABLE」n根本結構n說明n在論壇管理系統中,要刪除某個討論區會用到DROP TABLE 資料表名稱JavaScript 程式設計與應用:用於伺服器端的ASP環境範例18-5n主題:對資料表進行修正、刪除動作nWebpage: remote host, local hostn說明n範例中所做的事情n建立一個資料表 friend n插入兩筆資料 n刪除一筆資料 n更新一筆資料 n刪除資料表 friend n範例中,假设顯示的欄位值是 null,代表我們當初在新增資料時,並沒有設定相關欄位值,資料庫也沒有預設值,所以才會回傳 nullJavaScript 程式設計與應用:用於伺服器端的ASP環境範例18-6n主題:可隨時對資料表進行修正刪除的範例nWebpage: remote host, local hostn說明n這個範例,可以讓他在網頁上嘗試各種查詢動作,例如新增、修正、刪除等。
n运用 Access 資料庫的另一個好處是,它提供了一個圖形化的查詢介面,可以运用這個查詢介面產生的要的查詢結果,再將此查詢方法轉成 SQL 的語法,此時就可以將此 SQL 語法直接貼到的 ASP 程式碼,對於產生複雜的 SQL 語法非常好用JavaScript 程式設計與應用:用於伺服器端的ASP環境小秘訣n运用 ASP 整合資料庫時,可參考以下小秘訣n資料庫內的資料表名稱及欄位名稱,最好是英文,且中間不可留白 n欄位名稱最好複雜一點,以免和資料庫的內建關鍵字相衝n文字欄位的預設值最好是空字串,不要不設定預設值 n在 Access 內,除非他的欄位資料量超過255個字元,否則盡量不要用到 memo 欄位,因為 memo 欄位不援助排序,也不援助萬用字元〔如「*」或「?」等〕 JavaScript 程式設計與應用:用於伺服器端的ASP環境萬用字元n在 Access 內執行 SQL 指令時,有兩個最重要的萬用字元n「?」:比對一個字元 n「*」:比對多個字元 n說明n假设要在 ASP 的程式碼內运用 SQL 的萬用字元,必須將「?」改為「_」,「*」改為「%」,以符合普通 SQL 語言的標準規範。
JavaScript 程式設計與應用:用於伺服器端的ASP環境18-5:資料隱碼〔SQL Injection〕n本小節介紹各種因為ASP與資料庫整合時的疏失,使得他人可以运用非法途徑來取的資料庫內容,或者進行其它侵入JavaScript 程式設計與應用:用於伺服器端的ASP環境SQL Injection簡介n「資料隱碼」〔SQL Injection〕臭蟲,簡單地說,就是將「帳號」和「密碼」欄位填入具有單引號的特殊字串,呵斥伺服器端在接合這些欄位資料時,會不测地產生合格的 SQL 指令,呵斥密碼認證的胜利n要特別留意的是,SQL Injection 的問題不限只發生在哪種特定平台或語言,只需是运用 SQL 指令存取資料庫內的資料,都有能够產生這個問題JavaScript 程式設計與應用:用於伺服器端的ASP環境範例18-7(1)n主題:以資料庫內之資料進行密碼認證:根本篇nWebpage: remote host, local hostn程式碼重點n說明n看起來一切沒問題,但是假设他想「駭」〔Hack!〕 這個網站,事實上只需輸入以下資料就可以了: n帳號:*****〔亂打一通〕n密碼:' or 'a'='a SQL = "select * from password where userid='" +Request("user") + "' and passwd='" + Request("passwd") + "'";JavaScript 程式設計與應用:用於伺服器端的ASP環境範例18-7(2)n說明n當輸入帳號和密碼分別是「林政源」和「gavins」時,可以從資料庫中查到一筆資料,代表帳號和密碼正確,所得到的 SQL 指令是n當帳號和密碼分別是「xyz」和「' or 'a'='a」時,所產生的 SQL 指令也會執行胜利〔因為 'a'='a' 是一定成立的〕n在 SQL 語法的條件式中,會先執行 and,再執行 or。
SQL = "select * from password where userid='林政源' and passwd='gavins'";SQL = "select * from passwordwhere userid='xyz' and passwd='' or 'a'='a'";JavaScript 程式設計與應用:用於伺服器端的ASP環境防止SQL Injectionn最簡單的作法,就是在取用客戶端送進來的資料前,先刪除一切能够呵斥問題的特殊字元n這些字元包括單引號〔‘〕、雙引號〔“〕、問號〔?〕、星號 〔*〕、底線〔_〕、百分比〔%〕、ampersand〔&〕等,這些特殊字元都不應該出現在运用者輸入的資料中n刪除特殊字元的動作務必 要在伺服器端進行,因為用戶端的 JavaScript 表單驗證的檢查是只能防君子,不能防小人,別人只需做一個有一样欄位的網頁,就一樣可以呼叫他的 ASP 程式碼來取用資料庫,進而避開原網頁的表單驗證功能JavaScript 程式設計與應用:用於伺服器端的ASP環境範例18-8n主題:运用replace()防止 SQL InjectionnWebpage: remote host, local hostn程式碼重點n說明n在上述原始碼中,因為 Request("userid") 和 Request("passwd") 的資料是無法修正的,所以在取代前要先存到另一個個變數。
由此範例可以知道,只需刪除运用者輸入字串中的一切單引號,就可以防止 SQL Injection 的問題user = user.replace(/'/g, "");passwd = passwd.replace(/'/g, "");JavaScript 程式設計與應用:用於伺服器端的ASP環境SQL Injection 的搜索n在Google 打入「登入」,再對需求登入的網站進行 SQL Injection 的測試,就應該可以找到一些不設防的網站n請通知該網站管理員,並表示本人無惡意:我們研習張智星老師的「JavaScript程式設計與應用」,對網路上的網頁進行 SQL Injection 的測試,發覺您的登入網頁〔網址是 xxx.xxx.xxx〕並無法對抗 SQL Injection 的入侵,只需帳號恣意設定、密碼設定為「' or 'a'='a」,即可登入這是一封好心的信,我們僅測試能否可以登入,並未對資料進行任何修正,請查照,謝謝 〔請寫出他的全名,以示負責,並將 副本給我,以便登記發問一次〕JavaScript 程式設計與應用:用於伺服器端的ASP環境參考資料n可以构成 SQL Injection 的惡意字串還不少,但大部分是針對微軟的 SQL Server 資料庫來進行破壞。
n以下是參考資料:nSQL Injection 的因應與防範之道.mhtn駭客的 SQL填空遊戲(上).mhtn駭客的 SQL填空遊戲(下).mht。
