Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在一个SQL查询中执行多个更新?_Php_Sql_Where - Fatal编程技术网

Php 如何在一个SQL查询中执行多个更新?

Php 如何在一个SQL查询中执行多个更新?,php,sql,where,Php,Sql,Where,我有一个SQL查询,其形式如下: UPDATE foo SET flag=true WHERE id=? 我还有一个PHP数组,它有一个ID列表。除了解析之外,最好的方法是什么,如下所示 foreach($list as $item){ $querycondition = $querycondition . " OR " . $item; } 。。。并且使用WHERE子句中的输出?您应该能够使用in子句(假设您的数据库支持它): 更新foo 设置标志=真 (1,2,3,5,6

我有一个SQL查询,其形式如下:

UPDATE foo
SET flag=true
WHERE id=?
我还有一个PHP数组,它有一个ID列表。除了解析之外,最好的方法是什么,如下所示

foreach($list as $item){  
    $querycondition = $querycondition . " OR " . $item;  
}

。。。并且使用
WHERE
子句中的输出?

您应该能够使用in子句(假设您的数据库支持它):

更新foo
设置标志=真

(1,2,3,5,6)中的id

除了您的foreach循环之外,我从未见过其他方法来实现这一点


但是,如果以任何方式从用户处获得$list,您应该坚持使用prepared语句,一次只更新一行(假设有人无法使用prepared语句更新多行)。否则,您将完全接受sql注入。

使用join/IMPODE创建一个逗号分隔的列表,以以下内容结束:

UPDATE foo SET flag=true WHERE id IN (1,2,3,4)

这将实现同样的效果,但可能不会带来太多的速度提升,但看起来更好

mysql_query("UPDATE foo SET flag=true WHERE id IN (".implode(', ',$list).")");

您可以使用case语句阻塞更新,但必须自己构建查询

UPDATE foo
SET flag=CASE ID WHEN 5 THEN true ELSE flag END  
    ,flag=CASE ID WHEN 6 THEN false ELSE flag END 
WHERE id in (5,6)  

where可以省略,但可以将您从完整的表更新中解救出来。

VB.NET代码: dim delimitedIdList as string=arrayToString(listOfIds)

dim SQL as string=“UPDATE foo SET flag=true,其中id位于(“+delimitedIdList+”)中


运行SQL(SQL)

在语句中使用。提供以逗号分隔的键值列表。您可以使用
内爆
函数轻松完成此操作

UPDATE foo SET flag = true WHERE id IN (1, 2, 3, 4, 5, ...)
或者,您可以使用以下条件:

UPDATE foo SET flag = true WHERE flag = false
或子查询:

UPDATE foo SET flag = true WHERE id IN (SELECT id FROM foo WHERE .....)

如果您知道项目数量的界限,则使用“IN”子句,正如其他人所建议的:

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)
不过,有一个警告是,根据您的数据库,子句中的元素数量可能有限制。例如,oracle 7或8(?)过去限制为256项(这在以后的版本中显著增加)
如果您确实在列表上迭代,请使用事务,以便在其中一个更新失败时可以回滚