記事内にはプロモーションが含まれています

【PHP】データベース接続の基本!PDOを使ったMySQL/PostgreSQLへの接続方法

【PHP】データベース接続の基本!PDOを使ったMySQL/PostgreSQLへの接続方法 PHP

Webアプリケーション開発において、ユーザー情報や商品データなどを管理するために「データベース」との連携は欠かせません。

PHPからデータベースを操作するためには、まず「接続」という手順を踏む必要がありますが、初心者の方にとっては最初の難関となることも多いでしょう。

「PDOって何?mysqliとどっちを使えばいいの?」
「接続しようとするとエラー画面になってしまう」
「MySQLだけでなくPostgreSQLにも繋ぎたい」

このような疑問や悩みを解決するために、この記事ではPHPの標準的なデータベース接続方法である「PDO」の使い方を徹底解説します。

基本の接続コードから、実務で必須となるオプション設定、接続できない時のトラブルシューティングまで、サンプルコード付きで分かりやすく紹介します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はこじんまりとしたプログラミングスクールを運営
  • モットーは「利他の精神」

なぜPHPのデータベース接続には「PDO」が推奨されるのか

PHPでデータベースに接続する方法には、大きく分けて「mysqli」と「PDO」の2種類があります。

結論から言うと、現代のPHP開発では「PDO(PHP Data Objects)」を使うのが推奨されています。

PDOを使う最大のメリットは、「データベースの種類を問わず、同じコードの書き方で操作できる」 という点です。

例えば、開発途中でデータベースをMySQLからPostgreSQLに変更することになっても、PDOを使っていれば接続設定(DSN)を少し書き換えるだけで対応できます。

一方でmysqliはMySQL専用であるため、コードを大幅に書き直す必要が出てきます。

汎用性が高く、オブジェクト指向で扱いやすいPDOをマスターすることが、PHPエンジニアへの近道と言えるでしょう。

【MySQL編】PDOを使ってデータベースに接続する基本コード

まずは、最も利用頻度の高いMySQL(MariaDB)への接続方法を見ていきましょう。

接続に必要な情報は「ホスト名」「データベース名」「ユーザー名」「パスワード」の4つです。

基本的な接続スクリプト

<?php
// 接続設定
$dsn = 'mysql:dbname=my_database;host=localhost;charset=utf8mb4';
$user = 'db_user';
$password = 'password123';

try {
    // データベースへの接続
    $dbh = new PDO($dsn, $user, $password);
    
    echo "データベースへの接続に成功しました。\n";
    
    // ここでクエリの実行などを行う
    
    // 接続を閉じる(変数を空にするか、スクリプト終了で自動切断)
    $dbh = null;
    
} catch (PDOException $e) {
    // 接続失敗時の処理
    // ※本番環境ではエラー内容をユーザーに表示しないように注意!
    echo "接続エラーが発生しました。";
    
    // 開発環境でのデバッグ用(本番ではログに記録するだけに留める)
    // echo "詳細: " . $e->getMessage();
    
    exit();
}
?>

実行結果

データベースへの接続に成功しました。

$dsn(Data Source Name)
接続先のデータベース情報をひとまとめにした文字列です。
mysql:dbname=データベース名;host=ホスト名;charset=文字コード の形式で記述します。
文字コードはセキュリティ対策(SQLインジェクション対策)の観点から、必ずここで utf8mb4 を指定するようにしましょう。

new PDO(...)
PDOクラスのインスタンスを作成することで接続を開始します。
第一引数にDSN、第二引数にユーザー名、第三引数にパスワードを渡します。

try-catch 構文
データベース接続は、パスワード間違いやサーバーダウンなどで失敗する可能性があります。
そのため、必ず try-catch ブロックで囲み、例外(PDOException)をキャッチできるようにします。

【重要】
catch ブロック内で $e->getMessage() をそのまま画面に表示すると、データベースのユーザー名やホスト名などの内部情報が漏洩するリスクがあります。
本番環境では「接続エラーが発生しました」といった簡潔なメッセージのみを表示し、詳細はサーバーのエラーログに記録するようにしましょう。

実務で必須!安全・便利に使うための「オプション設定」

new PDO で接続する際、第四引数に「オプション配列」を渡すことで、PDOの挙動をカスタマイズできます。

デフォルトの設定ではエラーを無視したり、使いにくい形式でデータを取得したりするため、以下の設定を行うのが実務での定石です。

