PHPとMySQLのDELETE文で戻り値を取得するには?

php_delete文の返り値 プログラミング

PHPでデータベース(MySQL)を操作ってよくやりますよね。そして、データベースを操作する中でレコードの削除もよく行うと思います。

レコードの削除はDELETEを使えばいいわけですが、ここで私がハマったのが、DELETE文で削除したときに対象のレコードがなかったとしても削除されたと認識されることです。

今回はこの内容の説明と対策を紹介します。

PHPでのDELETE文の作り方

例えばこんなデータベースのテーブルがあったとします。

データベース名:testdb、テーブル名:testtbl

No name
1 太郎
2 次郎
3 三郎

このテーブルのNoの番号が入力されたら、そのレコードを削除したいとします。

まずは、Noの番号を入力する画面をHTMLなどで作ります。

これで入力欄に値を入力し、”削除”のボタンを押すと、”delete.php”が動きます。

次に、PHPでDELETE文を作ってみましょう。

(ユーザ名:tester、パスワード:password、接続するホスト名:mysql0000.xxxxx.jp としました。)

このようなdelete.phpを作った上で、input.htmlで入力欄に値を入力し削除ボタンを押すと、入力された値のNoのレコードが削除されます。

例えば、input.htmlで1を入力し、削除ボタンを押したとします。

1を入力した例

すると、このように表示され、

No.1が削除されました

testtblは、このようになります。

No name
2 次郎
3 三郎

これが基本的なDELETE文の作り方です。

※本当は例外処理なども入れるべきですが今回は省いています。

もしテーブルにないNoを入力したらどうなる?

では、input.htmlで4などのテーブルのNoにない値を入力し、削除ボタンを押したらどうなるでしょうか?

4を入力した例

ちなみに、私はエラーが出て、例外処理で拾えばいいと考えていました。結果は

No.4を削除しました

はい???いやいや、ちょ待てよ

Noが4のレコードがないにも関わらず、実行されてしまうんです。

MySQLなどを触ったことがあるとわかるのですが、DELETE文を実行した際、対象のレコードがない場合でも「0行を削除しました。」となり、エラーにはならないんですよね…(知らなかった)

rowCount() を使って戻り値を取得する

これで何が困るかって、削除したはずなのに消えていない!、不具合だ!と騒がれること。(まあ見た目もアウトですが…)

ということで、対策を考えます。

考えたのは何件削除されたのかがわかれば、テーブルからレコードが削除されたかどうかがわかるはずというもの。

PDOStatement->rowCount() — 直近の SQL ステートメントによって作用した行数を返す

を使います。

SQLを実行した後に

を追加し、再度4を入力し、削除ボタンを押すと、

No.4は存在しません。

と表示が変わりました。

やった~!!!

ちなみに私はDELETE文で削除した際、対象となるレコードが無くてもエラーにならないことを知らず、永遠と悩んでいました…。

もし私と同じように、DELETE文のエラーが出ない!と悩んでいたら、rowCount()を使い、削除件数の戻り値を取得するとうまくいきますよ。

タイトルとURLをコピーしました