PHP の MySQL にデータを挿入する方法(INSERT 文の実行)を完全解説!初心者向けガイド
新人
「PHPでMySQLにデータを挿入する方法を知りたいです。どうやってINSERT文を使うんですか?」
先輩
「INSERT文を使えば、データベースに新しいデータを追加できます。PHPでMySQLに接続し、SQL文を実行する方法を学べば、簡単にデータを挿入できますよ。」
新人
「具体的にどのように書けばいいんでしょうか?」
先輩
「まずは、MySQLの基本から説明しますね!」
1. MySQLとは?(基本的な説明)
MySQL(マイエスキューエル)は、世界中のWebサイトや業務システムで使われている代表的なデータベース管理システム(DBMS)です。アプリの中で使う大事な情報を、なくさないように整理して保管する「データの倉庫」のような役割を持っています。
データベースに保存した情報は、「あとで探す」「条件に合うものだけ取り出す」「内容を書き換える」「不要なものを消す」といった操作が簡単にできます。そのため、PHPで作る会員登録機能やログイン機能、ブログ記事の一覧表示やコメント機能など、さまざまな場面でMySQLのデータベースが使われます。
MySQLの主な特徴
- 無料で利用できるオープンソースのデータベースで、個人開発から企業システムまで幅広く利用されている
- 大量のデータでも高速に検索・更新できるため、アクセスの多いWebサイトでも安定して動作しやすい
- PHPと組み合わせて使われることが多く、「PHP × MySQL」でWebアプリを作る入門パターンとして定番
- SQL(エスキューエル)という専用の言語を使って、データの追加(INSERT)、更新(UPDATE)、削除(DELETE)、取得(SELECT)などを行える
テーブルとレコードのイメージ
MySQLの中では、データは「テーブル」という表形式で管理されます。Excelの表をイメージすると分かりやすく、横1行が1件分のデータ(レコード)、縦1列がデータの項目(カラム/列)です。
たとえば、ユーザー情報を管理するテーブルは次のようなイメージになります。
| id | name(名前) | email(メールアドレス) |
|---|---|---|
| 1 | 山田太郎 | taro@example.com |
| 2 | 佐藤花子 | hanako@example.com |
このように、テーブルを用意しておくことで、「新しいユーザーを追加したい」「特定のメールアドレスのユーザーを探したい」といった操作を、SQL文を使って行えるようになります。次のサンプルは、ユーザーを1件追加するだけの、とてもシンプルなSQLの例です。
-- usersテーブルに1件データを追加するイメージ
INSERT INTO users (name, email)
VALUES ('山田太郎', 'taro@example.com');
実際には、このようなINSERT文をPHPから実行することで、Web画面の入力内容をMySQLのテーブルに保存していきます。このあとで、PHPからMySQLに接続する方法や、INSERT文を安全に実行する方法を順番に見ていきましょう。
2. PHPでMySQLに接続する方法(mysqliとPDOの概要)
PHPでは、MySQLに接続する方法として mysqli と PDO の2種類があります。
mysqliとは?
mysqli(MySQL Improved)は、MySQL専用の接続方法です。手続き型とオブジェクト指向の2つの記述方法があり、手軽に利用できます。
PDOとは?
PDO(PHP Data Objects)は、MySQLだけでなく、他のデータベース(PostgreSQLやSQLiteなど)にも対応している接続方法です。セキュリティ面でも強力で、推奨されることが多いです。
mysqliとPDOの比較
| 特徴 | mysqli | PDO |
|---|---|---|
| 対応データベース | MySQLのみ | MySQL, PostgreSQL, SQLite など |
| セキュリティ | 適切な対策が必要 | SQLインジェクション対策が簡単 |
| コードの書きやすさ | シンプル | オブジェクト指向に統一されている |
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);
}
echo "接続成功";
?>
PDOを使った接続方法
<?php
$dsn = "mysql:host=localhost;dbname=test_db;charset=utf8";
$username = "root";
$password = "";
try {
$pdo = new PDO($dsn, $username, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
echo "接続成功";
} catch (PDOException $e) {
echo "接続失敗: " . $e->getMessage();
}
?>
どちらの方法も使えますが、セキュリティを考慮するとPDOの方が推奨されます。
3. mysqliを使ったINSERT文の実行方法
PHPでMySQLにデータを挿入するには、INSERT文を使います。ここでは、mysqliを使った方法を解説します。
テーブルの準備
まず、データを挿入するためのテーブルを用意します。以下のSQLをMySQLで実行してください。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE
);
mysqliでINSERT文を実行する
以下のコードでは、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);
}
// INSERT文を実行
$sql = "INSERT INTO users (name, email) VALUES ('山田 太郎', 'taro@example.com')";
if ($conn->query($sql) === TRUE) {
echo "データが正常に挿入されました。";
} else {
echo "エラー: " . $conn->error;
}
$conn->close();
?>
実行結果の例
データが正常に挿入されました。
4. PDOを使ったINSERT文の実行方法
次に、PDOを使ったINSERT文の実行方法を解説します。PDOは複数のデータベースに対応しており、セキュリティ面でも優れています。
PDOでINSERT文を実行する
以下のコードでは、PDOを使ってデータを挿入します。
<?php
$dsn = "mysql:host=localhost;dbname=test_db;charset=utf8";
$username = "root";
$password = "";
try {
$pdo = new PDO($dsn, $username, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
// INSERT文の実行
$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
":name" => "佐藤 花子",
":email" => "hanako@example.com"
]);
echo "データが正常に挿入されました。";
} catch (PDOException $e) {
echo "エラー: " . $e->getMessage();
}
?>
実行結果の例
データが正常に挿入されました。
プリペアドステートメントのメリット
PDOではプリペアドステートメントを利用することで、以下のメリットがあります。
- SQLインジェクションを防ぐ
- コードの可読性が向上する
- 異なるデータベースにも対応しやすい
5. mysqliとPDOの違い(どちらを選ぶべきか)
mysqliとPDOはどちらもMySQLにデータを挿入できますが、用途によって使い分けるべきです。
mysqliの特徴
- MySQL専用の接続方法
- 手続き型とオブジェクト指向の両方の書き方が可能
- 比較的シンプルなコードで記述できる
PDOの特徴
- MySQL以外にも対応(PostgreSQL, SQLiteなど)
- セキュリティが強化されており、安全なデータ処理が可能
- オブジェクト指向で統一されたコードの記述ができる
どちらを選ぶべきか?
| 条件 | mysqli | PDO |
|---|---|---|
| MySQL専用で十分か | ○ | △(他のDB対応不要なら不要) |
| 他のデータベースにも接続したいか | × | ○ |
| セキュリティを重視したいか | △(SQLインジェクション対策が必要) | ○(プリペアドステートメントが標準対応) |
| オブジェクト指向で書きたいか | ○ | ○ |
MySQLだけを扱うならmysqliでも問題ありませんが、セキュリティや汎用性を考えるとPDOの方が推奨されます。
6. MySQLのエラーハンドリング(INSERT文のエラー処理)
データを挿入する際にエラーが発生することがあります。例えば、データベースの接続エラーや、入力データが不適切な場合などです。ここでは、mysqliとPDOを使ったエラーハンドリングの方法を紹介します。
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);
}
// INSERT文を実行
$sql = "INSERT INTO users (name, email) VALUES ('田中 一郎', 'ichiro@example.com')";
if ($conn->query($sql) === TRUE) {
echo "データが正常に挿入されました。";
} else {
echo "エラー: " . $conn->error;
}
$conn->close();
?>
PDOを使ったエラーハンドリング
<?php
$dsn = "mysql:host=localhost;dbname=test_db;charset=utf8";
$username = "root";
$password = "";
try {
$pdo = new PDO($dsn, $username, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
// INSERT文の実行
$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
":name" => "鈴木 次郎",
":email" => "jiro@example.com"
]);
echo "データが正常に挿入されました。";
} catch (PDOException $e) {
echo "エラー: " . $e->getMessage();
}
?>
エラー処理のポイント
- エラーが発生した場合は、適切なメッセージを表示する
- PDOの
try-catchブロックを使うと、エラー内容をキャッチしやすい - ログにエラーを記録することで、後から原因を特定しやすくなる
7. セキュリティ対策(SQLインジェクション対策)
SQLインジェクションとは、悪意のあるSQL文を挿入する攻撃手法です。適切な対策をしないと、データの漏洩や改ざんのリスクがあります。
危険なコードの例
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";
$conn = new mysqli($servername, $username, $password, $dbname);
// ユーザーからの入力(例: フォーム入力)
$name = $_GET['name'];
$email = $_GET['email'];
// 危険なSQL(直接変数を埋め込む)
$sql = "INSERT INTO users (name, email) VALUES ('$name', '$email')";
if ($conn->query($sql) === TRUE) {
echo "データが正常に挿入されました。";
} else {
echo "エラー: " . $conn->error;
}
$conn->close();
?>
このコードでは、$nameや$emailがそのままSQL文に埋め込まれているため、SQLインジェクション攻撃を受ける可能性があります。
安全な方法(プリペアドステートメントの使用)
プリペアドステートメントを使うことで、SQLインジェクションを防ぐことができます。
mysqliを使った安全なコード
<?php
$conn = new mysqli($servername, $username, $password, $dbname);
// プリペアドステートメントを使用
$stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
// 例のデータ
$name = "佐藤 三郎";
$email = "saburo@example.com";
$stmt->execute();
echo "データが正常に挿入されました。";
$stmt->close();
$conn->close();
?>
PDOを使った安全なコード
<?php
try {
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute([
":name" => "高橋 四郎",
":email" => "shiro@example.com"
]);
echo "データが正常に挿入されました。";
} catch (PDOException $e) {
echo "エラー: " . $e->getMessage();
}
?>
セキュリティ対策のポイント
- ユーザーの入力をそのままSQLに埋め込まない
- プリペアドステートメントを使う
- 入力値を検証し、適切な形式かどうかチェックする
8. まとめとおすすめの使い方
ここまで、PHPでMySQLにデータを挿入する方法について解説しました。最後に、重要なポイントをまとめます。
データ挿入の基本
- MySQLに接続し、INSERT文を使う
- mysqli または PDO のどちらかを選ぶ
- プリペアドステートメントを使うことで、セキュリティを向上させる
エラーハンドリング
- 接続エラーやSQLエラーが発生した場合、適切なメッセージを表示する
- エラー内容をログに記録すると、問題の原因を特定しやすい
セキュリティ対策
- SQLインジェクションを防ぐために、プリペアドステートメントを使う
- ユーザーの入力値をバリデーションする
- データの改ざんや漏洩を防ぐため、適切なアクセス制御を行う
PHPでMySQLにデータを挿入する方法は、Webアプリ開発の基本です。適切な方法を学び、安全なアプリケーションを作りましょう。
まとめ
PHPでMySQLにデータを挿入する方法について学んだ今回の内容は、Webアプリケーション開発において欠かせない基礎知識です。INSERT文の使い方はもちろん、mysqliとPDOの違い、プリペアドステートメントによるセキュリティ対策、そしてtry-catchを使ったエラーハンドリングの重要性まで幅広く理解できました。
mysqliはMySQL専用で手軽に使える反面、セキュリティ対策には注意が必要です。一方、PDOは複数のデータベースに対応し、SQLインジェクションに強く、今後の拡張性を考えると特に初心者にはおすすめの方法と言えるでしょう。
また、SQLインジェクションの脅威とその対策方法についても、実際の危険なコードと安全なプリペアドステートメントの例を比較しながら理解を深めることができました。
こうした知識は、データベースに安全かつ正確に情報を追加するための土台となります。実際に以下のようなPHPコードを何度も書いて練習することで、初心者の方でも安心して開発が進められるようになるはずです。
安全なINSERT文のサンプル(PDO使用)
<?php
$dsn = "mysql:host=localhost;dbname=test_db;charset=utf8";
$username = "root";
$password = "";
try {
$pdo = new PDO($dsn, $username, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute([
":name" => "中村 一美",
":email" => "kazumi@example.com"
]);
echo "データが正常に挿入されました。";
} catch (PDOException $e) {
echo "エラー: " . $e->getMessage();
}
?>
こんなときどうする?よくある質問
- Q. データが挿入されない場合は?
→ 接続情報やSQL文に誤りがないか確認しましょう。echoやvar_dumpを使ってデバッグすると効果的です。 - Q. エラーメッセージが表示されるけど原因が分からない
→try-catch内で$e->getMessage()を出力することで、原因の詳細が分かります。 - Q. SQLインジェクションって実際に危険なの?
→ はい。ログインバイパスやデータの削除など、重大な被害につながる可能性があります。常にプリペアドステートメントを使いましょう。
覚えておくべきキーワード
- PHP
- MySQL
- INSERT文
- データベース接続
- mysqli
- PDO
- プリペアドステートメント
- SQLインジェクション対策
- エラーハンドリング
新人
「最初はちょっと難しそうに感じたんですが、INSERT文とPDOの使い方がだんだんわかってきました!」
先輩
「そうですね。基本的な使い方だけでなく、セキュリティ対策やエラー処理も含めて覚えると、実務でも役に立ちますよ。」
新人
「特にプリペアドステートメントの仕組みは目からウロコでした。安全性って大事なんですね。」
先輩
「その調子で、今後はUPDATEやDELETE文も学んでいきましょう。Web開発に必要なスキルはこれからどんどん広がっていきますよ!」