初心者向けPHP の MySQL のデータを更新する方法(UPDATE 文)完全ガイド
新人:「PHPでMySQLのデータを更新する方法って、どうやってやるんですか?」
先輩:「PHPでMySQLのデータを更新するには、UPDATE文を使いますよ。UPDATE文は、テーブルのデータを変更するためのSQL文ですね。」
新人:「UPDATE文って、どうやって書けばいいんですか?」
先輩:「それは、ちょっとしたコツがありますよ。まずは基本的なUPDATE文の書き方を紹介しますね。」
1. UPDATE文とは?(基本的な説明)
UPDATE文は、MySQLのテーブルに保存されているデータを更新するために使用します。たとえば、ユーザーの名前やメールアドレスを変更したいときに、このUPDATE文を使います。
基本的な構文は次のようになります:
UPDATE テーブル名
SET カラム名 = 新しい値
WHERE 条件;
この文では、指定したテーブルの指定したカラムを新しい値に変更します。ただし、どのデータを更新するかを特定するためには、必ずWHERE
句を使って条件を指定します。条件を指定しないと、全ての行が更新されてしまうので注意が必要です。
2. UPDATE文の基本的な書き方と構文
実際にPHPを使って、MySQLのデータを更新する例を見てみましょう。以下は、mysqli
を使った例です。
<?php
// データベース接続情報
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";
// MySQLに接続
$conn = new mysqli($servername, $username, $password, $dbname);
// 接続を確認
if ($conn->connect_error) {
die("接続失敗: " . $conn->connect_error);
}
// SQL文を定義
$sql = "UPDATE users SET name='新しい名前' WHERE id=1";
// SQL文を実行
if ($conn->query($sql) === TRUE) {
echo "レコードが更新されました";
} else {
echo "エラー: " . $sql . "<br>" . $conn->error;
}
// 接続を閉じる
$conn->close();
?>
この例では、users
テーブルのname
カラムを、新しい名前に変更しています。条件として、id=1
という条件を指定し、特定のユーザーのデータだけを更新しています。
3. mysqliを使ったUPDATE文の実行方法
次に、PHPのmysqli
を使って、MySQLデータベース内のデータを更新する方法を説明します。mysqli
は、MySQLに接続してクエリを実行するための便利な機能を提供します。
まず、基本的な構文をおさらいしましょう。
<?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 = 'newemail@example.com' WHERE id = 1";
// SQL文を実行
if (mysqli_query($conn, $sql)) {
echo "レコードが正常に更新されました";
} else {
echo "エラー: " . mysqli_error($conn);
}
// 接続を閉じる
mysqli_close($conn);
?>
このコードでは、users
テーブルのid
が1のユーザーのemail
を新しい値に更新しています。クエリが成功した場合は「レコードが正常に更新されました」というメッセージが表示されます。
mysqli_query()
を使用してSQL文を実行し、その結果を確認することができます。
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のデータ更新を行う際は、セキュリティ面を十分に考慮し、安全にデータ操作を行うよう心がけましょう。