PDOによるMySQLのUPDATE文を使って、データベースのデータを修正、更新します。
mysql_query()
がPHP5.5で非推奨となり7.0で削除されたため、現在のPHPによるデータベース接続はPDOが主流となっています。
今回は、UPDATE文とこのPDOを使ったMySQLのデータ登録方法ですが、パフォーマンスやセキュリティも考慮し、プリペアドステートメントを使っています。
複数のデータを一括で更新する方法もご紹介します。
UPDATE文の基本
本記事のテーブル構文
UPDATE文を使ったデータ更新を見て行く前に、まず本記事で使用するデータベーステーブルを見てみましょう。
テーブル名:cities
id | name | population | created |
---|---|---|---|
1 | 相模原 | 717500 | 2016-04-05 13:41:00 |
2 | 大和 | 230700 | 2016-04-05 13:41:00 |
3 | 海老名 | 127700 | 2016-04-05 13:41:00 |
4 | 厚木 | 224400 | 2016-04-05 13:41:00 |
5 | 藤沢 | 409700 | 2016-04-05 13:41:00 |
神奈川県の都市名と人口がまとめられたテーブルになっています。
一番左のid
のフィールドは、オートインクリメントによりIDが自動で振られます。
基本的なコード
それでは、PDOでUPDATE文を使ってMySQLにデータを挿入し、完了メッセージをブラウザに出力するまでをひと通り見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// UPDATE文を変数に格納 $sql = "UPDATE cities SET name = :name WHERE id = :id"; // 更新する値と該当のIDは空のまま、SQL実行の準備をする $stmt = $dbh->prepare($sql); // 更新する値と該当のIDを配列に格納する $params = array(':name' => '綾瀬', ':id' => '5'); // 更新する値と該当のIDが入った変数をexecuteにセットしてSQLを実行 $stmt->execute($params); // 更新完了のメッセージ echo '更新完了しました'; |
以下のようにデータが更新されます。
+–+——+———–+——————————+
| 5 | 藤沢 | 409700 | 2016-04-05 15:00:00 |
+–+——+———–+——————————+
↓
+–+——+———–+——————————+
| 5 | 綾瀬 | 409700 | 2016-04-05 15:00:00 |
+–+——+———–+——————————+
上記のように、フィールドname
の値が藤沢
から綾瀬
に更新されました。
※当サンプルはデータベース接続後からのコードを記載しています。データベースの接続を知りたい方は下記ページをご覧ください。
※当サンプルの変数$dbh
は、上記ページでもご紹介しているデータベースの接続に関するプログラムが格納されています。
説明
上記サンプルの概要は以下のようになっています。
- データを修正するUPDATE文を変数に格納する(更新する値を格納する
SET
と条件を指定するWHERE
の部分は後から値を入れる)
$sql = “UPDATE cities SET name = :name WHERE id = :id”; :name
や:id
はプレースホルダと呼ばれ、値を入れるための単なる空箱。SQL実行時に値を入れるため、このSQL文は何度も使い回しができ、パフォーマンス的にも優れる。- 値が空のままのSQL文を
prepare()
にセットし、SQL実行のための準備を行う
$stmt = $dbh->prepare($sql); - 実際に更新する値と更新するIDを配列に格納
$params = array(‘:name’ => ‘綾瀬’, ‘:id’ => ‘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つのレコードで複数のフィールドを更新してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// UPDATE文を変数に格納 $sql = "UPDATE cities SET name = :name, population = :population WHERE id = :id"; // 更新する値と該当のIDは空のまま、SQL実行の準備をする $stmt = $dbh->prepare($sql); // 挿入する値が複数の場合はカンマ区切りで追加する $params = array(':name' => '綾瀬', ':population' => '84000', ':id' => '5'); // 修正する値と該当のIDが入った変数をexecuteにセットしてSQLを実行 $stmt->execute($params); // 更新完了のメッセージ echo '更新完了しました'; |
以下のようにデータが修正されます。
+–+——+———–+——————————+
| 5 | 藤沢 | 409700 | 2016-04-05 15:00:00 |
+–+——+———–+——————————+
↓
+–+——+———+——————————+
| 5 | 綾瀬 | 84000 | 2016-04-05 15:00:00 |
+–+——+———+——————————+
上記のように、フィールドname
の値が藤沢
から綾瀬
に、フィールドpopulation
の値が409700
から84000
に更新されました。
「フィールド」とは?
フィールドは「列」のことで、「カラム」とも呼ばれます。
この例では都市名(name)や人口(population)などの列になります。
ちなみに「行」はレコードと呼びます。
複数のフィールドとレコードを更新
今度は、複数のレコードで複数の更新をしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// UPDATE文を変数に格納 $sql = "UPDATE cities SET name = :name, population = :population WHERE id = :id"; // 更新する値と該当のIDは空のまま、SQL実行の準備をする $stmt = $dbh->prepare($sql); // 更新する値と該当のIDを配列に格納する $params = array( array('name'=>'座間', 'population'=>129400, 'id'=>4), array('name'=>'綾瀬', 'population'=>84000, 'id'=>5), ); // foreachで更新する値を1つずつループ処理 foreach ($params as $row) { // 連想配列の値をそれぞれのプレースホルダにセットし、executeでSQLを実行 // コードが見やすいように改行 $stmt->execute(array( ':name' => $row['name'], ':population' => $row['population'], ':id' => $row['id']) ); } |
以下のようにデータが更新されます。
+–+——+———–+——————————+
| 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つのレコードが更新されました。
:◯◯ のようなプレースホルダを活用することで、ループ処理で一気に複数のデータを更新することもできます。
このページは分かりやすく実例のデータベースの作り方から説明されているが、こちら超初心者のため、前段の「データベースに接続」「データベースの選択」「utf-8とするおまじない」の部分の、php文の実例が欲しいのですが…
返信が遅くなりました。以下のページにてMySQLに接続する記事を掲載しております。
https://www.flatflag.nir87.com/pdo_construct-912