如何 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 ... SELECT
或 UPDATE
可能影响多行。
你也可以 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
求和。除此之外,它可能没有多大意义。
我有一个函数,它使用带有准备好的语句的 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 ... SELECT
或 UPDATE
可能影响多行。
你也可以 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
求和。除此之外,它可能没有多大意义。