我正在尝试将数组传递给具有查询的模型。我不确定如何正确传递数组,或者是否必须以某种方式操作数组。
我有这个数组:
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 个结果。有人知道我做错了什么吗?
我发现这个问题很有帮助。
下面是我使用的代码。
包含此的控制器:
$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;
}
}
更改此行:
$query = $this->db->query($sql, $mechanicId);
对此:
$query = $this->db->query($sql, array(implode(', ',$mechanicId)));
按照手册
要将数组传递到
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);
...