当前位置: 首页 > 面试题库 >

为SQL“ IN”子句格式化PHP数组

蒋嘉实
2023-03-14
问题内容

我正在尝试在数据库中查询产品ID数组中包含“ product_id”的记录。

该数组是多重选择输入(<select>)的发布结果,如下所示:

$clients = 
  Array ( 
    [0] => 80000016-1302638679
    [1] => 8000003B-1329924004
  )

我想将该数组传递给SQL语句的“ IN”子句,例如:

$sql = "SELECT * FROM sales WHERE product_id IN (".$clients.")";

…但这是行不通的(错误:)Message: Array to string conversion

一些帖子建议使用此函数以适合SQL的方式格式化数组:

function format_array($array){
    return implode(', ', $array);
  }
}

如 …

$sql = "SELECT * FROM sales WHERE product_id IN (".format_array($clients).")";

这将导致以下查询:

SELECT * FROM sales WHERE product_id IN (80000016-1302638679, 8000003B-132992400)

…以及此错误:

Unknown column '8000003B' in 'where clause'

我究竟做错了什么? 任何帮助是极大的赞赏!如果需要,我可以澄清这个问题:)


问题答案:

有一个更好的方法

您在注释中提到您正在使用CodeIgniter。除非您使事情变得异常复杂,否则没有实际的理由应该在构建时构建自己的家庭式查询where_in

如果那不起作用,那么就很好escape

好的,所以,您大多数人都说您需要引用这些项目,并为此提供了:

function createInClause($arr)
{
    return '\'' . implode( '\', \'', $arr ) . '\'';
}

但是,如果您有可能输入有问题的信息(例如,'); DROP TABLE STUDENTS; --。),这确实是不够的。为了防止这种情况,您需要确保检查SQL注入:

function createInClause($arr)
{
    $tmp = array();
    foreach($arr as $item)
    {
        // this line makes sure you don't risk a sql injection attack
        // $connection is your current connection
        $tmp[] = mysqli_escape_string($connection, $item);
    }
    return '\'' . implode( '\', \'', $tmp ) . '\'';
}


 类似资料:
  • 问题内容: 我该如何对包含一个IN带有可变数量的参数的子句的查询进行参数化(例如这样的查询)? 在此查询中,参数的数量可以在1到5之间的任何位置。 我不希望对此(或XML)使用专用的存储过程,但是如果有一些特定于SQL Server 2008的优雅方法,我可以接受。 问题答案: 这是我使用的一种quick-and-dirty的技术: 因此,这是C#代码: 两个警告: 表现很糟糕。LIKE “%…%

  • 问题内容: 我正在尝试创建如下语句: 但是,我在使用Django API的字符串格式时遇到了一些麻烦。这是我到目前为止的内容: 问题答案: MySQLdb有一种方法可以帮助解决这个问题: 文件 string_literal(…)string_literal(obj)-将对象obj转换为SQL字符串文字。这意味着,所有特殊的SQL字符都被转义,并用单引号引起来。换句话说,它执行: 用法

  • IN 子句 标识出外部数据库中的表,例如dBASE或Paradox数据库,或Microsoft Jet外部数据库,Microsoft Jet数据库引擎能够与之相连。 语法 标识目标表: [SELECT | INSERT] INTO destination IN {path | ["path" "type"] | ["" [type; DATABASE = path]]} 标识数据源表: FROM

  • 问题内容: 在SQL中,有什么方法可以缩短语法 到 一次又一次地在子句中写入相同的列名是不可行的。 问题答案: 没有没有办法将LIKE与IN 直接 结合 __ 有很多解决方法,例如本例中的SQL Server 这会将多个OR搜索条件更改为行和JOIN 或者,您可以使用UNION将多个查询合并为一个

  • 问题内容: 这更多地用于在PHP发送到服务器之前分析PHP中的查询。我为什么要这么做很复杂,所以我宁愿不谈这个原因。 在PHP中,我需要将字段选择存储到php数组中。因此,以该查询为例: 因此,在这种情况下,我需要将“ user_id,用户名,DATE(join_datetime)存储为join_date,(从foobar WHERE foonum IN(5,4,6)和user_id = user

  • 问题内容: 在处理大型数据库时,哪个性能更好,还是在SQL子句中? 它们的执行方式有什么不同吗? 问题答案: 我假设您想知道以下两者之间的性能差异: 根据MySQL手册,如果值是常数,则对列表进行排序,然后使用二进制搜索。我可以想象一下,它们以不特定的顺序进行逐一评估。因此在某些情况下速度更快。 最好的了解方法是使用特定数据在数据库中同时对它们进行概要分析,以查看哪种方法更快。 我在具有10000