在使用where子句中的"in"传递数组时,使用转义值的Codeigniter问题

Cat*_*ish 7 php codeigniter

我在我的模型中有一个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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Wes*_*rch 5

您可能对使用CI Active Record类感兴趣:

除了简单性之外,使用Active Record功能的一个主要好处是它允许您创建独立于数据库的应用程序,因为查询语法是由每个数据库适配器生成的.它还允许更安全的查询,因为系统会自动转义值.

您的重写查询将如下所示(假设$id是一个数组):

$this->db->where_in('toy_id', $id)->get('toys');
Run Code Online (Sandbox Code Playgroud)

旁白:我会承认我有点困惑,因为看起来它$ids是一个更合适的变量名,以及你在查询中使用它的方式,我认为它是一个字符串...

如果您不喜欢活动记录,您可能还会发现查询绑定很有用:

使用绑定的第二个好处是值会自动转义,从而产生更安全的查询.您不必记住手动转义数据; 引擎会自动为您完成.


编辑:稍后回顾一下,看起来这就是你想要做的.在这种情况下,请尝试替换:

$sql = "select * from toys t where t.toy_id in ($id)";
Run Code Online (Sandbox Code Playgroud)

附:

$sql = "select * from toys t where t.toy_id in (?)";
Run Code Online (Sandbox Code Playgroud)

并传递$id为第二个参数query(),但作为逗号分隔的字符串(implode(',', $id)如果$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...
Run Code Online (Sandbox Code Playgroud)

它遍历数组并转义它们的值.

它确实似乎$this->db->escape不适用于数组.

$ 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;
}
Run Code Online (Sandbox Code Playgroud)

看起来它忽略了数组.

无论如何,希望你找到一个适合你的解决方案.我的投票是Active Record.


Row*_*ker 3

您想要做的是转义数组中的各个值。所以你可以先在数组上使用array_map 。

$id = array_map('some_escape_function', $id);
Run Code Online (Sandbox Code Playgroud)

请参阅: http: //php.net/manual/en/function.array-map.php

然后你可以这样做:

$in = join(",",$id);
Run Code Online (Sandbox Code Playgroud)

那么你的 SQL 将是:

WHERE t.toy_id in ($in)
Run Code Online (Sandbox Code Playgroud)

这给你:

WHERE t.toy_id in ('1','2','3')
Run Code Online (Sandbox Code Playgroud)