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

Php 如何选择与数组中某个项的值匹配的多行?,php,sql,mysql,Php,Sql,Mysql,我编写了一个php脚本,它返回任意数量的特定ID,这些ID的格式是数组中的数字。我想进行一个新的查询,从属于每个id的表中选择每一行。我知道我可以进行一次查询以获得一个具有匹配id的行。但我想在一次查询中完成这一切。这是我的密码: $id = array(1,4,7,3,11,120); // The array containing the ids $query = mysql_query("SELECT * FROM posts

我编写了一个php脚本,它返回任意数量的特定ID,这些ID的格式是数组中的数字。我想进行一个新的查询,从属于每个id的表中选择每一行。我知道我可以进行一次查询以获得一个具有匹配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.`
我想你需要这样的条款:

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

标准免责声明/警告: 与任何SQL查询一样,您确实不应该将变量直接连接到查询字符串中。您只是在向SQL注入敞开大门。请使用准备好的/参数化的语句。

我想您需要以下子句:

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

标准免责声明/警告: 与任何SQL查询一样,您确实不应该将变量直接连接到查询字符串中。您只是在向SQL注入敞开大门。请改用准备好的/参数化的语句。

用于将数组转换为逗号分隔的值字符串

然后,您可以使用运行一条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值是字符串,则每个值都必须封装在单引号内。

用于将数组转换为逗号分隔的值字符串

然后,您可以使用运行一条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值是字符串,则每个值都必须封装在单引号内。

您需要的是SQL的IN子句

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

$query = mysql_query(sprintf("SELECT * FROM posts WHERE id IN (%s)", implode(',', $id)));
$ids = implode(',', array_map('mysql_real_escape_string', $id));
$query = mysql_query("SELECT * FROM posts WHERE id IN ($ids)");
显然,这是假设您知道$id有整数值,并且$id的值不是来自用户,也就是说,它们应该被清除。为了安全起见,你真的应该这样做:

$query = mysql_query(sprintf("SELECT * FROM posts WHERE id IN (%s)", implode(',', $id)));
$ids = implode(',', array_map('mysql_real_escape_string', $id));
$query = mysql_query("SELECT * FROM posts WHERE id IN ($ids)");
如果$id是动态生成的,不要忘记在in子句中添加一些内容,因为SELECT*FROM foo WHERE bar in将给您一个错误。我通常确保将IN子句变量设置为0,因为IN 0很好,主键几乎从不为0。

您需要的是SQL的IN子句

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

$query = mysql_query(sprintf("SELECT * FROM posts WHERE id IN (%s)", implode(',', $id)));
$ids = implode(',', array_map('mysql_real_escape_string', $id));
$query = mysql_query("SELECT * FROM posts WHERE id IN ($ids)");
显然,这是假设您知道$id有整数值,并且$id的值不是来自用户,也就是说,它们应该被清除。为了安全起见,你真的应该这样做:

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

如果$id是动态生成的,不要忘记在in子句中添加一些内容,因为SELECT*FROM foo WHERE bar in将给您一个错误。我通常确保将IN子句变量设置为0,因为IN 0很好,主键几乎从不为0。

mysql\u real\u escape\u字符串是否对数组中的每个值进行转义?或者它通常会从数组中逃脱?我从来没有这样使用过它。@Ben:它并没有逃逸每一个值。这是一个糟糕的例子,因为数字数据,但是如果数组包含对SQL/MySQL非法的字符,那么非法字符将被正确转义。MySQL\u real\u escape\u字符串是否转义数组中的每个值?或者它通常会从数组中逃脱?我从来没有这样使用过它。@Ben:它并没有逃逸每一个值。这是一个糟糕的例子,因为数字数据,但是如果数组包含对SQL/MySQL非法的字符,那么非法字符将被正确转义。