给定一个ids数组$galleries = array(1,2,5),我想有一个SQL查询,在它的WHERE子句中使用数组的值,如:
SELECT *
FROM galleries
WHERE id = /* values of array $galleries... eg. (1 || 2 || 5) */
我如何生成这个查询字符串与MySQL使用?
给定一个ids数组$galleries = array(1,2,5),我想有一个SQL查询,在它的WHERE子句中使用数组的值,如:
SELECT *
FROM galleries
WHERE id = /* values of array $galleries... eg. (1 || 2 || 5) */
我如何生成这个查询字符串与MySQL使用?
当前回答
因为最初的问题涉及到一个数字数组,而我使用的是一个字符串数组,我无法使给定的例子工作。
我发现每个字符串都需要封装在单引号中才能使用in()函数。
这是我的解决方案
foreach($status as $status_a) {
$status_sql[] = '\''.$status_a.'\'';
}
$status = implode(',',$status_sql);
$sql = mysql_query("SELECT * FROM table WHERE id IN ($status)");
正如您所看到的,第一个函数用单引号(\')包装每个数组变量,然后内爆数组。
注意:$status在SQL语句中没有单引号。
可能有更好的方式添加引号,但这是可行的。
其他回答
你可能有表文本(T_ID (int), T_TEXT (text))和表测试(id (int), var (varchar(255)))
insert into test values (1, '1,2,3');下面将从T_ID IN(1,2,3)的表文本中输出行:
SELECT * FROM `texts` WHERE (SELECT FIND_IN_SET( T_ID, ( SELECT var FROM test WHERE id =1 ) ) AS tm) >0
这样,您就可以管理一个简单的n2m数据库关系,而不需要额外的表,并且只使用SQL,而不需要使用PHP或其他编程语言。
因为最初的问题涉及到一个数字数组,而我使用的是一个字符串数组,我无法使给定的例子工作。
我发现每个字符串都需要封装在单引号中才能使用in()函数。
这是我的解决方案
foreach($status as $status_a) {
$status_sql[] = '\''.$status_a.'\'';
}
$status = implode(',',$status_sql);
$sql = mysql_query("SELECT * FROM table WHERE id IN ($status)");
正如您所看到的,第一个函数用单引号(\')包装每个数组变量,然后内爆数组。
注意:$status在SQL语句中没有单引号。
可能有更好的方式添加引号,但这是可行的。
假设你事先正确地清理了你的输入……
$matches = implode(',', $galleries);
然后调整你的查询:
SELECT *
FROM galleries
WHERE id IN ( $matches )
根据数据集适当地引用值。
所有交易所:
$query = "SELECT * FROM `$table` WHERE `$column` IN(".implode(',',$array).")";
字符串:
$query = "SELECT * FROM `$table` WHERE `$column` IN('".implode("','",$array)."')";
除了使用IN查询,您还有两个选择,因为在IN查询中存在SQL注入漏洞的风险。您可以使用循环来获得所需的确切数据,也可以使用带有or大小写的查询
1. SELECT *
FROM galleries WHERE id=1 or id=2 or id=5;
2. $ids = array(1, 2, 5);
foreach ($ids as $id) {
$data[] = SELECT *
FROM galleries WHERE id= $id;
}