.Cách chạy 1 sql Query

Một phần của tài liệu tài liệu tổng quát về phonegap (Trang 78 - 82)

6.3 .Cách sử dụng đối tượng DATABASE OBJECT

6.3.2 .Cách chạy 1 sql Query

Chú ý: không thể thực hiện được truy vấn SQL Query, khi truy vấn này đặt ngoài 1 giao dịch Transactions.

Khi ta chạy 1 chuỗi truy vấn SQL query, thì những gì mà ta thực sự làm là sử dụng đối tượng SQLTransaction object.đối tượng này bao hàm các phương thức cho phép ta thực thi các câu lệnh SQL dựa vào 1 database đã được mở từ trước

Đây là dạng cơ bản của phương thức executeSql() :

myDB.executeSql(„SELECT * FROM table1‟);

định nghĩa tổng quát của đối tượng SQLTransaction – đối tượng này không được sử

dụng 1 cách độc lập mà nó phải được nhúng trong các phương thức

Ngô Quang Trung – email: ngotrung.poli.t@gmail.com / www.phonegap.vn/forum 79

typedef sequence<any> ObjectArray;

interface SQLTransaction {

void executeSql(in DOMString sqlStatement, in optional ObjectArray arguments, in optional SQLStatementCallback callback, in optional SQLStatementErrorCallback errorCallback);

};

[Callback=FunctionOnly, NoInterfaceObject] interface SQLStatementCallback {

void handleEvent(in SQLTransaction transaction, in SQLResultSet resultSet); };

[Callback=FunctionOnly, NoInterfaceObject] interface SQLStatementErrorCallback {

boolean handleEvent(in SQLTransaction transaction, in SQLError error); };

Khi phương thức executeSql(sqlStatement, arguments, callback, errorCallback) được gọi thì tiến trình xử lý sẽ chạy theo thuật tốn sau ( thuật tốn này tương đối đơn giản và nó khơng thực sự xử lý bất kì SQL nào )

1. Nếu phương thức không được gọi trong suốt quá trình thực thị của 1

SQLTransactionCallback,SQLStatementCallback, or SQLStatementErrorCallback thì

nó sẽ văng ra 1 INVALID_STATE_ERR exception ( do phương thức này được gọi bên trong 1 SQLTransactionErrorCallback do vậy nó văng ra 1 exception.điều khiển

SQLTransactionErrorCallback này chỉ được gọi khi 1 giao dịch transaction thất bại

và do đó khơng có bất cứ lệnh SQL nào có thể được thêm vào(thực thi)

2. Cấu trúc tiến xử lý SQL (đây chính là chuỗi lệnh query) như đã biết sẽ là tham số đầu tiên và là tham số bắt buộc trong phương thức sqlStatement, bằng cách sử dụng tham số thứ 2 là mảng array, thể thu về cấu trúc lệnh query.nếu tham số thứ 2 bị bỏ qua hay là rỗng, thì xử lý liên quan đến mảng array tham số là rỗng

3. Xếp hàng lệnh trong giao dịch transaction, theo đó tham số thư 3 nếu có sẽ là hàm callback của tập các kết quả của câu lệnh và tham số thứ 4 nếu có sẽ là hàm callback thông báo lỗi

Ngô Quang Trung – email: ngotrung.poli.t@gmail.com / www.phonegap.vn/forum 80

Chú ý: trong ví dụ trên, thì myDB được sử dụng chỉ vì nó đã được sử dụng từ ví dụ trước.ta cũng sẽ sử dụng bất cứ biến nào cũng được và chắc rằng ta đã mở nó lên.chú ý rằng ta có thể sử dụng bất cứ câu lệnh SQL hợp lệ nào mà ta muốn.ví dụ này chỉ thể hiện 1 câu lệnh select nhưng ta có thể chạy những câu lệnh khác

theo sau đây là câu lệnh drop dùng để xóa 1 bảng :

myDB.executeSql(„DROP TABLE IF EXISTS table1)‟);

đây là câu lệnh tạo ra 1 bảng – câu lệnh create :

myDB.executeSql(„CREATE TABLE IF NOT EXISTS table1 (id unique, firstname varchar, lastname varchar)‟);

theo sau là lệnh insert :

myDB.executeSql(„INSERT INTO TABLE (id, firstname, lastname) VALUES (1, “Thomas “, “Myer “)‟);

Đây là câu lệnh delete :

myDB.executeSql(„DELETE FROM TABLE where id=1‟);

