初心者向けPHP の MySQL のデータを更新する方法(UPDATE 文)完全ガイド
新人:「PHPでMySQLのデータを更新する方法って、どうやってやるんですか?」
先輩:「PHPでMySQLのデータを更新するには、UPDATE文を使いますよ。UPDATE文は、テーブルのデータを変更するためのSQL文ですね。」
新人:「UPDATE文って、どうやって書けばいいんですか?」
先輩:「それは、ちょっとしたコツがありますよ。まずは基本的なUPDATE文の書き方を紹介しますね。」
1. UPDATE文とは?(基本的な説明)
UPDATE文は、MySQLのテーブルに保存されているデータを「書き換える」ためのSQL文です。たとえば、会員情報テーブルに登録されているユーザーの名前やメールアドレス、住所、パスワードのハッシュ値などを変更したいときに、このUPDATE文を使って既存のデータを更新します。
イメージとしては、「新しいレコードを追加する」のが INSERT、「いらないデータを消す」のが DELETE、そして「今あるデータの中身を直す」のが UPDATE だと考えるとわかりやすいです。会員情報を修正したり、在庫数を増減したりするときに、WEBシステムの裏側で必ずと言っていいほど登場します。
UPDATE文の基本的な構文は次のようになります:
UPDATE テーブル名
SET カラム名 = 新しい値
WHERE 条件;
この文では、指定したテーブルの中の、指定したカラムに対して新しい値をセットします。よく使うのは、会員テーブル users の中の特定ユーザーだけを更新するパターンです。もう少し具体的な例を見てみましょう。
UPDATE users
SET name = '山田太郎'
WHERE id = 1;
このSQLは、users テーブルの中で id が 1 の行だけを探し、その行の name カラムを '山田太郎' に更新します。実際のサービスでは、「ユーザーがプロフィール画面で名前を変更した」といった操作の裏側で、このようなUPDATE文が動いているイメージです。
UPDATE文では、複数のカラムをまとめて更新することもできます。
UPDATE users
SET name = '山田太郎',
email = 'taro@example.com'
WHERE id = 1;
このようにカンマ区切りで SET を並べることで、「名前」と「メールアドレス」を一度に更新できます。ユーザー情報の編集画面などでは、複数項目を一度に保存することが多いので、この書き方を覚えておくと便利です。
ここで特に大事なのが WHERE 句です。どの行を更新するのか を指定する部分で、これを書き忘れるとテーブル内の全ての行が更新されてしまいます。
UPDATE users
SET name = 'ゲストユーザー';
-- WHERE を書いていない!
もしこのように WHERE を付けずに実行すると、users テーブルの全ユーザーの名前が「ゲストユーザー」に書き換わってしまいます。実務ではよくある事故パターンなので、「UPDATE文を書くときは必ずWHEREを確認する」という習慣をつけておくと安心です。
まとめると、UPDATE文は「どのテーブルの」「どのカラムに」「どんな条件の行に対して」「どんな新しい値を入れるか」を指定するためのSQLです。PHPからUPDATE文を実行するときも、この考え方はまったく同じなので、まずはSQLそのものの仕組みをしっかりイメージしておくことが、後のコード理解にもつながります。
2. UPDATE文の基本的な書き方と構文
ここでは、PHPからMySQLのデータを実際に「書き換える」方法を、できるだけシンプルな例で説明します。UPDATE文の動きがイメージできるように、まずは最も基本的なサンプルから確認してみましょう。
次の例では、データベースにあるユーザー情報の中から「id が 1 のユーザー」を探し、そのユーザーの名前を新しい内容に更新します。初めて触る方でも分かりやすいように、更新処理の流れをそのまま書いたコードです。
<?php
// データベース接続情報
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";
// MySQLに接続(mysqliを使用)
$conn = new mysqli($servername, $username, $password, $dbname);
// 接続の確認
if ($conn->connect_error) {
die("接続失敗: " . $conn->connect_error);
}
// UPDATE文を定義(id=1 の name を変更)
$sql = "UPDATE users SET name = '新しい名前' WHERE id = 1";
// UPDATE文を実行
if ($conn->query($sql) === TRUE) {
echo "レコードが更新されました";
} else {
echo "エラー: " . $conn->error;
}
// 接続を閉じる
$conn->close();
?>
このコードでは、まずデータベースへ接続し、そのあとで UPDATE 文を実行しています。ポイントは、WHERE id = 1 と指定することで、どのユーザーのデータを更新するのかを明確にしていることです。もしこの WHERE がないと、テーブル全体の名前が書き換わってしまうため、UPDATE文ではとても重要な部分です。
未経験の方は、「決められたユーザーを探して、その人のデータだけを変更するための文」とイメージすると理解しやすくなります。PHPのコード自体も難しくないので、まずはこのシンプルな形を覚えておくと安心です。
3. mysqliを使ったUPDATE文の実行方法
ここでは、PHP初心者でも理解しやすい形で、mysqliを使ってMySQLのデータを更新する基本手順を紹介します。実際の開発でも必ず使う処理なので、流れをしっかり押さえておくと後の学習が楽になります。
やることは大きく分けて「接続 → SQL文を作る → 実行 → 結果を確認」の4ステップ。まずはシンプルな例から見ていきましょう。
<?php
// データベース接続設定
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";
// MySQLに接続(失敗したら止める)
$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
die("接続失敗: " . mysqli_connect_error());
}
// 更新したいSQL文(id=1 の email を書き換える)
$sql = "UPDATE users SET email = 'newemail@example.com' WHERE id = 1";
// SQLを実行して結果を確認
if (mysqli_query($conn, $sql)) {
echo "メールアドレスが更新されました!";
} else {
echo "エラーが発生しました: " . mysqli_error($conn);
}
// 接続を閉じる
mysqli_close($conn);
?>
このサンプルでは、まずデータベースに接続し、そのあとでUPDATE文を実行しています。初心者がつまずきやすい部分ですが、コードの流れはとてもシンプルで、mysqli_query() が「SQLを実行する役目」を担当しています。
ポイントは、WHERE id = 1 を指定して「どのデータを更新するか」を明確にしているところです。もしWHEREを書き忘れると全件が書き換えられてしまうため、UPDATE文では必ず確認する習慣をつけておくと安心です。
まずはこの基本の型を覚えれば、ほかのUPDATE処理にも応用できます。実際のシステムでもほぼ同じ流れで動いているため、理解しておくと後々スムーズに進められます。
4. PDOを使ったUPDATE文の実行方法
次に、PDO(PHP Data Objects)を使った方法を紹介します。PDOは、複数のデータベースシステムに対応したデータベース接続の方法を提供するPHPの拡張モジュールです。mysqliとは違い、PDOはオブジェクト指向のインターフェースを提供し、セキュリティが強化されています。
PDOを使う場合の基本的なコード例は以下の通りです。
<?php
try {
// データベース接続設定
$pdo = new PDO("mysql:host=localhost;dbname=test_db", "root", "");
// エラーモード設定
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 更新したいSQL文を準備
$sql = "UPDATE users SET email = :email WHERE id = :id";
$stmt = $pdo->prepare($sql);
// パラメータをバインド
$stmt->bindParam(':email', $email);
$stmt->bindParam(':id', $id);
// 値を設定して実行
$email = "newemail@example.com";
$id = 1;
$stmt->execute();
echo "レコードが正常に更新されました";
} catch (PDOException $e) {
echo "エラー: " . $e->getMessage();
}
?>
この例では、PDOを使ってusersテーブルのemailを更新しています。SQL文にプレースホルダ(:email、:id)を使い、bindParam()メソッドで値をバインドしています。これにより、SQLインジェクションのリスクが低くなります。
5. mysqliとPDOの違い(どちらを選ぶべきか)
PHPでデータベースにアクセスする方法として、mysqliとPDOがありますが、どちらを選ぶべきか迷うこともあるでしょう。ここでは、mysqliとPDOの主な違いを紹介し、どちらを選ぶべきかの指針を提供します。
5.1 mysqliの特徴
mysqliは、MySQL専用のデータベースアクセスライブラリです。そのため、MySQLに特化した機能や最適化が行われています。手続き型とオブジェクト指向型の両方の書き方に対応しています。
特徴:
- MySQL専用で最適化されている
- 手続き型とオブジェクト指向型を選べる
- 複数のクエリを一度に実行することが可能
5.2 PDOの特徴
PDOは、MySQLだけでなく、他のデータベース(例えばPostgreSQL、SQLiteなど)にも対応している汎用性の高いライブラリです。オブジェクト指向に特化しており、セキュリティ面でも優れた機能を提供しています。
特徴:
- 複数のデータベースに対応
- オブジェクト指向のみ
- SQLインジェクション対策が強化されている(バインドパラメータ)
5.3 どちらを選ぶべきか
mysqliは、MySQL専用で動作が速いというメリットがありますが、PDOはデータベースの種類を選ばず使えるので、プロジェクトが他のデータベースを使う可能性がある場合はPDOの方が柔軟性があります。
セキュリティ面での観点からも、PDOはバインドパラメータを使ったSQLインジェクション対策が標準で強化されているため、安全にデータベースとやり取りを行いたい場合はPDOを選ぶと良いでしょう。
6. MySQLのエラーハンドリング(UPDATE文のエラー処理)
データベースの操作中にエラーが発生した場合、適切にエラーハンドリングを行うことが重要です。mysqliを使用した場合、エラーが発生した場合にはmysqli_error()関数を使ってエラーメッセージを表示することができます。
例えば、UPDATE文で不正なカラム名やテーブル名を指定した場合、エラーが発生します。エラーメッセージをしっかり確認して、問題を解決する必要があります。
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";
// MySQLに接続
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 接続確認
if (!$conn) {
die("接続失敗: " . mysqli_connect_error());
}
// 不正なSQL文を実行
$sql = "UPDATE users SET email = 'invalidemail@example.com' WHERE id = 1000";
if (mysqli_query($conn, $sql)) {
echo "レコードが更新されました";
} else {
echo "エラー: " . mysqli_error($conn);
}
// 接続を閉じる
mysqli_close($conn);
?>
このコードでは、存在しないユーザー(id = 1000)を更新しようとした場合、エラーが発生します。mysqli_error()を使用して、発生したエラーメッセージを表示することができます。
7. セキュリティ対策(SQLインジェクション対策)
データベース操作を行う際には、セキュリティ対策をしっかり行うことが重要です。その一つが、SQLインジェクション対策です。SQLインジェクションは、ユーザーが悪意を持ってSQL文を変更してデータベースに不正アクセスを試みる攻撃です。
これを防ぐためには、ユーザー入力を直接SQL文に埋め込まないようにすることが基本です。代わりに、プリペアドステートメント(Prepared Statements)を使用します。
7.1 mysqliを使ったSQLインジェクション対策
以下のように、mysqliでプリペアドステートメントを使うことで、SQLインジェクションを防ぐことができます。
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";
// MySQLに接続
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 接続確認
if (!$conn) {
die("接続失敗: " . mysqli_connect_error());
}
// プリペアドステートメントの準備
$stmt = $conn->prepare("UPDATE users SET email = ? WHERE id = ?");
$stmt->bind_param("si", $email, $id);
// ユーザー入力
$email = "newemail@example.com";
$id = 1;
// SQL文を実行
if ($stmt->execute()) {
echo "レコードが更新されました";
} else {
echo "エラー: " . $stmt->error;
}
// ステートメントを閉じる
$stmt->close();
// 接続を閉じる
$conn->close();
?>
このコードでは、プリペアドステートメントを使い、ユーザーからの入力($emailや$id)を安全にデータベースに埋め込んでいます。bind_param()を使うことで、SQLインジェクション攻撃を防げます。
8. まとめとおすすめの使い方
PHPでMySQLのデータを更新するためのUPDATE文の使い方について、基本的な説明から実際のコード例まで見てきました。ここでのポイントをまとめておきましょう:
- UPDATE文は、指定したテーブルのデータを更新するために使用します。
- PHPでMySQLのUPDATE文を実行するには、
mysqliやPDOを使います。 - エラーハンドリングをしっかり行うことで、問題発生時に適切な対応ができます。
- SQLインジェクションを防ぐために、必ずプリペアドステートメントを使うようにしましょう。
また、mysqliとPDOの違いについても触れましたが、mysqliは手続き型とオブジェクト指向型の2つの書き方が選べ、PDOはより柔軟で複数のデータベースに対応しています。
PHPでMySQLのデータ更新を行う際は、セキュリティ面を十分に考慮し、安全にデータ操作を行うよう心がけましょう。
まとめ
本記事では、PHPでMySQLのデータを更新する方法として、UPDATE文の基本から、mysqliやPDOを使った実践的なコード例までを段階的に解説しました。データベースに保存されたユーザー情報やメールアドレスを更新したい場面は非常に多く、正しい構文と安全な方法を身につけることは、実務でも役立つ知識です。
特に重要なのが、WHERE句による条件指定です。条件を指定しないと全件更新という恐ろしい結果になることもあるため、WHERE句を必ず使いましょう。また、SQLインジェクションの対策として、プリペアドステートメントを利用することも非常に大切です。
ここではmysqliとPDOの両方の使い方を学び、それぞれの違いやメリット・デメリットも明確に理解できたと思います。セキュリティ面を強化するならPDO、MySQLに特化した開発ならmysqliといったように、用途によって使い分けられるようになりましょう。
実際のコード例を見ながら、bind_paramやbindParamの違い、例外処理の書き方なども確認できたので、PHPで安全かつ効率的にデータベースの情報を更新できるようになったはずです。下記に、より応用的なプリペアドステートメントの例も紹介しておきます。
応用:複数カラムのUPDATE処理(PDO編)
<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=test_db", "root", "");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "UPDATE users SET name = :name, email = :email WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':name', $name);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':id', $id);
$name = "佐藤太郎";
$email = "taro@example.com";
$id = 2;
$stmt->execute();
echo "複数カラムの更新が成功しました";
} catch (PDOException $e) {
echo "エラー: " . $e->getMessage();
}
?>
このように、複数のカラムを同時に更新することも可能です。実務では、名前・メールアドレス・パスワードなど、複数のフィールドを一度に更新することがよくありますので、覚えておくと便利です。
MySQLのUPDATE文は、基本的なデータ操作として非常に頻度が高く、PHPと組み合わせて使う機会も多いため、エラー処理・セキュリティ・パフォーマンス面を意識しながら、しっかりとした実装を心がけましょう。
生徒:「先生、PHPでMySQLのデータを更新する方法って、やっぱり覚えておいた方がいいですね。」
先生:「もちろんです。更新処理はウェブアプリケーションで非常に使われますからね。特にWHERE句の使い忘れには要注意ですよ。」
生徒:「あと、SQLインジェクションを防ぐためにはプリペアドステートメントが必要なんですよね?」
先生:「その通り!bind_paramやbindParamを使って、外部からの入力を安全に扱いましょう。」
生徒:「mysqliとPDOの違いもちゃんと理解できました。PDOの方がセキュリティや柔軟性に優れているんですね。」
先生:「そうですね。ただし、MySQL専用の開発ならmysqliの方が軽量で使いやすい場合もあります。状況に応じて選びましょう。」
生徒:「次はINSERTやDELETE文の使い方も学びたいです!」
先生:「いいですね!基本をしっかり学べば、どんな開発にも応用できますよ。」