2013-01-04 15 views

答えて

28

CodeIgniterはPrepared Statementsをサポートしていません。あなたはCIのデータベースクラスのソースコードを見れば、あなたは彼らが単に渡された配列からのデータと疑問符を置き換えることにより、バインディングを解決していることがわかります。

彼らは唯一のクエリは、バインディングサポート名前のないプレースホルダを使用します。 http://ellislab.com/codeigniter/user-guide/database/queries.html

クエリバインディング

バインディングは、システムがあなたのために一緒にクエリを置くせることにより、クエリの構文を簡素化することができます参照してください。

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

クエリの疑問符は、クエリ関数の2番目のパラメータの配列の値に自動的に置き換えられます。

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

CIが準備された文をサポートしていないにもかかわらず、それはクエリバインディングをサポートしています。プリペアドステートメントでは、何らかの型のprepare()関数を呼び出してからexecute()関数を呼び出す必要があります。クエリバインディングでは、1つの関数を呼び出すだけで、基本的に同じことができます。このため、私は、クエリバインディングが準備されたステートメントより優れています。追記で

:foo?を変更すると、単に(CIは明らかにどちらかをサポートしていません)という名前のバインディングに名前なしから変化しています。あなたがどちらかを使用しているという理由だけで、あるいはあなたが文を準備しているということではありません。

+0

出力私はあなたが助けが必要な場合は、基本的なクエリを見ることができるようになります。ここをクリックしてください:http://stackoverflow.com/questions/38607368/how-to-implement-in-to-prepare-statement?noredirect=1#comment64603092_38607368 –

3

私は同様の問題に直面したので、私はこの質問に出くわしました。 CIが準備済みのステートメントをサポートしていないという答えは正しいです。しかし、は、準備文を使用できないことを意味するものではありません。私は私の接続クラスとしてPDOを使用していますが、次のコードは動作します次の例では

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

conn_idはあなたのプリペアドステートメントを実行することができ、これに対してPDOオブジェクトです。

ただし、これは許可されませんが、ネイティブCI関数が許可するクエリ文字列を取得することです。そのためにはGet Last Executed Query in PHP PDOのようなものが必要です。

これ以上の場合でも、クエリービルダーを使用してステートメントを作成し、PDO準備で使用することはできません。たとえば -

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

は、クエリを構築するだろうし、あなたが$db->get_compiled_select('tbl_user');

+0

CI + safe prepared statements – vivoconunxino

関連する問題