🐕

PHPでPDOインスタンスを共有する際の注意点⚠️

2024/05/31に公開

PHPでPDOインスタンスをプロジェクト全体で共有する場合、各スクリプトでデータベース接続を明示的にクローズする処理を追加することが重要です。この記事では、PDOインスタンスを共有し、各ファイルで処理を行った後に接続を切る方法について説明します。

database.phpの作成

まず、データベース接続の設定を行うdatabase.phpファイルを作成します。

<?php
$dbName = getenv('DB_NAME');
$dbHost = getenv('DB_HOST');
$dbUser = getenv('DB_USER');
$dbPassword = getenv('DB_PASSWORD');
$dbPort = getenv('DB_PORT');
$dsn = "pgsql:dbname=$dbName;host=$dbHost;port=$dbPort";
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
try {
    $pdo = new PDO($dsn, $dbUser, $dbPassword, $options);
} catch (PDOException $e) {
    error_log("Connection failed: " . $e->getMessage());
    die('Database connection failed. Please contact the administrator.');
}
?>

各ファイルでの処理

次に、database.phpを読み込み、各ファイルでデータベース処理を行います。処理が終わったら、必ず接続をクローズする必要があります。以下は、user_edit.phpを例にした処理の流れです。

<?php
require_once("../classability/function/errorhtml.php");
require_once("../classability/function/function.php");
require_once("../function/function.php");
require_once("../classability/function/const.php");
require_once("../function/const.php");
require_once("../classability/function/database.php"); // 共有PDOインスタンスの読み込み

// ...

try {
    if (isset($_REQUEST['mode'])) {
        if ($_REQUEST['mode'] == 'input') {
            // 新規作成処理
            // ...
        } elseif ($_REQUEST['mode'] == 'update') {
            // 更新処理
            // ...
        } elseif ($_REQUEST['mode'] == 'delete') {
            // 削除処理
            // ...
        } elseif ($_REQUEST['mode'] == 'load') {
            // 編集前処理
            // ...
        }
    } else {
        // エラー処理
        // ...
    }
} catch (Exception $e) {
    echo 'An error occurred: ' . $e->getMessage();
} finally {
    // 接続を閉じる
    if (isset($pdo)) {
        $pdo = null;
        echo "Connection closed.";
    }
}
?>

ポイント

  • try-catch-finallyブロックを使用して、例外が発生しても確実に接続を閉じるようにします。
  • finallyブロックで、$pdoが存在する場合に$pdonullに設定して接続を閉じます。

これにより、各スクリプトでデータベース接続を開いた後、確実にクローズすることが保証され、接続数が増え続けることを防ぐことができます。

まとめ

PHPでPDOインスタンスを共有する場合、各スクリプトでデータベース接続を明示的にクローズすることが重要です。try-catch-finallyブロックを使用し、finallyブロックで接続を閉じる処理を追加することで、確実に接続を切ることができます。この方法を適用することで、プロジェクト全体でPDOインスタンスを安全に共有することができます。

Discussion