Нет. Кажется, что класс операторов MySQLi не может хранить промежуточное количество затронутых строк. После того, как я подумал об этом, это имеет смысл. Позвольте мне объяснить.
Каждый раз, когда вы выполняете инструкцию, это влияет на заданное количество строк. В вашем случае у вас есть простой оператор INSERT, который будет добавлять записи по одной. Поэтому каждый раз, когда вы звоните execute()
, значение affected_rows
равно единице.
Запрос может быть чем-то другим. Например, 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
после каждого выполнения. Что-нибудь еще, это, вероятно, не имеет особого смысла.