PHP の MySQL 接続の基本(mysqli, PDO)を完全解説!初心者向けガイド
新人
「PHPでMySQLに接続したいのですが、どのようにすればいいですか?」
先輩
「PHPでMySQLに接続するには、主に2つの方法があります。1つはmysqliを使う方法、もう1つはPDOを使う方法です。」
新人
「mysqliとPDOって、どう違うんですか?」
先輩
「どちらもMySQLに接続するための方法ですが、PDOの方がより汎用的でセキュリティが強化されています。詳しく見ていきましょう。」
1. MySQLとは?
MySQL(マイ・エスキューエル)は、世界中のWebサービスで使われている代表的な「データベース管理システム(DBMS)」です。ざっくり言うと、たくさんのデータを整理してしまっておける専用のソフトウェアで、「PHPから情報を読み書きするための保管庫」のような役割を持っています。
ここでいうデータベースとは、ユーザー情報や商品情報、ブログ記事、問い合わせフォームの内容など、Webサイトの裏側で扱うあらゆるデータをきちんと整理して保存しておく場所のことです。手元のノートにメモを書く代わりに、MySQLという箱の中にデータを書き込むイメージを持つと分かりやすいかもしれません。
MySQLはどんな場面で使われている?
MySQLは、PHPと組み合わせて使われることがとても多く、「PHP+MySQL」で動いているWebサイトはたくさんあります。例えば次のような場面です。
- 会員制サイトのログイン情報(メールアドレスやパスワードなど)を保存する。
- ブログの記事タイトルや本文、投稿日を保存しておき、一覧画面や詳細ページで表示する。
- ネットショップの商品名・価格・在庫数を記録しておき、画面に一覧表示する。
- お問い合わせフォームから送られてきた内容を蓄積しておき、あとから確認できるようにする。
このように、MySQLは「人が入力した情報」や「システムが扱うデータ」を長期間安全に保管し、必要なときにPHPから取り出せるようにしてくれます。
表(テーブル)でデータを管理するイメージ
MySQLの中では、データは「テーブル」と呼ばれる表形式で管理されます。行と列を持つ表で、Excelのシートを思い浮かべるとイメージしやすいです。例えば、会員情報を管理するテーブルは次のような感じになります。
id | name | email
----------------------------------
1 | 山田太郎 | taro@example.com
2 | 佐藤花子 | hanako@example.com
このように「id」「name」「email」といった項目(列)を決めておき、その中に1件ずつ会員データ(行)を追加していきます。PHPからは、このテーブルに対して「データを追加する」「特定の人だけを検索する」といった操作を行うことになります。
MySQLの特徴
- 無料で利用できるオープンソースのデータベースで、個人開発から商用サービスまで幅広く使われている。
- 世界的に利用者が多く、PHPとの相性も良いため、情報やサンプルコードがインターネット上に豊富にある。
- 大量のデータを扱う処理でも、高速に検索・追加・更新・削除ができるように設計されている。
初心者向けのイメージをまとめると
プログラミングが初めての方は、「MySQL = Webサイトのための大きな表がたくさん入ったデータの倉庫」と考えてみてください。そしてPHPは、その倉庫に対して「この人のデータをちょうだい」「この商品を新しく追加して」とお願いする役割を持っています。
この段階では、「PHPで動くWebサイトの裏側には、MySQLというデータベースがあり、そこに大切なデータが保存されている」というイメージが持てていれば十分です。次の章では、このMySQLにPHPから実際に接続する具体的な方法を見ていきます。
2. PHPでMySQLに接続する方法(mysqliとPDOの概要)
PHPでは、MySQLに接続するための方法としてmysqliとPDOの2つがあります。
mysqliとは?
mysqli(MySQL Improved)は、MySQL専用の拡張機能で、PHPとMySQLを接続するために使用されます。
特徴:
- MySQL専用なので、他のデータベースには対応していない。
- 手軽に使えるが、セキュリティ対策を適切に行う必要がある。
- オブジェクト指向と手続き型の両方の書き方ができる。
PDOとは?
PDO(PHP Data Objects)は、データベース接続のための抽象レイヤーで、MySQLだけでなく、他のデータベース(PostgreSQLやSQLiteなど)にも対応しています。
特徴:
- 複数のデータベースに対応している。
- セキュリティが強化されており、SQLインジェクション対策がしやすい。
- オブジェクト指向の書き方ができ、コードの可読性が向上する。
mysqliとPDOの比較
| 特徴 | mysqli | PDO |
|---|---|---|
| 対応データベース | MySQLのみ | MySQL、PostgreSQL、SQLiteなど多数 |
| オブジェクト指向対応 | ○(手続き型も可) | ○(オブジェクト指向のみ) |
| セキュリティ | 適切な対策が必要 | SQLインジェクション対策がしやすい |
| 可読性 | やや低い | 高い |
3. mysqliを使ったMySQL接続の方法
mysqliを使うことで、PHPからMySQLに接続し、データベースを操作することができます。まずは、基本的な接続方法を見てみましょう。
mysqliを使った基本的な接続方法
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "sample_db";
// MySQLに接続
$conn = new mysqli($servername, $username, $password, $dbname);
// 接続を確認
if ($conn->connect_error) {
die("接続失敗: " . $conn->connect_error);
}
echo "接続成功";
?>
このコードでは、new mysqli()を使ってMySQLに接続しています。接続が成功すると「接続成功」と表示されます。
データを取得する方法
<?php
$sql = "SELECT id, name FROM users";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"] . " - 名前: " . $row["name"] . "<br>";
}
} else {
echo "データがありません";
}
$conn->close();
?>
このコードは、SELECT文を使ってデータベースからデータを取得し、画面に表示する処理です。
4. PDOを使ったMySQL接続の方法
PDO(PHP Data Objects)は、複数のデータベースに対応した汎用的なデータベース接続方法です。MySQL以外のデータベースにも接続できるのが特徴です。
PDOを使った基本的な接続方法
<?php
$dsn = "mysql:host=localhost;dbname=sample_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();
}
?>
このコードでは、new PDO()を使ってMySQLに接続し、エラーハンドリングを行っています。
データを取得する方法
<?php
$sql = "SELECT id, name FROM users";
$stmt = $pdo->query($sql);
foreach ($stmt as $row) {
echo "ID: " . $row["id"] . " - 名前: " . $row["name"] . "<br>";
}
?>
このコードでは、query()メソッドを使ってデータを取得し、ループで表示しています。
5. mysqliとPDOの違い(どちらを選ぶべきか)
mysqliとPDOはどちらもMySQLに接続できますが、それぞれの特徴が異なります。
mysqliの特徴
- MySQL専用で動作する。
- 手続き型とオブジェクト指向の両方の書き方ができる。
- 他のデータベースには対応していない。
PDOの特徴
- MySQL以外にもPostgreSQLやSQLiteなどに対応している。
- オブジェクト指向で統一された書き方ができる。
- セキュリティ対策がしやすい(プリペアドステートメントの利用)。
どちらを選ぶべきか?
| 条件 | mysqli | PDO |
|---|---|---|
| MySQL専用で十分か | ○ | △(他のDB対応不要なら不要) |
| 他のデータベースにも接続したいか | × | ○ |
| セキュリティを重視したいか | △(SQLインジェクション対策が必要) | ○(プリペアドステートメントが標準対応) |
| オブジェクト指向で書きたいか | ○ | ○ |
MySQLだけを扱うならmysqliでも問題ありませんが、セキュリティや汎用性を考えるとPDOの方が推奨されます。
6. MySQL接続時のエラーハンドリング(接続エラーの対処法)
MySQLに接続する際、正しく接続できない場合にエラーメッセージを適切に処理することが重要です。エラーハンドリングを適切に実装しないと、問題が発生したときに原因が分かりにくくなります。
mysqliでのエラーハンドリング
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "sample_db";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("接続失敗: " . $conn->connect_error);
}
echo "接続成功";
?>
$conn->connect_errorを使用することで、接続エラーが発生した場合にエラーメッセージを表示できます。
PDOでのエラーハンドリング
<?php
$dsn = "mysql:host=localhost;dbname=sample_db;charset=utf8";
$username = "root";
$password = "";
try {
$pdo = new PDO($dsn, $username, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
echo "接続成功";
} catch (PDOException $e) {
echo "接続失敗: " . $e->getMessage();
}
?>
PDOでは、try-catch構文を使ってエラーをキャッチし、適切な処理を行うことができます。
7. 安全なデータ操作(SQLインジェクション対策)
SQLインジェクションとは、悪意のあるユーザーがデータベースを操作し、不正なデータを挿入したり、データを盗んだりする攻撃手法です。適切な対策をしないと、深刻なセキュリティ問題につながります。
SQLインジェクションの危険な例(mysqli)
<?php
$conn = new mysqli("localhost", "root", "", "sample_db");
$username = $_GET["username"];
$password = $_GET["password"];
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "ログイン成功";
} else {
echo "ログイン失敗";
}
?>
上記のコードは、直接ユーザー入力をSQL文に埋め込んでいるため、SQLインジェクションのリスクがあります。
SQLインジェクションを防ぐ方法(mysqli)
プレースホルダーを使用することで、SQLインジェクションを防ぐことができます。
<?php
$conn = new mysqli("localhost", "root", "", "sample_db");
$username = $_GET["username"];
$password = $_GET["password"];
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
echo "ログイン成功";
} else {
echo "ログイン失敗";
}
?>
SQLインジェクションを防ぐ方法(PDO)
<?php
$pdo = new PDO("mysql:host=localhost;dbname=sample_db;charset=utf8", "root", "", [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
$username = $_GET["username"];
$password = $_GET["password"];
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->bindParam(":username", $username, PDO::PARAM_STR);
$stmt->bindParam(":password", $password, PDO::PARAM_STR);
$stmt->execute();
if ($stmt->rowCount() > 0) {
echo "ログイン成功";
} else {
echo "ログイン失敗";
}
?>
PDOでは、bindParam()を使うことで、SQLインジェクションのリスクを軽減できます。
8. まとめとおすすめの使い方
この記事では、PHPでMySQLに接続する方法として、mysqliとPDOを紹介しました。それぞれのメリット・デメリットを理解し、適切に使い分けることが重要です。
mysqliを使うべきケース
- MySQLのみを使用する場合。
- シンプルなデータベース操作を行う場合。
PDOを使うべきケース
- 複数のデータベースに対応させたい場合。
- セキュリティを重視する場合(SQLインジェクション対策)。
- オブジェクト指向のコードを利用したい場合。
おすすめの使い方
初心者のうちは、まずmysqliを使って基本的なデータベース接続を学び、その後PDOに移行するのが良いでしょう。特に、セキュリティを重視する場面ではPDOの使用が推奨されます。
また、データベースを扱う際は、必ずエラーハンドリングを実装し、SQLインジェクションの対策を忘れずに行いましょう。
まとめ
PHPでMySQLに接続する方法には、mysqliとPDOの2つがあり、それぞれ特徴が異なります。mysqliはMySQL専用で、手続き型とオブジェクト指向の両方の書き方に対応しており、比較的シンプルな構成が魅力です。一方、PDOは複数のデータベースに対応し、オブジェクト指向に統一されていて、セキュリティ面で優れています。
実際の開発現場では、将来的な拡張性やセキュリティを重視してPDOを採用するケースが多く、特にSQLインジェクション対策としてのプレースホルダーの活用が非常に重要です。今回の記事では、接続の基本からデータの取得方法、エラーハンドリング、セキュリティ対策まで実践的に学びました。
以下は、PDOでログイン処理を安全に実装する例です。
<?php
$pdo = new PDO("mysql:host=localhost;dbname=sample_db;charset=utf8", "root", "", [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
$username = $_POST["username"];
$password = $_POST["password"];
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->bindParam(":username", $username, PDO::PARAM_STR);
$stmt->bindParam(":password", $password, PDO::PARAM_STR);
$stmt->execute();
if ($stmt->rowCount() > 0) {
echo "ログイン成功";
} else {
echo "ログイン失敗";
}
?>
このようにprepareとbindParamを活用することで、ユーザー入力による不正アクセスを防ぐことができます。
今後の開発では、セキュリティに配慮した実装が求められるため、エラー処理やSQLインジェクション対策は習慣として身につけておくと良いでしょう。また、コードの可読性や保守性を高めるためにも、PDOによる実装を基本として覚えておくことをおすすめします。
データベース接続はWebアプリケーションの根幹を支える重要な要素です。基礎をしっかりと理解し、安全で拡張性の高い実装を目指しましょう。
新人
「この記事で、PHPでMySQLに接続する方法がよくわかりました!mysqliとPDOの違いもはっきりしました。」
先輩
「うん、それぞれの特徴と使い分けが重要だね。特にセキュリティを考えるならPDOがおすすめだよ。」
新人
「プレースホルダーやbindParamを使うことで、SQLインジェクションを防げるんですね。」
先輩
「そう。安全なコードを書くのがエンジニアとしての基本だから、これからも意識して書いていこう!」
新人
「はい、mysqliも理解した上で、今後はPDOを中心に使ってみます!」