2009-08-13 5 views
12

Tôi đang phát triển một ứng dụng trong AIR qua Flex, nhưng tôi không thấy tôi đang đi sai với SQLite (tôi đang sử dụng MySQL). Các tham số hoạt động, nhưng chỉ trong một số trường hợp nhất định. Đây có phải là một phần của hệ thống vệ sinh tích hợp chống lại tiêm sql không? Cảm ơn vì bất kì sự giúp đỡ!Tham số SQLite - Không cho phép tablename làm tham số

trình:

sqlite

"INSERT: Fields TỪ loại", nơi mà các tham số là: Fields = "*"

as3

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = "INSERT :Fields FROM Category"; 
statement.parameters[":Fields"] = "*"; 
statement.execute; 

esn't làm việc (SQL lỗi cú pháp tại ": Bảng"):

sqlite

"INSERT: Fields TỪ: Bảng", nơi mà các thông số như sau: Fields = "*" và: Bảng = "Thể loại"

as3

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = "INSERT :Fields FROM :Table"; 
statement.parameters[":Fields"] = "*"; 
statement.parameters[":Table"] = "Category"; 
statement.execute; 

Trả lời

30

Thông thường, người dùng không thể sử dụng tham số/trình giữ chỗ SQL cho số nhận dạng cơ sở dữ liệu (bảng, cột, chế độ xem, lược đồ) , vv) hoặc các chức năng cơ sở dữ liệu (ví dụ: CURRENT_DATE), nhưng thay vào đó chỉ để ràng buộc các giá trị theo nghĩa đen.

Với hỗ trợ phía máy chủ cho các câu lệnh được tham số hóa (được chuẩn bị), công cụ DB phân tích cú pháp truy vấn của bạn một lần, ghi nhớ những đặc điểm của bất kỳ tham số nào - loại của chúng, độ dài tối đa, các giới hạn, v.v. trong các lần thực thi tiếp theo của truy vấn đã được phân tích cú pháp. Nhưng truy vấn không thể được phân tích cú pháp chính xác thành các phần tử cú pháp của nó nếu các bit quan trọng, như các đối tượng cơ sở dữ liệu, không xác định.

Vì vậy, người ta thường phải thay thế tên bảng, trong một thủ tục được lưu trữ hoặc mã khách hàng tự động đồng bộ/nội suy/whatevers câu lệnh SQL được thực hiện đúng. Trong bất kỳ trường hợp nào, hãy nhớ sử dụng hàm API của SQL của bạn cho trích dẫn số nhận dạng cơ sở dữ liệu vì API sẽ không làm điều đó cho bạn.

+1

Đoạn đầu tiên của bạn nói lên tất cả. – Lucky

-1

Không chắc nếu điều này là như nhau nhưng tôi chạy qua một cái gì đó tương tự như trong Java. Về cơ bản bạn không thể thêm một bảng như một tham số, do đó bạn phải tạo ra các tuyên bố như vậy:

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = stringUtil.substitute("INSERT :Fields FROM {0}", "Category"); 
statement.parameters[":Fields"] = "*"; 
statement.execute; 

này chủ yếu là khả năng không phải là giải pháp securest, vì vậy bạn có thể muốn một số xác nhận tùy chỉnh của dữ liệu trước khi bạn thêm tên bảng .. vì vậy ai đó không cố gắng gửi tên bảng "; drop tableName ..."