PHP 5.4.31 Released

mysqli::$affected_rows

mysqli_affected_rows

(PHP 5)

mysqli::$affected_rows -- mysqli_affected_rowsПолучает число строк, затронутых предыдущей операцией MySQL

Описание

Объектно-ориентированный стиль

Процедурный стиль

int mysqli_affected_rows ( mysqli $link )

Возвращает число строк, затронутых последним INSERT, UPDATE, REPLACE или DELETE запросом.

Для запросов вида SELECT mysqli_affected_rows() работает как mysqli_num_rows().

Список параметров

link

Только для процедурного стиля: Идентификатор соединения, полученный с помощью mysqli_connect() или mysqli_init()

Возвращаемые значения

Целое число, большее нуля, означает количество затронутых или полученных строк. Ноль означает, что запросом вида UPDATE не обновлено ни одной записи, или что ни одна строка не соответствует условию WHERE в запросе, или что запрос еще не был выполнен. Значение -1 указывает на то, что запрос вернул ошибку.

Замечание:

Если число затронутых строк больше чем максимальное значение int, то число затронутых строк будет возвращено в строковом виде (string).

Примеры

Пример #1 Пример $mysqli->affected_rows

Объектно-ориентированный стиль

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

/* Проверка соединения */
if (mysqli_connect_errno()) {
    
printf("Подключение не удалось: %s\n"mysqli_connect_error());
    exit();
}

/* Добавление строк (Insert) */
$mysqli->query("CREATE TABLE Language SELECT * from CountryLanguage");
printf("Затронутые строки (INSERT): %d\n"$mysqli->affected_rows);

$mysqli->query("ALTER TABLE Language ADD Status int default 0");

/* Обновление строк (Update) */
$mysqli->query("UPDATE Language SET Status=1 WHERE Percentage > 50");
printf("Затронутые строки (UPDATE): %d\n"$mysqli->affected_rows);

/* Удаление строк (Delete) */
$mysqli->query("DELETE FROM Language WHERE Percentage < 50");
printf("Затронутые строки (DELETE): %d\n"$mysqli->affected_rows);

/* Выбор всех строк (Select) */
$result $mysqli->query("SELECT CountryCode FROM Language");
printf("Затронутые строки (SELECT): %d\n"$mysqli->affected_rows);

$result->close();

/* Удаление таблицы Language */
$mysqli->query("DROP TABLE Language");

/* Закрытие соединения */
$mysqli->close();
?>

Процедурный стиль

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

if (!
$link) {
    
printf("Не могу подключиться к localhost. Ошибка: %s\n"mysqli_connect_error());
    exit();
}

/* Добавление строк (Insert) */
mysqli_query($link"CREATE TABLE Language SELECT * from CountryLanguage");
printf("Затронутые строки (INSERT): %d\n"mysqli_affected_rows($link));

mysqli_query($link"ALTER TABLE Language ADD Status int default 0");

/* Обновление строк (Update) */
mysqli_query($link"UPDATE Language SET Status=1 WHERE Percentage > 50");
printf("Затронутые строки (UPDATE): %d\n"mysqli_affected_rows($link));

/* Удаление строк (Delete) */
mysqli_query($link"DELETE FROM Language WHERE Percentage < 50");
printf("Затронутые строки (DELETE): %d\n"mysqli_affected_rows($link));

/* Выбор всех строк (Select) */
$result mysqli_query($link"SELECT CountryCode FROM Language");
printf("Затронутые строки (SELECT): %d\n"mysqli_affected_rows($link));

mysqli_free_result($result);

/* Удаление таблицы Language */
mysqli_query($link"DROP TABLE Language");

/* Закрытие соединения */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Затронутые строки (INSERT): 984
Затронутые строки (UPDATE): 168
Затронутые строки (DELETE): 815
Затронутые строки (SELECT): 169

Смотрите также

  • mysqli_num_rows() - Получает число рядов в результирующей выборке
  • mysqli_info() - Извлекает информацию о последнем выполненном запросе

add a note add a note

User Contributed Notes 5 notes

up
5
Anonymous
3 years ago
On "INSERT INTO ON DUPLICATE KEY UPDATE" queries, though one may expect affected_rows to return only 0 or 1 per row on successful queries, it may in fact return 2.