推奨されるオプション設定例

<?php
$dsn = 'mysql:dbname=my_database;host=localhost;charset=utf8mb4';
$user = 'db_user';
$password = 'password123';

// オプション設定
$options = [
    // エラー発生時に例外を投げる(必須)
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    // デフォルトのフェッチモードを連想配列にする
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    // プリペアドステートメントのエミュレーションを無効化する(セキュリティ向上)
    PDO::ATTR_EMULATE_PREPARES => false,
];

try {
    $dbh = new PDO($dsn, $user, $password, $options);
    echo "設定付きで接続成功!";
} catch (PDOException $e) {
    echo "接続エラーが発生しました。";
    // error_log($e->getMessage()); // ログに記録
}
?>

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
デフォルトではSQLエラーが発生しても沈黙してしまうことがあります。
これを設定することで、エラー時に必ず例外が発生し、try-catch で検知できるようになります。
(※PHP 8.0以降はデフォルトでこの設定になっていますが、コードの意図を明確にし、古いバージョンとの互換性を保つためにも明示的に記述することを推奨します)

PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
データを取得する際、デフォルトでは「数値添字配列」と「連想配列」の両方が返され、メモリが無駄になります。
PDO::FETCH_ASSOC を指定すれば、カラム名をキーとした連想配列だけを取得でき、扱いやすくなります。

PDO::ATTR_EMULATE_PREPARES => false
MySQLの場合、PDOはプリペアドステートメント(SQLの準備機能)を内部的にエミュレートする機能を持っていますが、これには稀にセキュリティリスクが存在します。
データベースネイティブの機能を使うために false に設定するのが推奨されます。

【PostgreSQL編】接続コードの違い

PostgreSQLに接続する場合も、コードの構造はMySQLとほとんど変わりません。
変わるのは DSN(Data Source Name)の書き方 だけです。

PostgreSQLへの接続スクリプト

<?php
// PostgreSQL用のDSN
// mysql: ではなく pgsql: になる
$dsn = 'pgsql:dbname=my_database;host=localhost;port=5432';
$user = 'postgres_user';
$password = 'password123';

try {
    $dbh = new PDO($dsn, $user, $password);
    echo "PostgreSQLへの接続成功!";
} catch (PDOException $e) {
    echo "接続エラーが発生しました。";
}
?>

DSNの先頭が pgsql: になっています。また、PostgreSQLではポート番号を指定することが多いため、port=5432 のように記述します(デフォルトの場合は省略可能)。 このように、接続文字列を変えるだけでデータベースを切り替えられるのがPDOの強みです。

データベースに接続できない(エラーになる)時のチェックリスト

コードは合っているはずなのに「接続できません」「SQLSTATE[…]」といったエラーが出る場合、以下のポイントを確認してみてください。

認証情報のミス

最も多い原因です。

ユーザー名、パスワード、データベース名にスペルミスはありませんか?
特に、本番環境と開発環境でパスワードが異なっているケースはよくあります。

ホスト名とポート番号

データベースが別のサーバーにある場合、localhost では繋がりません。
正しいIPアドレスやドメイン指定が必要です。

また、Docker環境やレンタルサーバーでは、ポート番号がデフォルト(MySQL: 3306, PostgreSQL: 5432)から変更されている場合があります。
その際はDSNに port=xxxx; を追加してください。

PDOドライバが有効になっていない

PHPの設定(php.ini)で、PDOの拡張モジュールが無効になっている可能性があります。

phpinfo() 関数を実行し、pdo_mysqlpdo_pgsql の項目が表示されているか確認しましょう。

もし表示されていなければ、php.iniの extension=pdo_mysql などの行のコメントアウト(;)を外して有効化する必要があります。

ソケット接続の問題(localhost vs 127.0.0.1)

Unix系のOS(MacやLinux)において、host=localhost と指定するとUNIXドメインソケットを使って接続しようとします。

もしソケットの設定がうまくいかない場合は、host=127.0.0.1 とIPアドレスで指定することで、TCP/IP経由での接続に切り替わり、うまくいくことがあります。

PHPのスキルを活かして年収を上げる方法

以上、PHPでPDOを使ったMySQL/PostgreSQLへの接続方法について解説してきました。

なお、PHPのスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

PHPエンジニアの需要は非常に高く求人数・案件数も多いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。

今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。

併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなPHPの案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。