2010-11-25 4 views
0

私はDBクエリ(またはどのような違いが、そのことについてである)を実行するための最良の方法であることを確認していない 間:CodeIgniterの最良のDBのクエリメソッド&インジェクション防止

$this->db 
->select('*') 
->from('table'); 
$this->db->get(); 

$this->db->query($sql); 

ページネーションが必要でリミッタが必要なので、get()クラスが必要であることがわかりました....しかし、おそらく他のものもページネーションを可能にしていますか?

SQLインジェクションに関する2番目の部分はこれで十分ですか?何ではない場合は?

$this->db 
    ->select('*') 
    ->from('table'); 
    $this->db->get(); 
->where('id >'.$this->db->escape(1)); 

ありがとうございました。

+0

あなたのモデルでActiveRecordの代わりにrawデータベースを使用している理由はありますか? – prodigitalson

+0

はい私の無知:)もっと詳しく教えてください、私はcodeigniterを初めて使っています、これまでは盲目的にチュートリアルが示唆しているものを試しています – salmane

+0

Actuall私はCIを使用しないので間違いました。これはARの使用法です。私はDoctrineやPropel ORMの実装に慣れていたので、ITは私を信じていました。簡単な説明については下の私の答えを参照してください。実際にCIを使用する人は、より明確かつ有用な答えを与えるでしょう:-) – prodigitalson

答えて

0

したがって、データアクセスレイヤーおよび/またはORMを実装するほとんどのフレームワークは、準備済みのステートメントを使用します。ほとんどの単純なクエリでは、このインタフェースを使用すると、DAL/ORMがエスケープ処理を行います。たとえば:

$this->db->get_where('mytable', array('id' => $id), $limit, $offset); 

この方法を使用するには、(array('column_name' => volumn_value'))引数クエリへの配列に変数をバインドし、それらにエスケープを実行します。

またはあなたの例を使用して:

$this->db 
    ->select('*') 
    ->from('table') 
    ->where('id ', 1)->get(); 

は、チェックアウト、彼らは詳細に説明するのに役立つはずですドキュメント:http://codeigniter.com/user_guide/database/active_record.html

1

次のコードでは、CodeIgniterの中のActiveRecordライブラリを実装(ActiveRecordのは、通常はかなり異なっを指しかかわらをデータベースから値を取得する方法)。右get()メソッドまで

$this->db 
->select('*') 
->from('table'); 
$this->db->get(); 

、ActiveRecordのは、あなたが)を取得する(呼び出すときに、そのクエリを実行し、結果オブジェクト、と交換し、その後、構築し、内部でSQLクエリを保存し、そしてれるあなたは、することができますresult()、result_array()、row()、またはrow_array()を使用したアクセス。あなたは、データベースからデータを選択した場合

$ sqlを引数から直接SQLクエリを実行します次のコードは、あなたが、その時点から、それを

$this->db->query($sql); 

を与え、あなたはこれを行うことができます。

$result = $this->db->result_array(); 

そのクエリの結果を配列に取得します。

ページネーションの場合、両方の方法を使用できます。あなたはの$ this - > DBのいずれかの方法を(使用している場合)((場所)、

$query = $this->db->select('*')->from('table')->limit(10, 30)->get(); 
if($query->num_rows()) 
{ 
    return $query->result_array(); 
} 

return FALSE; 

そして:これは、たとえば、あなたはページあたり10件のレコードを持っていた場合は、3ページのレコードを取得するでしょう)、CodeIgniterでは、自動的にあなたがそれに入れた値エスケープします:

$this->db->where('id', "'i am a nasty piece of SQL';DROP DATABASE 'my_db'"); 

罰金だろう - CodeIgniterでは、あなたのためにそれの世話をします。それが完了したという理由だけで、コード内にセキュリティ上の脆弱性を公開する方法が他にないことを意味するわけではありません。

+0

+1説明と最終的な考え。 – trix

関連する問題