共通する機能をまとめる


ここまでの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スクリプトの書き換え

これまでの各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.phpの直接アクセス制限

common フォルダ内には,次の .htaccess を置いて,ブラウザから common.php へ直接アクセスされないようにします。

source_common/common/.htaccess

<Files "common.php">
    Require all denied
</Files>

Copyright (c) 2014-2026 T.Kouya Laboratory @ Otemon Gakuin University. All rights reserved.