PHPとMySQLのUPDATE文でデータ更新(PDO)

  • このエントリーをはてなブックマークに追加
  • Pocket

スポンサードリンク

PDOによるMySQLのUPDATE文を使って、データベースのデータを修正、更新します。

mysql_query()がPHP5.5で非推奨となり7.0で削除されたため、現在のPHPによるデータベース接続はPDOが主流となっています。

今回は、UPDATE文とこのPDOを使ったMySQLのデータ登録方法ですが、パフォーマンスやセキュリティも考慮し、プリペアドステートメントを使っています。

複数のデータを一括で更新する方法もご紹介します。

 

UPDATE文の基本

本記事のテーブル構文

UPDATE文を使ったデータ更新を見て行く前に、まず本記事で使用するデータベーステーブルを見てみましょう。

テーブル名:cities

idnamepopulationcreated
1相模原7175002016-04-05 13:41:00
2大和2307002016-04-05 13:41:00
3海老名1277002016-04-05 13:41:00
4厚木2244002016-04-05 13:41:00
5藤沢4097002016-04-05 13:41:00

神奈川県の都市名と人口がまとめられたテーブルになっています。

一番左のidのフィールドは、オートインクリメントによりIDが自動で振られます。

基本的なコード

それでは、PDOでUPDATE文を使ってMySQLにデータを挿入し、完了メッセージをブラウザに出力するまでをひと通り見てみましょう。

以下のようにデータが更新されます。

+–+——+———–+——————————+
| 5 | 藤沢 | 409700 | 2016-04-05 15:00:00 |
+–+——+———–+——————————+

+–+——+———–+——————————+
| 5 | 綾瀬 | 409700 | 2016-04-05 15:00:00 |
+–+——+———–+——————————+

上記のように、フィールドnameの値が藤沢から綾瀬に更新されました。

 

※当サンプルはデータベース接続後からのコードを記載しています。データベースの接続を知りたい方は下記ページをご覧ください。

参考:PHPでMySQLに接続する(PDO)

※当サンプルの変数$dbhは、上記ページでもご紹介しているデータベースの接続に関するプログラムが格納されています。

説明

上記サンプルの概要は以下のようになっています。

 

  1. データを修正するUPDATE文を変数に格納する(更新する値を格納するSETと条件を指定するWHEREの部分は後から値を入れる)
    $sql = “UPDATE cities SET name = :name WHERE id = :id”;
  2. :name:idプレースホルダと呼ばれ、値を入れるための単なる空箱。SQL実行時に値を入れるため、このSQL文は何度も使い回しができ、パフォーマンス的にも優れる。
  3. 値が空のままのSQL文をprepare()にセットし、SQL実行のための準備を行う
    $stmt = $dbh->prepare($sql);
  4. 実際に更新する値と更新するIDを配列に格納
    $params = array(‘:name’ => ‘綾瀬’, ‘:id’ => ‘5’);
  5. そしてexecute()に値が入った配列をセットしてSQLを実行し、データベースにデータを挿入する
    $stmt->execute($params);

大まかな流れは以下のようになります。

SQLの実行準備(prepareにテンプレートとなるSQL文を準備しておく) => SQLの実行(executeに値をセットして実行する)

複数のデータを更新するなどのSQLを複数回実行する場面でも、SQLの準備は最初の1回のみで、2回目以降は値を変えて実行を繰り返すだけでいいので、パフォーマンス的にもいいですね。

そして、上記サンプルのようにユーザーから値が送信されるような場面では、SQLインジェクションによる攻撃の標的となるため、prepare()execute()を使ったプリペアドステートメントという方法でSQLを実行する方法が一般的です。

値をセットする際に自動的にエスケープ処理してくれるため、セキュリティ的にもプリペアドステートメントを使うようにしましょう。

UPDATE文の構文

UPDATE テーブル名 SET 更新するフィールド名 = 上書きする値 WHERE フィールド名 = 値

UPDATEの後にまずテーブル名を指定し、SETにはフィールド名を入れ=(イコール)の後に上書きする値を指定、最後にWHERE で条件を指定します。

条件に特定のIDを指定すると、そのIDにあるフィールドの値だけ更新されます。

複数のデータをUPDATE

先ほどのサンプルでは1つのデータを更新していましたが、以下のサンプルでは複数のデータを一気に更新する方法をご紹介します。

複数のフィールドを更新

まずは、1つのレコードで複数のフィールドを更新してみましょう。

以下のようにデータが修正されます。

+–+——+———–+——————————+
| 5 | 藤沢 | 409700 | 2016-04-05 15:00:00 |
+–+——+———–+——————————+

+–+——+———+——————————+
| 5 | 綾瀬 | 84000 | 2016-04-05 15:00:00 |
+–+——+———+——————————+

上記のように、フィールドnameの値が藤沢から綾瀬に、フィールドpopulationの値が409700から84000に更新されました。

「フィールド」とは?

フィールドは「列」のことで、「カラム」とも呼ばれます。

この例では都市名(name)や人口(population)などの列になります。

ちなみに「行」はレコードと呼びます。

複数のフィールドとレコードを更新

今度は、複数のレコードで複数の更新をしてみます。

以下のようにデータが更新されます。

+–+——+———–+——————————+
| 5 | 厚木 | 224400 | 2016-04-05 15:00:00 |
+–+——+———–+——————————+
| 6 | 藤沢 | 409700 | 2016-04-05 15:00:00 |
+–+——+———–+——————————+

+–+——+————+——————————+
| 5 | 座間 | 129400 | 2016-04-05 15:00:00 |
+–+——+————+——————————+
| 6 | 綾瀬 |   84000 | 2016-04-05 15:00:00 |
+–+——+————+——————————+

上記のように、一気に2つのレコードが更新されました。

:◯◯ のようなプレースホルダを活用することで、ループ処理で一気に複数のデータを更新することもできます。

参考:array関数を使い複数の値を一気にセットする

参考:PHPのforeachで配列処理

スポンサードリンク

  • このエントリーをはてなブックマークに追加
  • Pocket

コメントを残す

*