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



我有一个函数,它使用带有预准备语句的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总是在多个插入中返回一个?

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

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

查询可能有所不同。例如,INSERT INTO ... SELECTUPDATE可能会影响多行。
你也可以有INSERT INTO ... ON DUPLICATE KEY UPDATE.如果该密钥存在于数据库中,则您不会插入任何内容。如果值相同,则您甚至不会更新任何内容。受影响的行可能为 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。除此之外,它可能没有多大意义。

相关内容

  • 没有找到相关文章

最新更新