🐕
PHPでPDOインスタンスを共有する際の注意点⚠️
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
が存在する場合に$pdo
をnull
に設定して接続を閉じます。
これにより、各スクリプトでデータベース接続を開いた後、確実にクローズすることが保証され、接続数が増え続けることを防ぐことができます。
まとめ
PHPでPDOインスタンスを共有する場合、各スクリプトでデータベース接続を明示的にクローズすることが重要です。try-catch-finally
ブロックを使用し、finally
ブロックで接続を閉じる処理を追加することで、確実に接続を切ることができます。この方法を適用することで、プロジェクト全体でPDOインスタンスを安全に共有することができます。
Discussion