問題

私はcodeigniterプロジェクトのための私のモデルで以下の関数を持っており、変数$idは配列であり、例えば(1,2,3)を含んでいます。今私はそれを再訪しているので、私は実際に私の配列$idをエスケープしていないと思う。私は行を変更する必要があると思う $this->db->escape($id)$id = $this->db->escape($id)

私がそれを行うと、配列内のすべての要素の周りに一重引用符を置き、次のような長い文字列として扱います:'(1,2,3)'

誰かが私の変数を実際にエスケープしていないことを確認し、解決策を提案するか、これがcodeigniterフレームワーク内のバグであるかどうかを教えてもらえますか?

 function get_ratings($id)
    {

        $this->db->escape($id); // had to manually escape the variable since it's being used in an "in" in the where clause. 

        $sql = "select * from toys t
                 where t.toy_id in ($id)";

        $query = $this->db->query($sql, $id);

        if($query->num_rows() > 0)
        {
            return $query->result_array();
        }
        else
        {
            return false;
        }
    }
 

  ベストアンサー

CI Active Record クラスの使用に興味があるかもしれません:

簡単さを超えて、Active Record機能を使用する主な利点は、各データベースアダプタによってクエリ構文が生成されるため、データベースに依存しないアプリケーションを作成できることです。値がシステムによって自動的にエスケープされるため、より安全なクエリも可能です。

書き換えられたクエリは次のようになります($idが配列であると仮定します)。

 $this->db->where_in('toy_id', $id)->get('toys');
 

さて、私は少し混乱していることを認めます。$idsはより適切な変数名になり、クエリで使用している方法は文字列であると仮定します...

アクティブなレコードがあなたのものでない場合は、 Query Bindings が役に立つかもしれません。

バインドを使用する第二の利点は、値が自動的にエスケープされ、より安全なクエリが生成されることです。手動でデータをエスケープすることを覚えておく必要はありません。エンジンは自動的にそれを行います。


編集:後でこれを見て、これはあなたがやろうとしているようです。その場合、置き換えてみてください:

 $sql = "select * from toys t where t.toy_id in ($id)";
 

〜と:

 $sql = "select * from toys t where t.toy_id in (?)";
 

$idquery()の2番目の引数として渡しますが、$idが実際に配列である場合はコンマ区切りの文字列(implode(',', $id))として渡します。


それ以外の場合は $this->db->escape_str() を使いたいと思うかもしれません。

$this->db->escape_str()この関数は、型に関係なく渡されたデータをエスケープします。

ここには、mysqlドライバのソースコードからの抜粋があります。

 function escape_str($str, $like = FALSE)
{
    if (is_array($str))
    {
        foreach ($str as $key => $val)
        {
            $str[$key] = $this->escape_str($val, $like);
        }

        return $str;
    }
   // continued...
 

配列をループして値をエスケープします。

実際、$this->db->escapeは配列では機能しないようです。

この関数は文字列データのみをエスケープできるようにデータ型を決定します。

ここにソースがあります:

 function escape($str)
{
    if (is_string($str))
    {
        $str = "'".$this->escape_str($str)."'";
    }
    elseif (is_bool($str))
    {
        $str = ($str === FALSE) ? 0 : 1;
    }
    elseif (is_null($str))
    {
        $str = 'NULL';
    }

    return $str;
}
 

配列を無視するように見えます。

とにかく、あなたのために働く解決策を見つけることを願っています。私の投票はアクティブレコードです。

  同じタグがついた質問を見る

phpcodeigniter