如何 return 使用 Mysqli Php 对受多个插入影响的行进行编号?

How to return number rows affected on multiple inserts with Mysqli Php?

我有一个函数,它使用带有准备好的语句的 MySqli 库插入多行。插入效果很好,问题是 $stmt->affected_rows 方法中的构建总是 returns 受影响的行数为 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 总是 returns 一个插入多个?

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

每次执行该语句都会影响给定的行数。在您的情况下,您有一个简单的 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 求和。除此之外,它可能没有多大意义。