カテゴリ: PHP 更新日: 2026/01/28

PHP の MySQL 接続の基本(mysqli, PDO)を完全解説!初心者向けガイド

PHP の MySQL 接続の基本(mysqli, PDO)
PHP の MySQL 接続の基本(mysqli, PDO)

新人と先輩の会話形式で理解しよう

新人

「PHPでMySQLに接続したいのですが、どのようにすればいいですか?」

先輩

「PHPでMySQLに接続するには、主に2つの方法があります。1つはmysqliを使う方法、もう1つはPDOを使う方法です。」

新人

mysqliPDOって、どう違うんですか?」

先輩

「どちらもMySQLに接続するための方法ですが、PDOの方がより汎用的でセキュリティが強化されています。詳しく見ていきましょう。」

1. MySQLとは?

1. MySQLとは?
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の概要)

2. PHPでMySQLに接続する方法(mysqliとPDOの概要)
2. PHPでMySQLに接続する方法(mysqliとPDOの概要)

PHPでは、MySQLに接続するための手段として代表的に mysqliPDO の2種類が用意されています。同じ「データベースへつなぐ」という目的は共通ですが、考え方や対応できる範囲に違いがあるため、特徴を知っておくと後々の開発がスムーズになります。

mysqliとは?

mysqli(MySQL Improved)は、その名の通り “MySQL 専用” に設計された拡張機能です。PHPとMySQLを直接つなぐための仕組みで、長く使われてきたこともあり、比較的シンプルな書き方で使えるのが魅力です。

特徴をあらためて整理すると、次のようになります。

  • MySQL専用のため、ほかのデータベースには接続できない。
  • コード量が少なく済むため、最初の学習ステップとして理解しやすい。
  • 手続き型とオブジェクト指向、どちらの書き方にも対応している。

ただし、ユーザー入力をそのまま扱う場合はセキュリティ面で注意が必要です。後ほど解説する「プリペアドステートメント」をきちんと使うことが重要になります。

PDOとは?

PDO(PHP Data Objects)は、複数のデータベースを共通の書き方で扱うために作られた抽象レイヤーです。MySQLに限らず、PostgreSQL、SQLiteといった異なるデータベースにも同じ手順で接続できるため、プロジェクトが大きくなったときに恩恵が大きくなります。

主な特徴は次のとおりです。

  • MySQL以外の多くのデータベースに対応している。
  • オブジェクト指向で統一された書き方のため、コードが読みやすく、後々のメンテナンスにも強い。
  • プリペアドステートメントが標準で利用でき、SQLインジェクション対策がしやすい。

特にセキュリティ面の扱いやすさから、実務ではPDOを採用する場面が増えています。

mysqliとPDOの比較

両者の違いをまとめると、次の表のようになります。どちらにも利点がありますが、将来的に別のデータベースを扱う可能性がある場合や、安全な実装を優先したい場合はPDOが選ばれることが多いです。

特徴 mysqli PDO
対応データベース MySQLのみ MySQL、PostgreSQL、SQLite など多数
オブジェクト指向対応 ○(手続き型も可) ○(オブジェクト指向のみ)
セキュリティ 適切な対策が必要 SQLインジェクション対策がしやすい
可読性 やや低い 高い

3. mysqliを使ったMySQL接続の方法

3. mysqliを使ったMySQL接続の方法
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接続の方法

4. PDOを使ったMySQL接続の方法
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の違い(どちらを選ぶべきか)

5. mysqliとPDOの違い(どちらを選ぶべきか)
5. mysqliとPDOの違い(どちらを選ぶべきか)

mysqliとPDOはどちらもMySQLに接続できますが、それぞれの特徴が異なります。

mysqliの特徴

  • MySQL専用で動作する。
  • 手続き型とオブジェクト指向の両方の書き方ができる。
  • 他のデータベースには対応していない。

PDOの特徴

  • MySQL以外にもPostgreSQLやSQLiteなどに対応している。
  • オブジェクト指向で統一された書き方ができる。
  • セキュリティ対策がしやすい(プリペアドステートメントの利用)。

どちらを選ぶべきか?

条件 mysqli PDO
MySQL専用で十分か △(他のDB対応不要なら不要)
他のデータベースにも接続したいか ×
セキュリティを重視したいか △(SQLインジェクション対策が必要) ○(プリペアドステートメントが標準対応)
オブジェクト指向で書きたいか

MySQLだけを扱うならmysqliでも問題ありませんが、セキュリティや汎用性を考えるとPDOの方が推奨されます。

