28

こんにちは、私は自分のサイトでプリペアドステートメントを使用する必要があります。これを使ってみました

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

しかし、これは機能していません。私が変わったとき、:idそしてその働きに。:key?

4

2 に答える 2

44

CodeIgniterはプリペアドステートメントをサポートしていません。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つの関数を呼び出すだけで、基本的に同じことを実行できます。このため、プリペアドステートメントよりもクエリバインディングの方が好きです。

ちなみに、への変更は、名前のないバインディングから名前の付いたバインディングに変更?するだけです(CIは明らかにどちらもサポートしていません)。:fooどちらかを使用している、またはステートメントを準備しているという意味ではないという理由だけで。

于 2013-01-04T11:51:42.417 に答える
10

同様の問題に直面したときに、この質問に出くわしました。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関数で許可されているクエリ文字列を取得することです。そのためには、 PHPPDOでGetLastExecutedQueryのようなものが必要になります。

さらに、これは、クエリビルダーを使用してステートメントを作成することを妨げるものではありません。ステートメントは、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');

于 2016-11-16T09:23:13.077 に答える