PHP の MySQL にデータを挿入する方法(INSERT 文の実行)を完全解説!初心者向けガイド
新人
「PHPでMySQLにデータを挿入する方法を知りたいです。どうやってINSERT文を使うんですか?」
先輩
「INSERT文を使えば、データベースに新しいデータを追加できます。PHPでMySQLに接続し、SQL文を実行する方法を学べば、簡単にデータを挿入できますよ。」
新人
「具体的にどのように書けばいいんでしょうか?」
先輩
「まずは、MySQLの基本から説明しますね!」
1. MySQLとは?(基本的な説明)
MySQL(マイエスキューエル)は、世界中で使われているデータベース管理システム(DBMS)です。データを保存、取得、更新、削除できるため、Webアプリケーションでよく使われます。
たとえば、ユーザー登録機能やブログ記事の管理などでデータベースが利用されます。
MySQLの主な特徴
- 無料で利用できるオープンソースのデータベース
- 高速なデータ処理が可能
- PHPと組み合わせて使うことが多い
2. PHPでMySQLに接続する方法(mysqliとPDOの概要)
PHPからMySQLにデータを挿入するためには、まず「MySQLに接続する」必要があります。イメージとしては、PHPがMySQLというデータベースサーバーに電話をかけて、「今からデータを送ってもいい?」とつながりを確立するようなイメージです。
PHPでは、この接続を行う方法として mysqli と PDO の2種類がよく使われます。どちらも「データベースに接続する」「SQLを実行する」といった基本的なことは同じですが、書き方や対応しているデータベースに違いがあります。
mysqliとは?
mysqli(MySQL Improved)は、その名の通り「MySQL専用」の接続方法です。MySQLだけを使う小さめのWebアプリであれば、手軽に始められる定番の選択肢です。手続き型とオブジェクト指向の2つの書き方があり、PHPの入門書などでもよく登場します。
PDOとは?
PDO(PHP Data Objects)は、MySQLだけでなく、PostgreSQLやSQLiteなど複数のデータベースに対応した接続方法です。将来的に「別のデータベースに変えたい」「複数の種類を扱いたい」という場面でも、ほぼ同じ書き方で使えるのが強みです。また、例外(エラー)処理やプリペアドステートメントなど、セキュリティや保守性の面で便利な機能が揃っているのも特徴です。
mysqliとPDOの比較
| 特徴 | mysqli | PDO |
|---|---|---|
| 対応データベース | MySQLのみ | MySQL, PostgreSQL, SQLite など |
| セキュリティ | 適切な対策が必要 | SQLインジェクション対策が簡単 |
| コードの書きやすさ | シンプル | オブジェクト指向に統一されている |
PHPでMySQLに接続する基本の流れ
どちらの方法でも、接続の流れはだいたい共通しています。
- ① 接続先の情報(ホスト名・ユーザー名・パスワード・データベース名)を用意する
- ② 接続用のクラス(mysqli か PDO)を使って、MySQLに接続してみる
- ③ 接続に成功したかどうかを確認する(エラーが出ていないかチェック)
ここでは、最もシンプルな「接続してみるだけ」のサンプルをそれぞれ見ていきます。まずは「こういう雰囲気で書くんだな」というイメージが持てれば十分です。
mysqliを使った接続方法
<?php
$servername = "localhost"; // データベースサーバーの場所
$username = "root"; // ログインユーザー名
$password = ""; // パスワード(ローカル環境だと空のことも多い)
$dbname = "test_db"; // 使いたいデータベース名
// MySQLに接続(new mysqli で接続オブジェクトを作成)
$conn = new mysqli($servername, $username, $password, $dbname);
// 接続確認(エラーがあればメッセージを出して終了)
if ($conn->connect_error) {
die("接続失敗: " . $conn->connect_error);
}
// ここまで来れば接続成功
echo "mysqliでMySQLに接続できました!";
// 最後に接続を閉じる
$conn->close();
?>
このサンプルでは、$servername・$username・$password・$dbname に接続情報を入れ、それを使って new mysqli(...) で接続しています。connect_error を確認することで、「接続に失敗していないか」をチェックしています。
PDOを使った接続方法
<?php
$dsn = "mysql:host=localhost;dbname=test_db;charset=utf8"; // 接続先をまとめた文字列(DSN)
$username = "root"; // ログインユーザー名
$password = ""; // パスワード
try {
// PDOオブジェクトを作成して接続
$pdo = new PDO($dsn, $username, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // エラー時に例外を投げる設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC // 取得結果の形式(連想配列)
]);
echo "PDOでMySQLに接続できました!";
} catch (PDOException $e) {
// 接続に失敗した場合はここに来る
echo "接続失敗: " . $e->getMessage();
}
?>
PDOでは、$dsn という1つの文字列の中に「ホスト名」「データベース名」「文字コード」などをまとめて指定します。try〜catch を使うことで、接続に失敗したときのエラーメッセージをわかりやすく表示できます。
どちらの方法を使っても、PHPからMySQLに接続してSQLを実行できるようになります。このあと、実際にINSERT文を使ってデータを挿入する手順に進んでいきますが、まずは「PHPとMySQLはこんな書き方でつながるんだ」というイメージをつかんでおきましょう。
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開発に必要なスキルはこれからどんどん広がっていきますよ!」