2013-01-04 35 views
15

Xin chào tất cả những gì tôi cần để sử dụng các câu lệnh được chuẩn bị trong trang web của mình. Tôi đã thử sử dụng số điện thoại nàyLàm thế nào tôi có thể sử dụng các câu lệnh đã chuẩn bị trong CodeIgniter

$sql = "SELECT * FROM tbl_user WHERE uid=:id and activation_key=:key"; 
$query = $this->db->query( 
    $sql, 
    array(':id' => $uid ,':key' => $activation_key) 
); 

nhưng điều này không hoạt động. Khi tôi thay đổi :id:key thành ? hoạt động của nó.

Trả lời

28

CodeIgniter không hỗ trợ Báo cáo được chuẩn bị. Nếu bạn nhìn vào các mã nguồn cho các lớp học Cơ sở dữ liệu của CI, bạn sẽ thấy rằng họ giải quyết ràng buộc đơn giản bằng cách thay thế các dấu hỏi với dữ liệu từ mảng thông qua:

Họ chỉ hỗ trợ truy vấn Binding với phần giữ chỗ không tên. Xem http://ellislab.com/codeigniter/user-guide/database/queries.html

Query Bindings

Bindings cho phép bạn đơn giản hóa cú pháp truy vấn của bạn bằng cách cho phép hệ thống đặt các truy vấn cùng cho bạn. Hãy xem xét ví dụ sau:

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; 
$this->db->query($sql, array(3, 'live', 'Rick')); 

Dấu hỏi trong truy vấn được tự động thay thế bằng giá trị trong mảng trong tham số thứ hai của hàm truy vấn.

http://ellislab.com/forums/viewthread/105112/#528915

Mặc dù CI không hỗ trợ chuẩn bị phát biểu, nó hỗ trợ truy vấn Bindings. Với các câu lệnh chuẩn bị, bạn phải gọi một số kiểu hàm chuẩn() và sau đó là một kiểu hàm execute() nào đó. Với các ràng buộc truy vấn, bạn chỉ phải gọi một hàm và về cơ bản nó cũng giống như vậy. Bởi vì điều này, tôi thích ràng buộc truy vấn tốt hơn so với báo cáo chuẩn bị.

Trên một sidenote, thay đổi ?-:foo được chỉ đơn thuần là thay đổi từ vô danh để gán tên (mà CI dường như không hỗ trợ hoặc là). Chỉ vì bạn sử dụng hoặc không có nghĩa là bạn đang chuẩn bị các câu lệnh.

+0

tôi cần bạn giúp đỡ. Xem tại đây: http://stackoverflow.com/questions/38607368/how-to-implement-in-to-prepare-statement?noredirect=1#comment64603092_38607368 –

3

Tôi đã xem qua câu hỏi này khi tôi gặp phải sự cố tương tự. Câu trả lời đúng là CI không hỗ trợ các câu lệnh chuẩn bị. Tuy nhiên, không có nghĩa là mà bạn không thể sử dụng câu lệnh đã chuẩn bị!

Trong ví dụ sau Tôi đang sử dụng PDO là lớp kết nối của tôi nhưng đoạn mã sau sẽ làm việc:

$q = $this->db->conn_id->prepare('SELECT * FROM tbl_user WHERE uid=? and activation_key=?'); 
$q->execute(array($param1,$param2)); 
print_r($q->fetchAll()); 

Note các conn_id là đối tượng PDO dựa vào đó bạn có thể chạy các câu lệnh chuẩn bị của bạn.

Tuy nhiên, điều này sẽ không cho phép bạn nhận được chuỗi truy vấn mà hàm CI gốc cho phép. Bạn sẽ cần một cái gì đó như Get Last Executed Query in PHP PDO cho điều đó.

Hơn nữa, điều này không ngăn bạn sử dụng Trình tạo truy vấn để xây dựng các câu lệnh mà bạn có thể sử dụng trong PDO chuẩn bị.Ví dụ -

$db->where('uid = ?',null,false); 
$db->where('activation_key = ?',null,false); 
$q = $this->db->conn_id->prepare($db->get_compiled_select('tbl_user')); 

Sẽ xây dựng các truy vấn và sẽ cho phép bạn xem các truy vấn cơ bản nếu bạn ra $db->get_compiled_select('tbl_user');

+0

CI + báo cáo được chuẩn bị an toàn – vivoconunxino

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