5

私はstackoverflowの他の投稿を読んでみました.ciのアクティブレコードのドキュメントもチェックしましたが、私の質問に対する答えが見つからないようです.

私のモデルには次のロジックがあります。

    $query = $this->db->get_where('categories', array('parent_id' => $category_id));

これが last_query() メソッドに従って生成する sql は次のとおりです。

SELECT * FROM ( categories) WHERE parent_id= '8'

数字の 8 を囲む引用符を削除する必要があります。どうすればよいですか?

select ステートメントを使用して、2 番目のパラメーターとして false を渡してみました。たとえば、次のようになります。

    $this->db->select('*', false);
    $this->db->from('categories');
    $this->db->where('parent_id=',$category_id);

しかし、それは実際にはあまり変わりませんでした。助言がありますか?ありがとうございました

4

3 に答える 3

6

デフォルトでは、CodeIgniter は比較でデータ型を予測し、それに応じて適切な SQL 構文を使用しようとします。クエリで単一引用符が使用されている場合、$category_id が整数ではなく文字列として扱われている可能性があります。試してみるとどうなりますか:

$this->db->select('*');
$this->db->from('categories');
$this->db->where('parent_id', (int) $category_id);

または、独自の WHERE ステートメントを手動で作成することもできます。

$this->db->where('parent_id = ' . (int) $category_id);
于 2013-01-27T15:11:37.147 に答える
2

メソッドの考え方は、SQL インジェクションから保護するために自動エスケープすることです。何らかの理由で、次のような生のクエリを送信したくない場合は、次のようにします。

$q = "select * from categories where parent_id = $category_id";
$this->db->query($q)->result();

私ははるかに簡単だと思います。falseただし、次のような追加のパラメーターを送信して無効にできると思います。

  $query = $this->db->get_where('categories', array('parent_id' => $category_id),false);

参考までに、生のクエリを送信してエスケープしたい場合(より複雑なクエリの場合)、次を使用できます。

$category_id = $this->db->escape($category_id);
于 2013-01-27T15:06:49.870 に答える