2012-05-03 38 views
5

Tôi đang sử dụng trình viết mã và phần lớn thời gian sử dụng bản ghi hoạt động cho truy vấn của tôi (tự động thoát chúng), nhưng truy vấn này dường như không phù hợp với nó do biến. Vì vậy, tôi cần phải tìm ra cách để thoát khỏi truy vấn theo cách thủ công.Truy vấn SQL thoát + codeigniter

docs CodeIgniter đề nghị thoát các truy vấn theo cách này:

$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")"; 

truy vấn ban đầu của tôi

$sql = "SELECT * FROM (`user_language`) WHERE `user_id` = '{$id}'"; 

My trốn truy vấn

$sql = "SELECT * FROM (`user_language`) WHERE `user_id` = '{$id}' VALUES(".$this->db->escape($user_language).")"; 

Nhưng tôi đang gặp rắc rối getti ng cú pháp đúng. Thông báo lỗi là: thông báo lỗi

  • PHP: Không xác định biến: USER_LANGUAGE
  • SQL lỗi: cú pháp sai ... gần 'GIÁ TRỊ (NULL)' tại dòng 1
+0

bạn có muốn chèn hoặc chọn nội dung nào đó với truy vấn của mình không? – Hajo

+0

SELECT. INSERT là từ các tài liệu Codeigniter. – chowwy

+0

cập nhật câu trả lời của tôi, hy vọng nó hoạt động cho bạn:] – Hajo

Trả lời

12
$sql = "SELECT * FROM `user_language` WHERE `user_id` = " . $this->db->escape($id); 

nếu bạn muốn chọn ngôn ngữ của người dùng được cung cấp bởi $ id, nó sẽ hoạt động theo cách đó.

đối phó với những con số một thay thế sẽ là:

$sql = "SELECT * FROM `user_language` WHERE `user_id` = " . (int)$id; 

CodeIgniter không còn hỗ trợ chuẩn bị phát biểu như "cam kết ràng buộc truy vấn":

The secondary benefit of using binds is that the values are automatically escaped, producing safer queries. You don't have to remember to manually escape data; the engine does it automatically for you.

+0

Cảm ơn bạn; nó hoạt động! Tôi đã chấp nhận và upvoted câu trả lời của bạn. Câu hỏi phụ: Có cách nào để tôi có thể xác nhận truy vấn được thoát không? Tôi có một vài truy vấn khác để trốn thoát và tôi muốn kiểm tra chúng sau. – chowwy

+0

Cảm ơn bạn đã cập nhật. Điều đó rất hữu ích. – chowwy

+0

Tôi đang sử dụng các câu lệnh chuẩn bị và không thoát được trong nhiều năm. Tôi không biết nếu codeigniter hỗ trợ họ: http://php.net/manual/en/pdo.prepared-statements.php – Hajo

4

Tôi đang bối rối tại sao bạn nói rằng bạn không thể sử dụng Active Record class với CI, đây là một cuộc gọi SQL đơn giản (ví dụ dưới đây sử dụng method chaining):

$this->db->select('*')->from('user_language')->where('user_id', $id); 
$query = $this->db->get(); 

Sau đó, $id của bạn sẽ được thoát đúng cách và bạn sẽ giảm thiểu bất kỳ sự tiêm chích nào. Cá nhân tôi sử dụng AR bất cứ khi nào có thể, nó cho phép tôi viết mã hiệu quả nhanh và không phải lo lắng về những điều xấu với cuộc gọi SQL (truy vấn tùy chỉnh).

+0

OK, điều này đã được bình chọn. Nó không phải là tôi không thể, nhưng tôi đã không nghe nói về phương pháp chuỗi. Tôi không biết làm thế nào để chỉ ra biến trong mệnh đề where. Rất nhiều đánh giá cao. – chowwy

+0

@chowwy, tất cả trong [Hướng dẫn sử dụng] (http://codeigniter.com/user_guide/database/index.html), rất kỹ lưỡng với các ví dụ tốt – Jakub

+0

Có, tôi sử dụng nó làm tài liệu tham khảo. Cảm ơn một lần nữa. – chowwy

Các vấn đề liên quan