2012-03-08 93 views
20

我有和两个值的数组,我想在选择查询中使用它与SQL IN运算符。如何在sql IN运算符中使用php数组?

这里是我的表

id comp_id 
1 2 
2 3 
3 1 

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

我想获取comp_id 1的记录和comp_id结构2,所以我写了下面的查询。

SELECT * from table Where comp_id IN ($arr) 

但它不返回结果。

+3

第1步是调试你自己的代码。如果你打印出你发送给MySQL的查询,你会看到'SELECT * from table where comp_id IN(Array)'不正确。尝试将数组连接到一个字符串不会自动将其转换为逗号分隔的单词列表。 – 2012-03-08 13:23:24

+4

第二步是搜索SO找出这个问题已经被回答了几千次 – 2012-03-08 13:25:02

+0

我对这个问题回答了,它也会解决你的问题。 http://stackoverflow.com/questions/920353/can-i-bind-an-array-to-an-in-condition/36070527#36070527 – 4EACH 2016-03-17 20:09:06

回答

48
$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")"; 
+0

我用这种方法,它工作正常,但警告警告:implode()[function.implode]:在第81行中传递的C:\ wamp \ www \ x \ x \ x \ xxx.php中无效的参数 – Ahmad 2012-03-08 13:43:04

+1

@Ahmad您的'$ arr'最有可能不是数组。检查您是否正确构建它。 – jprofitt 2012-03-08 13:51:57

+2

它会检索到相同的结果,但它不是最好的答案,你发现对SQL注入攻击, 我就这个问题回答,它也会解决你的问题。 http://stackoverflow.com/questions/920353/can-i-bind-an-array-to-an-in-condition/36070527#36070527 – 4EACH 2016-03-17 20:09:02

4

$ ARR是一个PHP数组,你需要发送,将被解析 你需要把你的数组列表中的像1,2,等字符串的SQL服务器..

要做到这一点,你可以使用函数http://php.net/implode

所以运行查询之前尝试

$arr = implode (', ', $arr); 
+0

我用这种方法,它工作正常,但警告'警告:implode()[function.implode]:无效参数传递在C:\ wamp \ www \ x \ x \ x \ xxx.php在81行上' – Ahmad 2012-03-08 13:43:20

+0

@Ahmad这很奇怪..也许对于你没有该数组中的元素或变量尚未初始化的情况..? – mishu 2012-03-08 13:52:07

+0

看到我上面的评论。这对于数组中的字符串值不起作用。 – CXJ 2017-12-08 15:24:38

12

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

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

,另外,你可能想先逃脱值(如果您不确定输入):

$condition = implode(', ', array_map('mysql_real_escape_string', $arr)); 
4

您需要爆你的阵列“”逗号

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

SELECT * from table Where comp_id IN ($imploded_arr) 
2

你需要的东西,如:

$sql = "SELECT * from table where comp_id in (".implode(',',$arr.")"; 
2

您需要将您的$arr实际转换为字符串。你在做什么,最简单的方法是使用implode()

$query = 'SELECT * from table Where comp_id IN (' . implode(',', $arr) . ')'; 

现在,如果你echo查询,你会看到,而不是数组中的IN声明时,它也只是单词“阵列”

2

您需要将数组转换为字符串在查询中使用:

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

然后,它可以在IN子句中使用:

SELECT * from table Where comp_id IN ($list) 
+0

对字符串值不起作用,因为使用implode你得到一个字符串,而不是单独的字符串值所需的SQL查询 – 2017-03-28 17:02:54

+0

正确答案在这里http://stackoverflow.com/questions/18072185/formatting-a-php-array-for-an-sql-in-clauses – 2017-03-28 17:32:20

3

你混合PHP和SQL - 为IN SQL操作,你需要像一个格式:

SELECT * from table WHERE comp_id IN (1,2) 

因此,要获得在PHP你需要做的是这样的:

$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")" 

请记住,这只适用于数组包含整数的情况。如果它们是字符串,则必须转义每个元素。

3

你只能传递字符串MySQL作为查询,所以试试这个

mysql_query("SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")"); 
2

这里所有的人都提出了同样的事情,但我得到了,因为一个简单的错误,在WordPress警告。 你需要给你的内爆字符串加逗号。准确地说是这样的。

$query = "SELECT *FROM table Where comp_id IN ('" . implode("', '", $sanitized_brands) . "')"; 

希望能帮助像我这样的人。 :)