PHP の MySQL 接続の基本(mysqli, PDO)を完全解説!初心者向けガイド
新人
「PHPでMySQLに接続したいのですが、どのようにすればいいですか?」
先輩
「PHPでMySQLに接続するには、主に2つの方法があります。1つはmysqli
を使う方法、もう1つはPDO
を使う方法です。」
新人
「mysqli
とPDO
って、どう違うんですか?」
先輩
「どちらもMySQLに接続するための方法ですが、PDOの方がより汎用的でセキュリティが強化されています。詳しく見ていきましょう。」
1. MySQLとは?
MySQL(マイ・エスキューエル)は、世界中で広く使われているデータベース管理システム(DBMS)です。PHPと組み合わせることで、データの保存・取得・更新・削除を簡単に行うことができます。
例えば、Webサイトのユーザー情報やブログ記事のデータなどをMySQLに保存し、PHPでそれを操作することができます。
MySQLの特徴
- 無料で利用できるオープンソースのデータベース。
- 多くのWebアプリケーションで利用されている。
- 高速なデータ処理が可能。
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インジェクションの対策を忘れずに行いましょう。