6. MySQL接続時のエラーハンドリング(接続エラーの対処法)

6. MySQL接続時のエラーハンドリング(接続エラーの対処法)
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インジェクション対策)

7. 安全なデータ操作(SQLインジェクション対策)
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. まとめとおすすめの使い方

8. まとめとおすすめの使い方
8. まとめとおすすめの使い方

この記事では、PHPでMySQLに接続する方法として、mysqliPDOを紹介しました。それぞれのメリット・デメリットを理解し、適切に使い分けることが重要です。

mysqliを使うべきケース

  • MySQLのみを使用する場合。
  • シンプルなデータベース操作を行う場合。

PDOを使うべきケース

  • 複数のデータベースに対応させたい場合。
  • セキュリティを重視する場合(SQLインジェクション対策)。
  • オブジェクト指向のコードを利用したい場合。

おすすめの使い方

初心者のうちは、まずmysqliを使って基本的なデータベース接続を学び、その後PDOに移行するのが良いでしょう。特に、セキュリティを重視する場面ではPDOの使用が推奨されます。

また、データベースを扱う際は、必ずエラーハンドリングを実装し、SQLインジェクションの対策を忘れずに行いましょう。

まとめ

まとめ
まとめ

PHPでMySQLに接続する方法には、mysqliPDOの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 "ログイン失敗";
}
?>

このようにpreparebindParamを活用することで、ユーザー入力による不正アクセスを防ぐことができます。

今後の開発では、セキュリティに配慮した実装が求められるため、エラー処理やSQLインジェクション対策は習慣として身につけておくと良いでしょう。また、コードの可読性や保守性を高めるためにも、PDOによる実装を基本として覚えておくことをおすすめします。

データベース接続はWebアプリケーションの根幹を支える重要な要素です。基礎をしっかりと理解し、安全で拡張性の高い実装を目指しましょう。

先生と生徒の振り返り会話

新人

「この記事で、PHPでMySQLに接続する方法がよくわかりました!mysqliとPDOの違いもはっきりしました。」

先輩

「うん、それぞれの特徴と使い分けが重要だね。特にセキュリティを考えるならPDOがおすすめだよ。」

新人

「プレースホルダーやbindParamを使うことで、SQLインジェクションを防げるんですね。」

先輩

「そう。安全なコードを書くのがエンジニアとしての基本だから、これからも意識して書いていこう!」

新人

「はい、mysqliも理解した上で、今後はPDOを中心に使ってみます!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

PHPでMySQLに接続するにはmysqliとPDOどちらを使えばいいですか?

MySQLのみを使うならmysqliでも問題ありませんが、複数のデータベース対応やセキュリティを重視するならPDOがおすすめです。

mysqliとPDOの違いがよくわかりません。どちらが安全ですか?

PDOはSQLインジェクション対策がしやすく、安全性の面でも優れています。セキュリティを重視するならPDOを選びましょう。
コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

関連記事:
カテゴリの一覧へ
新着記事
New1
Python
Pythonのtimedeltaで日付の加算・減算をしよう!初心者でもわかる時間操作の基本
New2
Python
Pythonのカスタム例外を作成する方法を完全解説!初心者でもわかる独自のExceptionクラス入門
New3
PHP
PHP の型変換を完全ガイド!初心者でもわかる明示的変換・自動変換
New4
PHP
PHPの真偽値と条件判定をやさしく解説!初心者でもわかるempty・isset・is_nullの使い方
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonのfinally文を徹底解説!例外発生時でも実行される処理の書き方と使い方
No.2
Java&Spring記事人気No2
Python
Pythonで辞書のネスト構造(入れ子辞書)を扱う方法 初心者向け完全ガイド
No.3
Java&Spring記事人気No3
Python
Pythonの書き方を基本から解説!はじめてのPythonプログラム
No.4
Java&Spring記事人気No4
Python
Pythonで文字列が数値か判定する方法!isdigit()・isnumeric()の違い
No.5
Java&Spring記事人気No5
PHP
初心者向けPHP の MySQL のデータを更新する方法(UPDATE 文)完全ガイド
No.6
Java&Spring記事人気No6
PHP
PHP の MySQL 接続の基本(mysqli, PDO)を完全解説!初心者向けガイド
No.7
Java&Spring記事人気No7
PHP
PHPの可変長引数(...$args)の使い方を完全ガイド!初心者でもわかる基本と活用方法
No.8
Java&Spring記事人気No8
Python
Pythonのコンストラクタ(__init__)の使い方!初心者でもわかるオブジェクトの初期化