gpt4 book ai didi

php - foreach 与 mysqli_multi_query 问题

转载 作者:行者123 更新时间:2023-11-29 11:15:01 24 4
gpt4 key购买 nike

我有下面的代码,它可以正常工作并更新数组中包含的每条记录:

$check_list = isset($_POST['check_list']) ? $_POST['check_list'] : array();  
foreach($check_list as $check_list) {
$query = "UPDATE `stock` SET `signature_id` = 0,
user_id = 0,
`status_id` = 1
WHERE `id` = '$check_list'";
$result = mysqli_query($conn, $query);

我现在需要它对数组中的每个结果执行多个查询,因此我使用 mysqli_multi_query 将代码更改为以下内容:

$check_list = isset($_POST['check_list']) ? $_POST['check_list'] : array();  
foreach($check_list as $check_list) {
$query = "UPDATE `stock` SET `signature_id` = 0,
user_id = 0,
`status_id` = 1
WHERE `id` = '$check_list';
INSERT INTO `returned`
(`id`, `stock_id`, `signature_id`,
`user_id`, `timestamp`)
VALUES ('','$check_list','$id',
'$user_id',now())";
$result = mysqli_multi_query($conn, $query);

但现在它只对数组中的第一条记录执行一次 UPDATE 和一次 INSERT,而忽略其他记录

最佳答案

由于可重用性和安全性,@RiggsFolly 给出了有关准备好的参数化语句和事务的最佳建议,但如果您想要/需要继续使用 mysqli_multi_query,(因为您不想在项目中过渡到新的查询过程,或者因为它对您没有吸引力)以下是mysqli_multi_query可以为您服务的方式:

查询组合:

如果 SET 值保持相同且仅 id 不同,则所有 UPDATE 查询都可以合并为单个查询。如果值是静态的,您可以使用 implode(),如果不是,您可以选择在单个查询的 SET 子句中使用(详细/丑陋的)CASE 语句,或者像原始帖子中那样创建多个 UPDATE 查询。

$queries="UPDATE `stock` SET `signature_id`=0,`user_id`=0,`status_id`=1 WHERE `id` IN (".implode(',',$check_list).");";

与 INSERT 查询类似,它们都可以通过 implode() 或仅扩展 VALUE 部分的 foreach 循环合并到一个语句中。

$queries.="INSERT INTO `returned` (`stock_id`,`signature_id`,`user_id`,`timestamp`) VALUES ('".implode("','$id','$user_id',now()),('",$check_list)."','$id','$user_id',now());";

$queries.="INSERT INTO `returned` (`stock_id`,`signature_id`,`user_id`,`timestamp`) VALUES ";
foreach($check_list as $k=>$check_list){
// manipulate $id and $user_id as needed
$queries.=($k==0?"":",")."('$check_list','$id','$user_id',now())";
}

失败意识:

如果您不需要任何类型的成功指示,那么一行代码就可以了(当然,请将其放在任何循环之外):

mysqli_multi_query($conn,$queries)

否则,您将需要稍大的代码块:

if(mysqli_multi_query($conn,$queries)){
do{
echo "<br>Rows = ",mysqli_affected_rows($conn);
} while(mysqli_more_results($conn) && mysqli_next_result($conn));
}
if($mysqli_error=mysqli_error($conn)){
echo "<br>Syntax Error: $mysqli_error";
}

我已经使用 implode() 对两个查询测试了我的解决方案,并成功使用:

$check_list=array(1,3,5,6,10,11);

以及数据库设置:

CREATE TABLE `stock` (
id int(10) NOT NULL AUTO_INCREMENT,
signature_id int(10) NOT NULL,
user_id int(10) NOT NULL,
status_id int(10) NOT NULL,
PRIMARY KEY (id)
);

CREATE TABLE `returned` (
id int(10) NOT NULL AUTO_INCREMENT,
stock_id int(10) NOT NULL,
signature_id int(10) NOT NULL,
user_id int(10) NOT NULL,
`timestamp` datetime NOT NULL,
PRIMARY KEY (id)
);

/* Declaring your `id` columns with AUTO_INCREMENT means you can omit them from your INSERT query. */
/* Depending on your mysql version, creating a default datetime for `timestamp` may be possible which then would permit omitting `timestamp` from your INSERT query too. */

INSERT INTO `stock` (`signature_id`,`user_id`,`status_id`) VALUES
(1,1,1),
(2,2,2),
(3,3,3),
(4,4,4),
(5,5,5),
(6,6,6),
(7,7,7),
(8,8,8),
(9,9,9),
(10,10,10),
(11,11,11),
(12,12,12);

构建的查询如下所示:

UPDATE `stock` SET `signature_id`=0,`user_id`=0,`status_id`=1 WHERE `id` IN (1,3,5,6,10,11);INSERT INTO `returned` (`stock_id`,`signature_id`,`user_id`,`timestamp`) VALUES ('1','','',now()),('3','','',now()),('5','','',now()),('6','','',now()),('10','','',now()),('11','','',now());

关于php - foreach 与 mysqli_multi_query 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39897278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com