Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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 使用可变数量的参数从中删除_Php_Sqlite_Pdo_Transactions - Fatal编程技术网

Php 使用可变数量的参数从中删除

Php 使用可变数量的参数从中删除,php,sqlite,pdo,transactions,Php,Sqlite,Pdo,Transactions,我想将事务用于此查询 DELETE FROM tbl WHERE id IN(?, ?, ?) 但是ID的数量是可变的。 有时我有2个,有时5个等等 我可以用不同的方式重写它,使它接受一个包含所有ID的?参数吗 代码: 您可以使用以下内容: $questionmarks = str_repeat("?,", count($_POST['foos'])-1) . "?"; $query = "DELETE from `employee_customeraccount` WHERE `id

我想将事务用于此查询

DELETE FROM tbl WHERE id IN(?, ?, ?)
但是ID的数量是可变的。 有时我有2个,有时5个等等

我可以用不同的方式重写它,使它接受一个包含所有ID的
参数吗

代码:


您可以使用以下内容:

$questionmarks = str_repeat("?,", count($_POST['foos'])-1) . "?";    
$query = "DELETE from `employee_customeraccount` WHERE `id` IN ($questionmarks)";
$st = $db->prepare($query);

您可以使用以下内容:

$questionmarks = str_repeat("?,", count($_POST['foos'])-1) . "?";    
$query = "DELETE from `employee_customeraccount` WHERE `id` IN ($questionmarks)";
$st = $db->prepare($query);
说到你问的“XY问题”

我可以改写它,使它接受一个单一的?包含所有ID的参数

没有

它也没有什么意义——多重执行不是一件必须不惜任何代价追求的事情

但说到你面临的真正问题

显然,可能有一两个解决办法。不过,就像所有XY提问者一样,你忽略了最重要的细节,我们只能猜测。比方说,您可以保存所有ID,然后在循环之后但在提交之前一次删除所有ID

或者每次都准备删除。没什么大不了的。

说到你问的“XY问题”

我可以改写它,使它接受一个单一的?包含所有ID的参数

没有

它也没有什么意义——多重执行不是一件必须不惜任何代价追求的事情

但说到你面临的真正问题

显然,可能有一两个解决办法。不过,就像所有XY提问者一样,你忽略了最重要的细节,我们只能猜测。比方说,您可以保存所有ID,然后在循环之后但在提交之前一次删除所有ID


或者每次都准备删除。没什么大不了的。

使用固定数量的参数,比如10 in
从tbl中删除,其中id in(?,,,,,,,,,,,,,?)
。准备此查询并使用以下10个参数的部分重复执行:

for ($offset = 0; $offset < count($yourIdArray); $offset += 10) {
    $params = array_slice($yourIdArray, $offset, 10);
    if (count($params) < 10)
      $params = array_pad($params, 10, $params[0]);
    $st->execute(...);
}
($offset=0;$offset{ $params=array\u slice($yourIdArray,$offset,10); 如果(计数($params)<10) $params=array_pad($params,10,$params[0]); $st->execute(…); } 最后一组参数只是由数组中已经包含的ID填充(没有副作用)

(注意:我没有可用的PHP,我也不是一个PHP爱好者。所以将上面的代码作为伪代码。)


我不确定在语句/查询中分块参数的方法对Sqlite/PHP是否有意义,因为我不希望有查询/语句缓存或查询/语句预处理的高成本。我自己在Oracle数据库上使用过这种方法,主要是为了避免“查询/语句缓存污染”,这可能是由于查询/语句具有不同数量的参数而造成的。

使用固定数量的参数,如
中的10 in
从tbl中删除,其中id in(?,,,,,,,,,,,,,,,,?)
。准备此查询并使用以下10个参数的部分重复执行:

for ($offset = 0; $offset < count($yourIdArray); $offset += 10) {
    $params = array_slice($yourIdArray, $offset, 10);
    if (count($params) < 10)
      $params = array_pad($params, 10, $params[0]);
    $st->execute(...);
}
($offset=0;$offset{ $params=array\u slice($yourIdArray,$offset,10); 如果(计数($params)<10) $params=array_pad($params,10,$params[0]); $st->execute(…); }
最后一组参数只是由数组中已经包含的ID填充(没有副作用)

(注意:我没有可用的PHP,我也不是一个PHP爱好者。所以将上面的代码作为伪代码。)


我不确定在语句/查询中分块参数的方法对Sqlite/PHP是否有意义,因为我不希望有查询/语句缓存或查询/语句预处理的高成本。我自己在Oracle数据库上使用过这种方法,主要是为了避免“查询/语句缓存污染”,这可能是由于具有不同数量参数的查询/语句造成的。

谢谢,但我认为您不理解。我只想准备一次查询,因此它不能更改…@Alex您不能对不同数量的ID使用同一个已准备语句。@Alex+1您只需准备一次。然后,只需为您拥有的每个元素绑定并执行。将所有执行放在一个事务中,您将获得任何RDBMS的接近最佳性能。@LS_dev您不能用任意数量的占位符准备一次—这就是重点。阅读问题和评论通常是值得的。@YourCommonSense我知道,但你可以准备一个占位符并执行任意次数。这个答案和这个问题并没有直接关系,而是一个解决方案!谢谢,但我想你不明白。我只想准备一次查询,因此它不能更改…@Alex您不能对不同数量的ID使用同一个已准备语句。@Alex+1您只需准备一次。然后,只需为您拥有的每个元素绑定并执行。将所有执行放在一个事务中,您将获得任何RDBMS的接近最佳性能。@LS_dev您不能用任意数量的占位符准备一次—这就是重点。阅读问题和评论通常是值得的。@YourCommonSense我知道,但你可以准备一个占位符并执行任意次数。这个答案和这个问题并没有直接关系,而是一个解决方案!您所说的DML查询的查询缓存是什么?Sqlite甚至不会从这种方法中受益,即使它有一个查询缓存,因为它不是一个“查询”。我会编辑你的答案。另一方面,Oracle的JDBC驱动程序具有一个语句缓存,这对于Sqlite/PHP可能不是真的。看看您正在谈论的DML查询的查询缓存是什么?Sqlite甚至不会从这种方法中受益,即使它有一个查询缓存,因为它不是一个“查询”。我会编辑你的答案。另一方面,Oracle的JDBC驱动程序具有一个语句缓存,这对于Sqlite/PHP可能不是真的。看见