如何选择与数组中项目值匹配的多行?

时间:2010-12-14 01:44:57

标签: php sql mysql

我编写了一个php脚本,它在数组中返回任意数量的特定id(以数字格式)。我想创建一个新查询,从属于每个id的表中选择每一行。我知道我可以进行1次查询以获得具有匹配ID的一行。但我想在一个查询中完成所有这些。这是我的代码:

$id = array(1,4,7,3,11,120); // The array containing the ids

$query = mysql_query("SELECT * 
                        FROM posts 
                       WHERE id = '$id[0]'"); 
// I would like to Do this for each id in the array and return it as one group of rows.`

3 个答案:

答案 0 :(得分:3)

我想你想要IN条款:

$idList = implode(",", $id);

SELECT *
FROM posts
WHERE id IN ( $idList );

implode()函数会将您的数字数组转换为逗号分隔的相同值的字符串。当您将其用作IN子句的一部分时,它会告诉数据库将这些值用作查找表以匹配id

标准免责声明/警告:
任何 SQL查询一样,您实际上不应该将变量直接连接到查询字符串中。你只是打开自己的SQL注入。改为使用预备/参数化语句。

答案 1 :(得分:2)

使用PHP's implode function将数组转换为逗号分隔值字符串。

然后,您可以使用SQL IN clause运行单个SQL语句,其中包含与从PHP捕获的ID相关联的值:

$id = array(1,4,7,3,11,120);
$csv = implode(',', $id); 

$query = sprintf("SELECT * 
                    FROM posts 
                   WHERE id IN (%s)",
                  mysql_real_escape_string($csv)); 

$result = mysql_query($query)

我省略了单引号,因为在SQL中处理数值时不需要它们。如果id值是字符串,则每个值都必须封装在单引号内。

答案 2 :(得分:1)

你想要的是SQL的IN子句。

SELECT * FROM posts WHERE id IN (1, 4, 7, 11, 120)

在PHP中,您可能需要以下内容:

$query = mysql_query(sprintf("SELECT * FROM posts WHERE id IN (%s)", implode(',', $id)));

显然,假设你知道你有$ id的整数值,并且$ id的值不是来自用户(也就是说,它们应该被消毒)。为了安全起见,你真的应该这样做:

$ids = implode(',', array_map('mysql_real_escape_string', $id));
$query = mysql_query("SELECT * FROM posts WHERE id IN ($ids)");

如果动态生成$ id,请不要忘记在该子句中放入某些,因为SELECT * FROM foo WHERE bar IN ()会给您一个错误。我通常确保将我的IN子句变量设置为0,因为IN (0)是好的,主键几乎不是0。