gpt4 book ai didi

php - 如何使用 Mysqli Php 返回受多个插入影响的行数?

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

我有一个函数,它使用带有准备好的语句的 MySqli 库插入多行。插入效果很好,问题是 $stmt->affected_rows 方法中的构建总是将受影响的行数返回为 1。

现在为了解决受影响的行问题,我创建了一个计数器来计算每个已执行的语句。这个解决方案是准确的。但是我喜欢使用内置的方法和函数,那么为什么 $stmt->affected_rows 总是返回一个,即使我插入了多行?我的代码是否以某种方式或形式存在缺陷?也许有一个纯Sql的解决方案。

这是我的代码:

try {
$query = "INSERT INTO dryenrolltb(enroll_id,id_entity,bin_type,tara_weight,dtetime_created,enrollprint_status) VALUES(?,?,?,?,?,?)";
$stmt = $db->prepare($query);
$stmt->bind_param('iiidsi', $enroll,$ent,$bin,$tara,$dte_create,$enr_status);
$result['rows']['rowerrors'] = array();
$result['rows']['rowsaffected'] = [];
$cnt = 0;
foreach ($arr as $value) {
$enroll = $value['enroll'];
$ent = $value['entid'];
$bin = $value['bin_t'];
$tara = $value['tara'];
$dte_create = $value['dtecreat'];
$enr_status = $value['enr_status'];
if($stmt->execute()) {
$cnt++;
} else {
array_push($result['rows']['rowerrors'],$value['enroll']);
}

}
if ($stmt->affected_rows > 0) {
echo "Affectionately yours";
array_push($result['rows']['rowsaffected'], $stmt->affected_rows);
array_push($result['rows']['rowsaffected'], $cnt);
return $result;
} else {
return false;
}
} catch (Exception $e) {
echo "Danger exception caught";
return false;
}

有人能告诉我为什么 $stmt->affected_rows 总是在多次插入时返回一个吗?

最佳答案

没有。似乎 MySQLi 语句类无法存储受影响行的运行总数。在我考虑之后,这是完全有道理的。让我解释一下。

每次执行该语句时,它都会影响给定数量的行。在您的情况下,您有一个简单的 INSERT 语句,它将一条一条地添加记录。因此,每次调用 execute() 时,affected_rows 的值为 1。

查询可能有所不同。例如 INSERT INTO ... SELECTUPDATE 可能影响多行。
您还可以使用 INSERT INTO ... ON DUPLICATE KEY UPDATE。如果 key 存在于数据库中,则您没有插入任何内容。如果值相同,则您甚至不会更新任何内容。受影响的行,可能是 0 或更多。

语句保留受影响行的运行总数是不明智的,原因是每次执行都会影响某些行,而不管之前的执行如何。它们甚至可以是相同的记录。考虑以下示例:

$stmt = $mysqli->prepare('UPDATE users SET username=? WHERE id=?');
$stmt->bind_param('si', $name, $id);

$id = 102;

$name = 'Affected rows 1';
$stmt->execute();
echo $stmt->affected_rows; // 1

$name = 'Affected rows 2';
$stmt->execute();
echo $stmt->affected_rows; // 1

两个更新语句都更新了同一行。如果 mysqli 保持运行总数,它将报告 2 行受影响,但实际上只有 1 行被更改。如果对数字求和,您将丢失信息。

因此,对于您的简单场景,您可以自己保留总数,例如在每次执行后汇总 $stmt->affected_rows。除此之外,它可能没有多大意义。

关于php - 如何使用 Mysqli Php 返回受多个插入影响的行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58227245/

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