From Mysql manual: "With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if the row is inserted as a new row and 2 if an existing row is updated."

See: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Here's the sum breakdown _per row_:
+0: a row wasn't updated or inserted (likely because the row already existed, but no field values were actually changed during the UPDATE)
+1: a row was inserted
+2: a row was updated
up
4
djnigelharkness at yahoo dot com
4 years ago
<?php
    $gHostName   
="localhost";   
   
$gUserName    ="root";
   
$gPassword    ="mypassword";
   
$gDBName     ="dbName";
   
$mysqli = new mysqli($gHostName, $gUserName, $gPassword,    
           
$gDBName);
   
   
$username="username";    $email="user@xxx.edu";
   
$password="3442f6e94a733237a3e844f0286b92f559bf794d";
   
   
//insert
//    $stmt = $mysqli->prepare("INSERT INTO j_user
       
(username,email,password) VALUES (?, ?, ?)");
//   
$stmt->bind_param('sss',$username, $email, $password);
//   
$stmt->execute();
//   
$stmt->close();

    //delete
//   
$stmt = $mysqli->prepare("DELETE FROM j_user WHERE
                        username
=?");
//   
$stmt->bind_param('s',$username);
//   
$stmt->execute();
//   
$stmt->close();

    //update
//   
$stmt = $mysqli->prepare("UPDATE j_user SET email=? WHERE
                        username
='wjw6349'");
//   
$stmt->bind_param('s',$email);
//   
$stmt->execute();
//   
$stmt->close();

    if (
$mysqli->connect_error){
        echo("
Connect failed: ".mysqli_connect_error()); exit();
    }

   
$querySelect = "SELECT * FROM j_user";
   
$resultSet = $mysqli->query($querySelect);
   
    if(
$resultSet->num_rows > 0){
        while(
$row = $resultSet->fetch_assoc()){
            foreach(
$row as $fieldValue){
               
$bigString .= "<em>$fieldValue</em><br />\n";
            }
           
$bigString .= "<hr />";
        }
       
$mysqli->close();
        echo
$bigString;
    }

    function __autoload(
$className) {
        require_once
$className.'.class.php';
    }
    //start the session and create it
    session_start();
   
$_SESSION['name'] = $_POST['username']."_".time();
    //encrypt the password   
    sha1(
$_POST['password']) == $password
    header("
Location:admin.php");
    //check if the session is set
    session_start();
    if (isset(
$_SESSION['name'])) { }
?>
up
3
ric at xpellshop dot com
3 years ago
"Zero indicates that no records where updated for an UPDATE statement, no rows matched the WHERE clause in the query or that no query has yet been executed."

what if i need to know which one of the three occurred? It's dumb that there is no distinction between the three.
up
0
fastest963 at gmail dot com
1 month ago
empty($db->affected_rows) will return TRUE even if affected_rows is greater than 0. Manually check < 1 if you're looking for failure.
up
-1
oilpc at oilpc dot com
4 years ago
For "INSERT" or "UPDATE" statement for modifying data contained in one row of one table I checked if number of affected rows equals 1 to determine success of the operation. It works fine both for errors and false value of WHERE condition (that might be generated according to specific application user acces privileges).
<?php
if ($mysqli->affected_rows==1){
    echo
"success";
}
else {
    echo
"fail";
}
?>

Checking if mysqli->affected_rows will equal -1 or not is not a good method of determining success of "INSERT IGNORE" statements. Example: Ignoring duplicate key errors while inserting some rows containing data provided by user only if they will match specified unique constraint causes returning of -1 value by mysqli->affected_rows even if rows were inserted. (checked on MySQL 5.0.85 linux and php 5.2.9-2 windows). However mysqli->sqlstate returns no error if statement was executed successfully.
<?php
if ($mysqli->affected_rows!=-1){
    echo
"success";// for "INSERT IGNORE" statements will not occur if there were any duplicate key errors ignored during execution of the query
}
else {
    echo
"fail";// "INSERT IGNORE" statements causing any duplicate key errors (however ignored) lead to mysqli->affected_rows equal -1
}

// Example below works for "INSERT IGNORE" stattements, too
if ($mysqli->sqlstate=="00000"){
    echo
"success";
}
else {
    echo
"fail";
}
?>
To Top