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に接続する方法として 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アプリ開発の基本です。適切な方法を学び、安全なアプリケーションを作りましょう。