Php 如何选择与数组中某个项的值匹配的多行?
我编写了一个php脚本,它返回任意数量的特定ID,这些ID的格式是数组中的数字。我想进行一个新的查询,从属于每个id的表中选择每一行。我知道我可以进行一次查询以获得一个具有匹配id的行。但我想在一次查询中完成这一切。这是我的密码: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
$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非法的字符,那么非法字符将被正确转义。