Chú ý: như ta đã thấy ở trên, phương thức executeSql với những câu lệnh truy vấn này ta chỉ sử dụng 1 tham số duy nhất (mà theo định nghĩa nó có gồm tới 4 tham số ) do đặc thù các câu lệnh DROP, CREATE, INSERT, DELETE ta không quan tâm tới kết quả trả về

khơng có gì là ngạc nhiên ở đây.nếu ta biết SQL, thì ta khơng có vấn đề gì trong việc để tạo table, hay thêm mới dữ liệu, và nhận về dữ liệu.tất nhiên, ta sẽ phải xem cách mà ta phải đơn xen các dấu ngoặc lồng nhau – nếu ta đang sử dụng dấu ngoặc đơn ở ngồi, thì ta buộc phải sử dụng dấu ngoặc lép trên các giá trị ở bên trong câu lệnh

Ngô Quang Trung – email: ngotrung.poli.t@gmail.com / www.phonegap.vn/forum 81 6.3.3.Cách phân tích và tiền xử lý các câu lệnh SQL (phòng chống SQL injection)

để phòng trống SQL injection ta nên sử dụng thêm tham số mảng array thứ 2 trong phương thức executeSql() vì khi đó các giá trị được thêm vào trong câu truy vấn không được thêm vào 1 cách trực tiếp ( ngăn chặn việc thốt kiểu kí tự ) mà nó phải được chuyển tiếp thông qua 1 mảng array rồi mới được truyền vào.cách bước nó thực thi như sau :

1. Tiến hành phân tích cấu trúc SQL như 1 cấu trúc SQL thông thường với ngoại lệ là dấu hỏi chấm ? có thể sử dụng đặt trong cấu trúc SQL này, nó là 1 kí tự đại diện 2. Kết hợp mỗi điểm đặt dấu ? với giá trị của các tham số trong tham số thứ 2 tương

ứng cùng 1 vị trí ( đo đó điểm đặt dấu hỏi ? đầu tiên tương ứng với giá trị đầu tiên trong tham số thứ 2, và tổng quát lên thì điểm đặt dấu hỏi ? thứ n tương ứng với giá trị thứ n trong tham số thứ 2 ) – ( chú ý rằng việc kết hợp các điểm đặt dấu hỏi ? được thực hiện ở mức chuỗi kí tự, chứ khơng phải là sự trùng khớp chuỗi, do vậy nớ cung cấp 1 cách linh hoạt để thêm vào các tham số bên trong 1 câu lệnh mà không bị nguy cơ tấn công bởi SQL injection

3. Nếu đối tượng database object mà đối

tượng SQLTransaction or SQLTransactionSync object được tạo ra từ nó

4. Mặc khác nếu ngữ pháp của câu lệnh SQL là không đúng ( ngoại trừ cho cách sử dụng kí tự ? ), hay câu lệnh sử dụng các tính năng khơng được hỗ trợ hay 1 số phần tử trong tham số mảng array không bằng với số điểm đặt ? trong câu lệnh hay câu lênh khơng thể phân tích được vì 1 vài lí do nào đó, thì câu lệnh bị đóng mác là lỗi (Error code 5.).Tác nhân cũng phải xét tới câu lệnh xem nó có sử dụng các tính năng BEGIN, COMMIT, và ROLLBACK đang khơng được hỗ trợ hay khơng ( nếu có nó sẽ đóng mác câu lệnh lỗi ) do vậy nó khơng cho phép các câu lệnh này làm nhiễu loạn các giao dịch rõ ràng được quản lý bởi database API của chính nó

5. Mặt khác, nếu chế độ được sử dụng tạo ra đối tượng

SQLTransaction or SQLTransactionSync object là chỉ đọc nhưng hành động của câu

lệnh lại chỉnh sửa database, thì nó đánh mác câu lệnh lỗi (Error code 5.).chú ý nhưng hành động của câu lệnh lại chỉnh sửa database được xét tới ở đây là

UPDATE, SELECT, DROP do vậy 1 câu lệnh như "UPDATE test SET id=0 WHERE 0=1" vẫn sẽ được xử lý

6. Trả về cấu trúc câu lệnh Ví dụ như :

Ngô Quang Trung – email: ngotrung.poli.t@gmail.com / www.phonegap.vn/forum 82

tx.executeSql("INSERT INTO CUSTOMERS (id, name) VALUES (?,?)", [2,"paul"]);

Một phần của tài liệu tài liệu tổng quát về phonegap (Trang 78 - 82)

Tải bản đầy đủ (PDF)

(155 trang)