【发布时间】:2020-02-02 06:02:37
【问题描述】:
我有一个函数,它使用带有准备好的语句的 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 总是在多次插入时返回一个吗?
【问题讨论】:
-
只是上次查询影响的行数,不是累积的。
-
我不确定我是否理解您的问题,但是您准备好的语句的每次执行只会插入 1 条记录,因此
affected_rows将始终为 1。我怀疑是否存在任何累积数字,但这是有趣的问题 IMO。 -
如果您在单个查询中插入多行,而不是为每一行单独查询,它将包含总行数。
-
使用 PDO 比使用 mysqli 容易得多,因为您可以将所有参数作为数组提供。
-
恕我直言,everything 使用 PDO 比使用 mysqli 更容易,我不知道为什么 mysqli 使用得更多。可能只是因为它看起来像 mysql,这是多年来的常规 API。
标签: php mysql mysqli sql-insert rows-affected