[PHP][MySQL]UPDATEの実行結果や該当数を取得確認する関数を作ってみた

mysql php

畑に咲いてた

PHPからMySQLをUPDATEするときに、変更結果を取得できる関数無いんかなーと思う機会がありまして、探したんだけど見当たらなくっておおおおおうとなったけれどいろいろあって作ってみました。

事の発端

アホな私は今まで

SELECTで該当があるかどうか確認

ある場合はUPDATE
ない場合はINSERT

というまどろっこしいいい感じでやっていたわけですが、いきなりUPDATEして該当がない場合のみINSERTすればいいじゃん、と思いついたわけです今更。(そもそもこの考え方が良いのかどうかわかりませんが)

UPDATEで変更できたかどうか確認

できた場合はもう何もしない
できなかった場合はINSERT

という感じに・・・・・!

それでそれでー?

mysql_affected_rows();
を使うと、最後に実行したクエリーでの変更した行数を返してくれるので、これが0の場合のみINSERTさせようと思ったわけです。

が、これだと、UPDATEで以前と同じ内容に書き換えをしようとした時も0を返す。
同じ内容に書き換えの場合は変更しないようになってるのねー。
その場合、該当データがあるのにINSERTしようとするので、そりゃ重複してるから無理だよ的なエラーがでちゃってアレだ・・・。
ここはWHERE〜でのマッチ数を取得する関数をひとつヨロシク・・・!

マッチ数を取得する関数はなんですか

と思ったら無いっぽいorz
そこで、

mysql_info();

これをすると「Rows matched: 1 Changed: 0 Warnings: 0」というような文字列が帰ってきます。
これで、
matchedが0だったらINSERT、そうじゃなければそのまま、という感じに分岐できます。

実行結果を取得する関数を作ってみました

大したもんじゃありませんていうかきっとアレなコードですのでよかったら指南してくだいm(_ _)m

下記コードは、鳥名前DBにヒヨドリの名前が英語であったとして、それを日本語に書き換えたということにします。

<?php
function mysql_update_result() {
$res = mysql_info();
$res['matched'] = preg_replace("/^.*matched: ([0-9]*?) .*?$/i", "$1", $str);
$res['changed'] = preg_replace("/^.*changed: ([0-9]*?) .*?$/i", "$1", $str);
$res['warnings'] = preg_replace("/^.*warnings: ([0-9]*?)$/i", "$1", $str);
return $res;
}

mysql_query("UPDATE `ピヨピヨDB` SET `name` = 'ヒヨドリ' WHERE  `name` = 'Hypsipetes amaurotis'");
$result = mysql_update_result();

print_r($result);
#$result => "Rows matched: 1 Changed: 1 Warnings: 0"
#$result['matched']  => 1
#$result['changed'] => 1
#$result['warning'] => 0
?>

で、UPDATEを実行した後に↑のmysql_update_result()をやると、
matched:WHEREの条件でマッチした数
changed:変更した数
warning:なんか注意的なもの
が取得出来ますよーというね、こういう感じのです。

参考(ありがとうございます):
PHPのmysql関数に関する質問です。 select,update,delete で、一.. – 人力検索はてな
MySQLのUPDATE実行結果を受け取る関数 – PHP – 教えて!goo

mysql, php」カテゴリの人気記事

アウトドア&フィッシング ナチュラム

こちらもどうぞ