d-6ren">
gpt4 book ai didi

php - 传递数组以在 where 子句中使用 "in"查询时转义值的 Codeigniter 问题

转载 作者:可可西里 更新时间:2023-11-01 12:51:03 25 4
gpt4 key购买 nike

我的 codeigniter 项目模型中有以下函数,变量 $id 是一个数组,例如,包含 (1,2,3) .现在我正在重新访问它,我认为我实际上并没有转义我的数组 $id。我想我得换线$this->db->e​​scape($id)$id = $this->db->e​​scape($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 感兴趣类:

Beyond simplicity, a major benefit to using the Active Record features is that it allows you to create database independent applications, since the query syntax is generated by each database adapter. It also allows for safer queries, since the values are escaped automatically by the system.

您重写的查询看起来像这样(假设 $id 是一个数组):

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

旁白:我承认我有点困惑,因为看起来 $ids 是一个更合适的变量名,以及您在查询,我假设它是一个字符串...

如果您不喜欢事件记录,您还可以找到 Query Bindings有用:

The secondary benefit of using binds is that the values are automatically escaped, producing safer queries. You don't have to remember to manually escape data; the engine does it automatically for you.


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

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

与:

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

并将 $id 作为第二个参数传递给 query(),但作为逗号分隔的字符串 (implode(',', $id) 如果 $id 确实是一个数组)。


否则你可能想使用$this->db->e​​scape_str()

$this->db->escape_str() This function escapes the data passed to it, regardless of type.

这里是 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->e​​scape 确实不适用于数组。

$this->db->escape() This function determines the data type so that it can escape only string data.

这是来源:

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;
}

看起来它忽略了数组。

无论如何,希望您能找到适合自己的解决方案。我投票支持 Active Record。

关于php - 传递数组以在 where 子句中使用 "in"查询时转义值的 Codeigniter 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6209765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com