ここまでのPHPスクリプトには,データベース接続,HTML出力時のエスケープ,ログイン状態の確認など,同じような処理が繰り返し出てきました。ここで common/common.php を作成し,共通処理を1か所にまとめます。
source_common/common/common.php
<?php
// common/common.php
// 第5章後半で使用する共通処理ファイル
$dsn = 'mysql:host=localhost;dbname=challenge;charset=utf8mb4';
$user = 'root';
$password = '';
try {
$dbh = new PDO($dsn, $user, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
} catch (PDOException $e) {
exit('データベース接続に失敗しました。');
}
function h($value): string
{
return htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8');
}
function login_check(): array
{
global $dbh;
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
if (!isset($_SESSION['id'], $_SESSION['time'])) {
header('Location: index.php');
exit();
}
if ($_SESSION['time'] + 3600 <= time()) {
header('Location: logout.php');
exit();
}
$_SESSION['time'] = time();
$sql = 'SELECT * FROM member WHERE id = :id';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':id', (int)$_SESSION['id'], PDO::PARAM_INT);
$stmt->execute();
$member = $stmt->fetch();
if (!$member) {
header('Location: logout.php');
exit();
}
return $member;
}
function get_admin_id(string $admin_name = 'admin'): ?int
{
global $dbh;
$sql = 'SELECT id FROM member WHERE name = :name';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':name', $admin_name, PDO::PARAM_STR);
$stmt->execute();
$admin = $stmt->fetch();
return $admin ? (int)$admin['id'] : null;
}
function is_admin(array $member, string $admin_name = 'admin'): bool
{
$admin_id = get_admin_id($admin_name);
return $admin_id !== null && (int)$member['id'] === $admin_id;
}
これまでの各PHPファイル先頭部は,次のように dbconnect.php を読み込んでいました。
require_once __DIR__ . '/dbconnect.php';
common/common.php 作成後は,次のように書き換えます。
require_once __DIR__ . '/common/common.php';
また,各ページに直接書いていたログイン確認処理は,次の1行に置き換えます。
$member = login_check();
これにより,セッションの有効期限やログイン中ユーザーの取得方法を変更したい場合でも,common/common.php だけを修正すればよくなります。
common フォルダ内には,次の .htaccess を置いて,ブラウザから common.php へ直接アクセスされないようにします。
source_common/common/.htaccess
<Files "common.php">
Require all denied
</Files>