PHP Doku:: Returns the total number of rows changed, deleted, or inserted by the last executed statement - mysqli-stmt.affected-rows.html

Verlauf / Chronik / History: (1) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzDatenbankerweiterungenAnbieterspezifische DatenbankerweiterungenMySQL Improved ExtensionThe MySQLi_STMT classmysqli_stmt->affected_rows -- mysqli_stmt_affected_rows

Ein Service von Reinhard Neidl - Webprogrammierung.

The MySQLi_STMT class

<<The MySQLi_STMT class

mysqli_stmt::attr_get -- mysqli_stmt_attr_get>>

mysqli_stmt->affected_rows

mysqli_stmt_affected_rows

(PHP 5)

mysqli_stmt->affected_rows -- mysqli_stmt_affected_rowsReturns the total number of rows changed, deleted, or inserted by the last executed statement

Beschreibung

Objektorientierter Stil

int $affected_rows;

Prozeduraler Stil

int mysqli_stmt::mysqli_stmt_affected_rows ( mysqli_stmt $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.

Parameter-Liste

stmt

Nur bei prozeduralem Aufruf: ein von mysqli_stmt_init() zurückgegebenes Statementobjekt.

Rückgabewerte

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.

Hinweis:

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.

Beispiele

Beispiel #1 Objektorientierter Stil

<?php
$mysqli 
= new mysqli("localhost""my_user""my_password""world");

/* check connection */
if (mysqli_connect_errno()) {
    
printf("Connect failed: %s\n"mysqli_connect_error());
    exit();
}

/* create temp table */
$mysqli->query("CREATE TEMPORARY TABLE myCountry LIKE Country");

$query "INSERT INTO myCountry SELECT * FROM Country WHERE Code LIKE ?";

/* prepare statement */
if ($stmt $mysqli->prepare($query)) {

    
/* Bind variable for placeholder */
    
$code 'A%';
    
$stmt->bind_param("s"$code);

    
/* execute statement */
    
$stmt->execute();

    
printf("rows inserted: %d\n"$stmt->affected_rows);

    
/* close statement */
    
$stmt->close();
}

/* close connection */
$mysqli->close();
?>

Beispiel #2 Prozeduraler Stil

<?php
$link 
mysqli_connect("localhost""my_user""my_password""world");

/* check connection */
if (mysqli_connect_errno()) {
    
printf("Connect failed: %s\n"mysqli_connect_error());
    exit();
}

/* create temp table */
mysqli_query($link"CREATE TEMPORARY TABLE myCountry LIKE Country");

$query "INSERT INTO myCountry SELECT * FROM Country WHERE Code LIKE ?";

/* prepare statement */
if ($stmt mysqli_prepare($link$query)) {

    
/* Bind variable for placeholder */
    
$code 'A%';
    
mysqli_stmt_bind_param($stmt"s"$code);

    
/* execute statement */
    
mysqli_stmt_execute($stmt);

    
printf("rows inserted: %d\n"mysqli_stmt_affected_rows($stmt));

    
/* close statement */
    
mysqli_stmt_close($stmt);
}

/* close connection */
mysqli_close($link);
?>

The above examples will output:

rows inserted: 17

Siehe auch


3 BenutzerBeiträge:
- Beiträge aktualisieren...
Senthryl
3.03.2009 20:11
This property contains a -1 value in situations when no errors have occurred.  When preparing a SELECT statement (or any other statement which doesn't affect rows), the property will be -1.  The property will also be reset to -1 if an INSERT statement is re-prepared as a SELECT statement.

For example:
<?php
    $mysqli
= new mysqli('localhost', 'user', 'pass', 'test');
   
$stmt = $mysqli->stmt_init();
   
$param = 'value';

   
//First SELECT
   
$stmt->prepare('SELECT * FROM `test` WHERE `field`=?');
   
$stmt->bind_param('s', $param);
   
var_dump($stmt->execute());
   
var_dump($stmt->affected_rows);
    echo
'<br>';

   
//INSERT
   
$stmt->prepare('INSERT INTO `test` (`field`) VALUES (?)');
   
$stmt->bind_param('s', $param);
   
var_dump($stmt->execute());
   
var_dump($stmt->affected_rows);
    echo
'<br>';

   
//Second SELECT
   
$stmt->prepare('SELECT * FROM `test` WHERE `field`=?');
   
$stmt->bind_param('s', $param);
   
var_dump($stmt->execute());
   
var_dump($stmt->affected_rows);
    echo
'<br>';
?>

Displays:
bool(true) int(-1)
bool(true) int(1)
bool(true) int(-1)
Chuck
29.04.2007 7:51
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.
Carl Olsen
27.12.2005 19:34
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.



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)