如何使用php数组与SQL运算符?

Ahm*_*mad 33 php sql arrays in-operator

我有和两个值的数组,我想在选择查询中使用它与sql IN运算符.

这是我桌子的结构

id comp_id
1   2
2   3
3   1
Run Code Online (Sandbox Code Playgroud)

我有一个$arr有两个值的数组Array ( [0] => 1 [1] => 2 )

我想获取comp_id 1和comp_id 2的记录.所以我编写了以下查询.

SELECT * from table Where comp_id IN ($arr)
Run Code Online (Sandbox Code Playgroud)

但它不会返回结果.

bar*_*ter 68

因为你有简单的整数可以做...

$sql = "SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")";
Run Code Online (Sandbox Code Playgroud)

(因为它不断出现,一些额外的信息...)

如果使用字符串(特别是不可信)输入,可以做

$sql = "SELECT * FROM table WHERE comp_id IN 
        ('".implode("','",array_map('mysql_real_escape_string', $arr))."')";
Run Code Online (Sandbox Code Playgroud)

但不处理像NULL这样的值.并会添加引号盲目周围的数值,这并不会如使用MySQL的严格模式下工作.https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#idm140082377917056 ...即只使用它,如果真的使用字符串(如VARCHAR),而不是数字列.

需要调用类似的东西mysql_real_escape_string是使任何报价在字符串中妥善处理!(以及防止SQL注入!)


...如果你想使用' 不受信任的 '号码,可以使用intvalfloatval

$sql = "SELECT * FROM table WHERE comp_id IN (".implode(",",array_map('intval', $arr)).")";
Run Code Online (Sandbox Code Playgroud)

消毒输入.(输入周围没有引号.

  • 它将检索相同的结果,但它不是最好的答案,你发现SQL注入攻击,我回答了这个问题,它也将解决你的问题.http://stackoverflow.com/questions/920353/can-i-bind-an-array-to-an-in-condition/36070527#36070527 (3认同)
  • @Ahmad你的'$ arr`很可能不是一个数组.检查您是否正确构建它. (2认同)
  • 这仅适用于数组中的数值.如果`$ arr`包含字符串,它们将在内爆之后被取消引用,并且数据库引擎可能不会满意,例如`SELECT*FROM table WHERE id IN(foo,bar,baz);`对于大多数数据库来说,它不是有效的SQL . (2认同)

Aur*_*mas 14

您需要将数组转换为逗号分隔的字符串:

$condition = implode(', ', $arr);
Run Code Online (Sandbox Code Playgroud)

此外,您可能希望首先转义值(如果您不确定输入):

$condition = implode(', ', array_map('mysql_real_escape_string', $arr));
Run Code Online (Sandbox Code Playgroud)


mis*_*shu 5

$ arr是一个php数组,对于sql server你需要发送一个字符串来解析你需要把你的数组转换成1,2等等的列表.

为此,您可以使用http://php.net/implode函数

所以在运行查询之前试试

$arr = implode ( ', ', $arr);
Run Code Online (Sandbox Code Playgroud)


sab*_*aba 5

您需要使用','逗号将数组内插

$imploded_arr = implode(',', $arr);

SELECT * from table Where comp_id IN ($imploded_arr)
Run Code Online (Sandbox Code Playgroud)