将数组绑定到包含带有 WHERE ... IN(?) 的 SQL 的 CodeIgniter query() 中的占位符

问题描述 投票:0回答:3

我正在尝试将数组传递给具有查询的模型。我不确定如何正确传递数组,或者是否必须以某种方式操作数组。

我有这个数组:

Array
(
    [0] => 1
    [1] => 2
)

我有一个带有此行的控制器:

$ratings = $this->login_model->get_ratings($mechanicIds);   // get the mechanic ratings

我有这个型号:

function get_ratings($mechanicId)
{
    $sql = "select m.mechanic_id, 
                   m.mechanic_name, 
                   m.city, 
                   m.state, 
                   count(mr.rating_id) as num_ratings, 
                   round(avg(mr.rating_id),2) avg_rating
            from mechanic m, mechanic_rating mr, rating r
            where m.mechanic_id in (?)
                and m.mechanic_id = mr.mechanic_id
                and mr.rating_id = r.rating_id";
        
    $query = $this->db->query($sql, $mechanicId);
            
    if ($query->num_rows() > 0) {
        return $query->result_array();
    } else {
        return false;
    }
}

它实际上返回结果,但问题是它只返回结果 1 行,而它应该返回 2 行,因为我的数组中有 2 个结果。有人知道我做错了什么吗?

php sql arrays codeigniter where-in
3个回答
2
投票

我发现这个问题很有帮助。

下面是我使用的代码。

包含此的控制器:

                $mIds_size = count($mIds);
                $i = 1;

                foreach($mIds as $row)
                {
                    if($i == $mIds_size)
                    {
                        $mechanicIds .= $row;
                    }
                    else
                    {
                        $mechanicIds .= $row.', ';
                    }
                    $i++;
                }

                $ratings = $this->login_model->get_ratings($mechanicIds);   // get the mechanic ratings 

包含此的模型:

    function get_ratings($mechanicId)
    {

        $this->db->escape($mechanicId);

        $sql = "select m.mechanic_id, 
                       m.mechanic_name, 
                       m.city, 
                       m.state, 
                       count(mr.rating_id) as num_ratings, 
                       round(avg(mr.rating_id),2) avg_rating
                from mechanic m, mechanic_rating mr, rating r
                where m.mechanic_id in ($mechanicId)
                and m.mechanic_id = mr.mechanic_id
                and mr.rating_id = r.rating_id
                group by mechanic_id";

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

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

0
投票

更改此行:

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

对此:

$query = $this->db->query($sql, array(implode(', ',$mechanicId)));

按照手册


0
投票

要将数组传递到

IN
条件的原始查询(不是使用辅助方法构建)中,请使用
?
占位符而不用括号括起来。

将数组绑定到占位符时,您必须在数组内部声明您的数组。 换句话说,

query()
方法的“参数”(第二个)参数需要一个与 SQL 字符串中的每个
?
相关的数组。 由于第一个
?
绑定到数组,因此
$mechanicIds
数组必须声明为“parameters”参数的第一个元素。 我已经测试了此建议在我有权访问的 CodeIgniter3 实例中成功运行。

$sql = "SELECT m.mechanic_id, 
               m.mechanic_name, 
               m.city, 
               m.state, 
               COUNT(mr.rating_id)         AS num_ratings, 
               ROUND(AVG(mr.rating_id), 2) AS avg_rating
        FROM mechanic        AS m,
             mechanic_rating AS mr,
             rating          AS r
        WHERE m.mechanic_id IN ?                            /* <--- here */
          AND m.mechanic_id = mr.mechanic_id
          AND mr.rating_id = r.rating_id";

$query = $this->db->query($sql, [$mechanicIds]);

DB_driver.php 核心文件包含

compile_binds()
中的这部分代码,它转义数组中的每个值,并将逗号连接的字符串括在括号中,然后返回 sql 字符串。

...
do
{
    $c--;
    $escaped_value = $this->escape($binds[$c]);
    if (is_array($escaped_value))
    {
        $escaped_value = '('.implode(',', $escaped_value).')';
    }
    $sql = substr_replace($sql, $escaped_value, $matches[0][$c][1], $ml);
}
while ($c !== 0);
...
© www.soinside.com 2019 - 2024. All rights reserved.