教材管理システム


learning.php では教材ファイルのアップロードと一覧表示を行います。アップロードされたファイル名はそのまま保存ファイル名に使わず,date()random_bytes() で作成した名前に変換して保存します。

source_dbconnect/learning.php

<?php
// learning.php: 教材管理
session_start();
require_once __DIR__ . '/dbconnect.php';
function h($value): string
{
    return htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8');
}

// ログイン状態を確認する
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();
}


if (!empty($_FILES['learning_file']['name'])) {
    $original = basename($_FILES['learning_file']['name']);
    $ext = pathinfo($original, PATHINFO_EXTENSION);
    $save_name = date('YmdHis') . '_' . bin2hex(random_bytes(4)) . ($ext ? '.' . $ext : '');
    move_uploaded_file($_FILES['learning_file']['tmp_name'], __DIR__ . '/learning_folder/' . $save_name);

    $sql = 'INSERT INTO learning (name, file, change_name, modified) VALUES (:name, :file, :change_name, NOW())';
    $stmt = $dbh->prepare($sql);
    $stmt->bindValue(':name', $_POST['name'], PDO::PARAM_STR);
    $stmt->bindValue(':file', $original, PDO::PARAM_STR);
    $stmt->bindValue(':change_name', $save_name, PDO::PARAM_STR);
    $stmt->execute();
    header('Location: learning.php');
    exit();
}

$sql = 'SELECT * FROM learning ORDER BY modified DESC';
$stmt = $dbh->query($sql);
$learnings = $stmt->fetchAll();
?>
<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8"><title>教材管理</title></head>
<body>
<h1>教材管理</h1>
<form action="" method="post" enctype="multipart/form-data">
    <p>教材名:<input type="text" name="name" required></p>
    <p>ファイル:<input type="file" name="learning_file" required></p>
    <p><input type="submit" value="アップロード"></p>
</form>
<table border="1">
<tr><th>教材名</th><th>ファイル</th><th>登録日時</th><th>操作</th></tr>
<?php foreach ($learnings as $learning): ?>
<tr>
<td><?php echo h($learning['name']); ?></td>
<td><a href="learning_folder/<?php echo h($learning['change_name']); ?>"><?php echo h($learning['file']); ?></a></td>
<td><?php echo h($learning['modified']); ?></td>
<td><a href="delete.php?id=<?php echo (int)$learning['id']; ?>">削除</a></td>
</tr>
<?php endforeach; ?>
</table>
<p><a href="top_page.php">トップページへ戻る</a></p>
</body>
</html>

教材一覧の取得では $dbh->query() を使っています。利用者から受け取った値をSQL条件に入れる場合は,この後のページのように prepare() を使います。


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