mysql_affected_rows
一番最近の操作で変更された行の数を得る
警告
この拡張モジュールは PHP 5.5.0 で非推奨になり、PHP 7.0.0 で削除されました。
MySQLi あるいは
PDO_MySQL を使うべきです。詳細な情報は
MySQL: API の選択 を参照ください。
この関数の代替として、これらが使えます。
- mysqli_affected_rows
- PDOStatement::rowCount
説明
int mysql_affected_rows(resource $link_identifier
= NULL)
パラメータ
-
link_identifier
-
MySQL 接続。指定されない場合、mysql_connect により直近にオープンされたリンクが指定されたと仮定されます。そのようなリンクがない場合、引数を指定せずに mysql_connect がコールした時と同様にリンクを確立します。リンクが見付からない、または、確立できない場合、E_WARNING
レベルのエラーが生成されます。
戻り値
成功した場合に変更された行の数を、直近のクエリが失敗した場合に
-1 を返します。
直近のクエリが WHERE 句を含まない DELETE だった場合、テーブルから
すべてのレコードが削除されますが、MySQL 4.1.2 以前のバージョンでは
この関数はゼロを返します。
UPDATE を使用する場合、MySQL では新旧の値が同じときには更新処理を行いません。
このことから、必ずしも mysql_affected_rows の返す値が
マッチする行の数と一致するとは限りません。返す値は実際に更新処理が行われた
行の数です。
REPLACE ステートメントは、まず最初に同じ主キーのレコードを削除した後に
新しいレコードを挿入します。この関数は、削除された行の数と
挿入された行の数を足したものを返します。
"INSERT ... ON DUPLICATE KEY UPDATE" クエリの場合の戻り値は、
新しい行を追加した場合が 1
で既存の行を更新した場合が 2
となります。
例
例1 mysql_affected_rows の例
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');
/* これは、削除されたレコードの正しい数をかえずはず */
mysql_query('DELETE FROM mytable WHERE id < 10');
printf("Records deleted: %d\n", mysql_affected_rows());
/* 決して真にはならない where 条件なので、結果は 0 となるはず */
mysql_query('DELETE FROM mytable WHERE 0');
printf("Records deleted: %d\n", mysql_affected_rows());
?>
Records deleted: 10
Records deleted: 0
例2 トランザクションを利用した mysql_affected_rows の例
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');
/* レコードの更新 */
mysql_query("UPDATE mytable SET used=1 WHERE id < 10");
printf ("Updated records: %d\n", mysql_affected_rows());
mysql_query("COMMIT");
?>
注意
注意:
トランザクション
トランザクションを使用する場合には、コミット後ではなく
INSERT, UPDATE, DELETE クエリの後に
mysql_affected_rows をコールする必要があります。
注意:
SELECT ステートメント
SELECT から返される行の数を得る際には、
mysql_num_rows が利用できます。
注意:
外部キーによる連鎖
mysql_affected_rows は、外部キー制約の
ON DELETE CASCADE や ON UPDATE CASCADE
で暗黙のうちに変更された行については数えません。
参考
- mysql_num_rows
- mysql_info