©
This document uses PHP Chinese website manual Release
(PHP 5)
mysqli_stmt::$affected_rows -- mysqli_stmt_affected_rows — Returns the total number of rows changed, deleted, or inserted by the last executed statement
面向对象风格
过程化风格
$stmt
)Returns the number of rows affected by INSERT, UPDATE, or DELETE query.
This function only works with queries which update a table. In order to get the number of rows from a SELECT query, use mysqli_stmt_num_rows() instead.
stmt
仅以过程化样式:由 mysqli_stmt_init() 返回的 statement 标识。
An integer greater than zero indicates the number of rows affected or retrieved. Zero indicates that no records where updated for an UPDATE/DELETE statement, no rows matched the WHERE clause in the query or that no query has yet been executed. -1 indicates that the query has returned an error. NULL indicates an invalid argument was supplied to the function.
Note:
If the number of affected rows is greater than maximal PHP int value, the number of affected rows will be returned as a string value.
Example #1 面向对象风格
<?php
$mysqli = new mysqli ( "localhost" , "my_user" , "my_password" , "world" );
if ( mysqli_connect_errno ()) {
printf ( "Connect failed: %s\n" , mysqli_connect_error ());
exit();
}
$mysqli -> query ( "CREATE TEMPORARY TABLE myCountry LIKE Country" );
$query = "INSERT INTO myCountry SELECT * FROM Country WHERE Code LIKE ?" ;
if ( $stmt = $mysqli -> prepare ( $query )) {
$code = 'A%' ;
$stmt -> bind_param ( "s" , $code );
$stmt -> execute ();
printf ( "rows inserted: %d\n" , $stmt -> affected_rows );
$stmt -> close ();
}
$mysqli -> close ();
?>
Example #2 过程化风格
<?php
$link = mysqli_connect ( "localhost" , "my_user" , "my_password" , "world" );
if ( mysqli_connect_errno ()) {
printf ( "Connect failed: %s\n" , mysqli_connect_error ());
exit();
}
mysqli_query ( $link , "CREATE TEMPORARY TABLE myCountry LIKE Country" );
$query = "INSERT INTO myCountry SELECT * FROM Country WHERE Code LIKE ?" ;
if ( $stmt = mysqli_prepare ( $link , $query )) {
$code = 'A%' ;
mysqli_stmt_bind_param ( $stmt , "s" , $code );
mysqli_stmt_execute ( $stmt );
printf ( "rows inserted: %d\n" , mysqli_stmt_affected_rows ( $stmt ));
mysqli_stmt_close ( $stmt );
}
mysqli_close ( $link );
?>
以上例程会输出:
rows inserted: 17
[#1] gerbawn at 163 dot com [2015-01-27 06:47:10]
I find should add $stmt->store_result() after $stmt->execute(), otherwise you can't get right results when use $stmt->affected_rows
[#2] Chuck [2007-04-28 22:51:16]
I'm not sure whether or not this is the intended behavior, but I noticed through testing that if you were to use transactions and prepared statements together and you added a single record to a database using a prepared statement, but later rolled it back, mysqli_stmt_affected_rows will still return 1.
[#3] Carl Olsen [2005-12-27 10:34:42]
It appears that an UPDATE prepared statement which contains the same data as that already in the database returns 0 for affected_rows. I was expecting it to return 1, but it must be comparing the input values with the existing values and determining that no UPDATE has occurred.