目次

【6日でできるPHP入門】アプリを作成する

 近年、PHPとMySQLを組み合わせたWebシステム開発は非常に一般的です。中でも「社員情報管理アプリ」のような基本CRUD(Create, Read, Update, Delete)機能を持つ管理システムは、実務でも頻出します。本記事では、PHPとMySQLを使って社員情報を管理するアプリケーションを、一から段階的に作成していきます。


1.社員情報管理アプリを作ろう ~設計と準備~

1.1. システムの概要と目的

「社員情報管理アプリ」は、以下のような機能を持ちます。

機能概要
一覧表示(Read)全社員の情報(社員番号・氏名・部署・役職)を一覧表示します。
新規登録(Create)社員の新規登録ができます。
更新(Update)既存社員の情報を編集できます。
削除(Delete)登録済み社員の情報を削除できます。

 こうしたシステムの構造や機能を学ぶことで、Webアプリケーション開発の基礎力を身につけることができます。

1.2. システムの設計

今回作成するアプリのファイル構成は以下のとおりです。

ファイル名内容
index.php社員一覧画面(トップ)
employee_input.php社員新規登録フォーム
employee_edit.php社員編集・削除選択画面
employee_update.php社員情報更新フォーム
employee_delete.php社員削除確認画面
post_data.phpデータ登録・更新・削除処理
common.php共通設定・初期化処理
common/data_check.php入力値チェック関数
common/dbmanager.phpデータベース操作クラス
common/html_functions.phpHTML共通出力関数

社員情報はMySQLデータベース「company」の「employee」テーブルに保存されます。

1.3. データベースとテーブルの設計

テーブル設計

社員情報を保存するemployeeテーブルの構成は下記のとおりです。

カラム名データ型意味制約
idINT社員番号PRIMARY KEY
nameVARCHAR(128)氏名NOT NULL
departmentVARCHAR(64)部署
positionVARCHAR(64)役職

テーブル作成SQL

それでは、はじめに、データベースを作成してテーブルを作成します。

デフォルトのデータベース:USE company;

 テーブルを操作するときは、通常「データベース名.テーブル名」という書式でテーブルを指定する必要があります。デフォルトのデータベースを指定することで、デフォルトデータベースに指定されたテーブルを操作する場合は、データベース名を省略することができるようになります。

 MySQLでは複数のデータベースが存在するため、USEでデフォルトデータベースを指定しておくと、SQLクエリを短くすることができるため、SQLを簡潔に書けるようになります。

SQLクエリの実行

phpMyAdmin「クエリボックス」に以下のSQLクエリを入力して「実行」ボタンをクリックします。

CREATE DATABASE IF NOT EXISTS company;
USE company;

CREATE TABLE employee (
  id INT PRIMARY KEY,
  name VARCHAR(128) NOT NULL,
  department VARCHAR(64),
  position VARCHAR(64)
);

-- 初期データ追加例
INSERT INTO employee (id, name, department, position) VALUES
  (1001, '佐藤健太', '営業', '主任'),
  (1002, '山田花子', '開発', 'エンジニア'),
  (1003, '鈴木一郎', '総務', 'マネージャー');
テーブルの確認

「クエリボックス」に以下のSQLクエリを入力して「実行」ボタンをクリックします。

SELECT * FROM company.employee;

実行結果

設定時のポイント

  • id(社員番号)は重複を避けるため主キー(PRIMARY KEY)に設定
  • 名前は必須(NOT NULL)、部署・役職は空でも可
  • 事前に company データベースと employee テーブルを作成しておく

1.4. 開発環境の準備

必要なもの

  • PHP(7.x以降推奨)
  • MySQL(8.0または5.7以降推奨)
  • 任意のWebサーバ(Apacheなど。MAMP/XAMPPでもOK)

ディレクトリ構成

company_app/
├── common/
│   ├── data_check.php
│   ├── dbmanager.php
│   └── html_functions.php
├── common.php
├── index.php
├── post_data.php
├── employee_delete.php
├── employee_edit.php
├── employee_input.php
└── employee_update.php


2.社員情報管理アプリの画面設計とページ遷移

2.1. 画面の全体構成とページ遷移

この「社員情報管理アプリ」では、以下のような画面とページ遷移を設計します。

画面名主な役割URL例
社員一覧画面社員全員の情報一覧を表示し、新規登録や編集・削除に遷移できるindex.php
新規登録画面社員情報の新規登録フォーム。登録後、一覧にリダイレクトemployee_input.php
編集・削除選択画面特定社員の詳細表示と「編集」「削除」ボタン。どちらかに遷移employee_edit.php?id=1001
情報更新画面社員情報の更新フォーム。更新後、一覧にリダイレクトemployee_update.php?id=1001
削除確認画面社員情報の削除確認。確定後、一覧にリダイレクトemployee_delete.php?id=1001
データ処理用新規登録・編集・削除のバックエンド処理。成功/失敗時にリダイレクトpost_data.php

2.2. 各画面の設計と概要

2.2.1 社員一覧画面(index.php)

  • 目的:登録済みの全社員の情報を一覧表示。
  • 各社員の名前は「編集・削除」選択画面へのリンクになる。
  • 「新規登録」ボタンから新規登録画面に遷移。

画面イメージ例

社員番号氏名部署役職
1001佐藤健太営業主任
1002山田花子開発エンジニア
1003鈴木一郎総務マネージャー
[新しい社員の登録]

2.2.2. 社員新規登録画面(employee_input.php)

  • 目的:新しい社員情報の入力フォーム
  • 入力内容を送信するとpost_data.phpで登録処理後、一覧画面に戻る
  • 不正な入力やエラー時にはメッセージ表示

入力項目

  • 社員番号(4桁の数字)
  • 氏名
  • 部署
  • 役職

2.2.3. 編集・削除選択画面(employee_edit.php)

  • 目的:社員個別情報の表示と「編集」「削除」どちらかを選ぶ
  • 各社員の詳細表示。
  • [編集][削除]ボタンで該当ページへ

2.2.4. 情報更新画面(employee_update.php)

  • 目的:社員情報の修正フォーム
  • 既存データを初期値としてフォーム表示、編集後送信するとpost_data.phpで更新処理

2.2.5 削除確認画面(employee_delete.php)

  • 目的:本当に削除してよいかの最終確認
  • 「削除」ボタンでpost_data.php

2.3. ページ遷移フロー図(簡略)

index.php
  ├─> [新規登録] ─> employee_input.php ─> post_data.php ─┬─> index.php
  └─> [氏名リンク] ─> employee_edit.php
         ├─> [編集] ─> employee_update.php ─> post_data.php ─> index.php
         └─> [削除] ─> employee_delete.php ─> post_data.php ─> index.php
  • post_data.phpが登録・更新・削除の処理を一括管理し、リダイレクトで戻します。

2.4. GET/POSTの使い分け

  • GET
    データの参照や画面遷移時(例:社員番号付きでemployee_edit.php?id=1001
  • POST
    フォームからデータ登録・更新・削除を行う時(データ本体はPOSTで送信)

2.5. HTMLテンプレートとエラーハンドリング

共通HTML出力関数(common/html_functions.php)

  • 各ページ共通のshow_top()/show_bottom()でヘッダー・フッターを統一
  • エラー時は、エラーメッセージを画面に表示

2.6. ファイルと関数の役割まとめ

ファイル名主な役割
index.php社員一覧を表示する。新規登録画面・編集画面へのリンク
employee_input.php新規登録用フォーム
employee_edit.php編集・削除選択画面
employee_update.php更新用フォーム
employee_delete.php削除確認画面
post_data.phpDB登録・更新・削除の実処理
common.php共通処理の読込と初期化
common/data_check.php入力値のバリデーション
common/dbmanager.phpデータベース接続と各種操作
common/html_functions.phpHTML生成の共通関数群

3.実装例とコードの詳細解説(前半)

3.1. 社員一覧画面(index.php)

 このファイルは、登録された全社員の一覧を表示し、「新規登録」画面へのリンクや、個々の社員詳細(編集・削除選択)画面へのリンクを持ちます。

<?php
require_once("common.php");
show_top("社員一覧");

// 全社員の情報を取得
$members = $dbm->get_all_employees();
if ($members != null) {
    show_employee_list($members);
}
echo '<a href="employee_input.php">新しい社員の登録</a>';

show_bottom();
?>

コード解説

  • require_once("common.php")
    共通処理・初期化用のファイルを読み込む。
  • show_top("社員一覧")
    ページ上部の共通HTMLヘッダーを出力。
  • $dbm->get_all_employees()
    DBから全社員データを取得する独自メソッド。
  • show_employee_list($members)
    HTMLテーブルで社員一覧を出力(共通関数として後述)。
  • 「新しい社員の登録」リンクをクリックすると、新規登録画面に遷移。

3.2. 新規登録画面(employee_input.php)

新しい社員データを入力するための画面。入力した内容はpost_data.phpで処理されます。

<?php
require_once("common.php");

$id = $_GET["id"] ?? "";
$name = $_GET["name"] ?? "";
$department = $_GET["department"] ?? "";
$position = $_GET["position"] ?? "";

show_top("社員情報の追加");
// 入力フォームの表示
show_employee_input($id, $name, $department, $position);
show_bottom(true);
?>

コード解説

  • show_top("社員情報の新規登録")
    タイトル付きのページヘッダー出力。
  • show_employee_input()
    社員データ登録フォームをHTMLで出力。値検証エラーがあればここで表示。
  • show_bottom(true)
    フッターと「社員一覧へ戻る」リンクを表示。

3.3. 編集・削除選択画面(employee_edit.php)

 社員番号(id)で指定された社員の情報を表示し、「情報の編集」または「情報の削除」ボタンで各処理画面に遷移できます。

<?php
require_once("common.php");
$id = $_GET["id"];
$employee = $dbm->get_employee($id);

show_top("社員情報の選択");

show_employee($employee);
show_employee_operations($id);

show_bottom(true);
?>

コード解説

  • $_GET["id"]
    URLパラメータから社員番号を取得。
  • $dbm->get_employee($id)
    指定した社員番号の社員情報をDBから取得。
  • show_employee($employee)
    指定社員の詳細をテーブル表示。
  • show_employee_operations($id)
    「編集」「削除」へのリンク(ボタン)を表示。
  • フッターで「一覧へ戻る」リンク付き。

3.4. 共通処理ファイル(common.php)

全ページで読み込む共通ファイル。各種共通関数・クラスをロードし、エラー取得なども行います。

<?php
require_once("common/html_functions.php");
require_once("common/dbmanager.php");
require_once("common/data_check.php");

// エラー取得関数
function get_error() {
    $error = "";
    if (isset($_GET["error"])) {
        $error = $_GET["error"];
    }
    return $error;
}

// DBManagerのインスタンスを生成
$dbm = new DBManager();
?>

コード解説

  • require_once("common/html_functions.php")
    HTML出力系関数群の読み込み。
  • require_once("common/dbmanager.php")
    DB操作用クラスの読み込み。
  • require_once("common/data_check.php")
    入力値検証用関数の読み込み。
  • get_error()
    GETパラメータからエラー内容を取得(各画面のエラー表示に使用)。
  • $dbm = new DBManager();
    DB操作用クラスのインスタンス生成(以降のファイルで使う)。

3.5. 入力値チェック関数(common/data_check.php)

新規登録・編集で利用する入力値バリデーション関数。

<?php
function check_employee_input($id, $name, $department, $position, &$error) {
    $error = "";
    if ($id === "" || $name === "" || $department === "" || $position === "") {
        $error = "未入力の項目があります。";
        return false;
    }
    // 社員番号は4桁の数字であることをチェック
    if (!preg_match("/^[1-9][0-9]{3}$/", $id)) {
        $error = "社員番号は1~9で始まる4桁の数字で入力してください。";
        return false;
    }
    return true;
}
?>

コード解説

  • 各フィールドが未入力ならエラーメッセージ。
  • 社員番号(id)は1~9で始まる4桁の数字でなければエラー。
  • $errorは参照渡しでエラーメッセージを返却。

4.実装例とコードの詳細解説(後半)

4.1. 社員情報の更新画面(employee_update.php)

社員情報を編集するためのフォームを表示します。
編集した内容はpost_data.phpで処理されます。

<?php
require_once("common.php");
$old_id = $_GET["id"];
$employee = $dbm->get_employee($old_id);

$id = $employee["id"];
$name = $employee["name"];
$department = $employee["department"];
$position = $employee["position"];

show_top("社員情報の編集");
show_employee_update($id, $name, $department, $position, $old_id);
show_bottom(true);
?>

コード解説

  • GETパラメータから社員番号を取得し、その情報をDBから取得。
  • 各フィールドの値をフォームにセットして表示。
  • show_employee_update()で編集用フォームを出力。

4.2. 社員情報の削除画面(employee_delete.php)

削除対象の社員情報を確認し、「削除」ボタンで実行します。

<?php
require_once("common.php");
$id = $_GET["id"];
$employee = $dbm->get_employee($id);

show_top("社員情報の削除");
show_employee_delete($employee);
show_bottom(true);
?>

コード解説

  • GETパラメータで対象社員番号を受け取り、その情報を取得。
  • show_employee_delete()で社員情報を確認&削除フォームを出力。

4.3. データ登録・更新・削除処理(post_data.php)

登録・編集・削除いずれの処理もこのファイルで行います。
各処理終了後はリダイレクトで一覧ページなどに戻ります。

<?php
require_once("common.php");

if (isset($_POST["action"])) {
    // 入力値の取得
    $id = $_POST["id"] ?? "";
    $name = $_POST["name"] ?? "";
    $department = $_POST["department"] ?? "";
    $position = $_POST["position"] ?? "";
    $old_id = $_POST["old_id"] ?? "";

    // 登録処理
    if ($_POST["action"] == "create") {
        if (!check_employee_input($id, $name, $department, $position, $error)) {
            header("Location: employee_input.php?error={$error}");
            exit();
        }
        if ($dbm->if_id_exists($id)) {
            $error = "すでに登録されている社員番号です。";
            header("Location: employee_input.php?error={$error}");
            exit();
        }
        if (!$dbm->insert_employee($id, $name, $department, $position)) {
            $error = "データベースエラーが発生しました。";
            header("Location: employee_input.php?error={$error}");
            exit();
        }
        header("Location: index.php");
        exit();

    // 更新処理
    } else if ($_POST["action"] == "update") {
        if (!check_employee_input($id, $name, $department, $position, $error)) {
            header("Location: employee_update.php?error={$error}&id={$old_id}");
            exit();
        }
        if ($dbm->if_id_exists($id) && $id != $old_id) {
            $error = "すでに登録されている社員番号です。";
            header("Location: employee_update.php?error={$error}&id={$old_id}");
            exit();
        }
        $dbm->update_employee($id, $name, $department, $position, $old_id);
        header("Location: index.php");
        exit();

    // 削除処理
    } else if ($_POST["action"] == "delete") {
        if (!$dbm->delete_employee($id)) {
            $error = "データベースエラーが発生しました。";
            header("Location: employee_delete.php?error={$error}&id={$id}");
            exit();
        }
        header("Location: index.php");
        exit();
    }
}
?>

コード解説

  • actionの値によって登録・更新・削除を切り替え。
  • それぞれ入力値チェック、DB処理、エラー時のリダイレクト。
  • 成功時は必ずindex.phpに戻る(PRGパターン)。

4.4. DBマネージャークラス(common/dbmanager.php)

DB接続やSQL実行などの処理をまとめたクラスです。

<?php
class DBManager {
    private $access_info;
    private $user;
    private $password;
    private $db = null;

    function __construct() {
        $this->access_info = "mysql:host=localhost;dbname=company";
        $this->user = "root";
        $this->password = "root";
    }

    // DB接続
    private function connect() {
        $this->db = new PDO($this->access_info, $this->user, $this->password);
    }
    private function disconnect() {
        $this->db = null;
    }

    // 全社員取得
    function get_all_employees() {
        try {
            $this->connect();
            $stmt = $this->db->prepare("SELECT * FROM employee ORDER BY id;");
            $stmt->execute();
            $members = $stmt->fetchAll();
            $this->disconnect();
            return $members;
        } catch(PDOException $e) {
            $this->disconnect();
            return null;
        }
    }

    // 指定社員取得
    function get_employee($id) {
        try {
            $this->connect();
            $stmt = $this->db->prepare("SELECT * FROM employee WHERE id = ?;");
            $stmt->bindParam(1, $id, PDO::PARAM_INT);
            $stmt->execute();
            $members = $stmt->fetchAll();
            $this->disconnect();
            if (count($members) === 0) return null;
            return $members[0];
        } catch(PDOException $e) {
            $this->disconnect();
            return null;
        }
    }

    // 社員番号の存在確認
    function if_id_exists($id) {
        return $this->get_employee($id) !== null;
    }

    // 社員登録
    function insert_employee($id, $name, $department, $position) {
        try {
            $this->connect();
            $stmt = $this->db->prepare("INSERT INTO employee VALUES (?, ?, ?, ?);");
            $stmt->bindParam(1, $id, PDO::PARAM_INT);
            $stmt->bindParam(2, $name, PDO::PARAM_STR);
            $stmt->bindParam(3, $department, PDO::PARAM_STR);
            $stmt->bindParam(4, $position, PDO::PARAM_STR);
            $stmt->execute();
            $this->disconnect();
            return true;
        } catch(PDOException $e) {
            $this->disconnect();
            return false;
        }
    }

    // 社員情報の更新
    function update_employee($id, $name, $department, $position, $old_id) {
        try {
            $this->connect();
            $stmt = $this->db->prepare("UPDATE employee SET id = ?, name = ?, department = ?, position = ? WHERE id = ?;");
            $stmt->bindParam(1, $id, PDO::PARAM_INT);
            $stmt->bindParam(2, $name, PDO::PARAM_STR);
            $stmt->bindParam(3, $department, PDO::PARAM_STR);
            $stmt->bindParam(4, $position, PDO::PARAM_STR);
            $stmt->bindParam(5, $old_id, PDO::PARAM_INT);
            $stmt->execute();
            $this->disconnect();
            return true;
        } catch(PDOException $e) {
            $this->disconnect();
            return false;
        }
    }

    // 社員情報の削除
    function delete_employee($id) {
        try {
            $this->connect();
            $stmt = $this->db->prepare("DELETE FROM employee WHERE id = ?;");
            $stmt->bindParam(1, $id, PDO::PARAM_INT);
            $stmt->execute();
            $this->disconnect();
            return true;
        } catch(PDOException $e) {
            $this->disconnect();
            return false;
        }
    }
}
?>

4.5. HTML出力関数群(common/html_functions.php)

各種画面を生成するための共通関数です。

<?php
// HTMLヘッダー
function show_top($title = "社員管理") {
    echo <<<HEADER
<html>
<head><title>{$title}</title></head>
<body>
<h1>{$title}</h1>
HEADER;
}

// HTMLフッター
function show_bottom($return_top = false) {
    if ($return_top) {
        echo '<a href="index.php">社員一覧に戻る</a><br>';
    }
    echo <<<FOOTER
</body>
</html>
FOOTER;
}

// 社員一覧テーブル表示
function show_employee_list($members) {
    echo '<table border="1" style="border-collapse:collapse">';
    echo '<tr><th>社員番号</th><th>名前</th><th>所属</th><th>役職</th></tr>';
    foreach ($members as $row) {
        echo "<tr align='center'>";
        echo "<td>{$row['id']}</td>";
        echo "<td><a href='employee_edit.php?id={$row['id']}'>{$row['name']}</a></td>";
        echo "<td>{$row['department']}</td>";
        echo "<td>{$row['position']}</td>";
        echo "</tr>";
    }
    echo '</table><br>';
}

// 新規登録フォーム
function show_employee_input() {
    $error = get_error();
    echo <<<FORM
<form action="post_data.php" method="post">
<p>社員番号<br><input type="text" name="id" placeholder="例:1001"></p>
<p>名前<br><input type="text" name="name" placeholder="例:佐藤一郎"></p>
<p>所属<br><input type="text" name="department" placeholder="例:営業部"></p>
<p>役職<br><input type="text" name="position" placeholder="例:課長"></p>
<p style="color:red;">{$error}</p>
<input type="hidden" name="action" value="create">
<input type="submit" value="登録">
</form>
FORM;
}

// 編集フォーム
function show_employee_update($id, $name, $department, $position, $old_id) {
    $error = get_error();
    echo <<<FORM
<form action="post_data.php" method="post">
<p>社員番号<br><input type="text" name="id" value="{$id}"></p>
<p>名前<br><input type="text" name="name" value="{$name}"></p>
<p>所属<br><input type="text" name="department" value="{$department}"></p>
<p>役職<br><input type="text" name="position" value="{$position}"></p>
<p style="color:red;">{$error}</p>
<input type="hidden" name="old_id" value="{$old_id}">
<input type="hidden" name="action" value="update">
<input type="submit" value="更新">
</form>
FORM;
}

// 削除フォーム
function show_employee_delete($employee) {
    $error = get_error();
    echo '<table border="1" style="border-collapse:collapse">';
    echo '<tr><th>社員番号</th><th>名前</th><th>所属</th><th>役職</th></tr>';
    echo "<tr align='center'>";
    echo "<td>{$employee['id']}</td>";
    echo "<td>{$employee['name']}</td>";
    echo "<td>{$employee['department']}</td>";
    echo "<td>{$employee['position']}</td>";
    echo "</tr></table><br>";
    echo <<<FORM
<form action="post_data.php" method="post">
<p style="color:red;">{$error}</p>
<input type="hidden" name="id" value="{$employee['id']}">
<input type="hidden" name="action" value="delete">
<input type="submit" value="削除">
</form>
FORM;
}

// 社員詳細
function show_employee($member) {
    if ($member === null) {
        echo "<p>該当する社員データがありません。</p>";
        return;
    }
    // ここから従来のテーブル出力
    echo "<table border='1'>";
    echo "<tr><th>社員番号</th><th>名前</th><th>所属</th><th>役職</th></tr>";
    echo "<tr align='center'>";
    echo "<td>{$member['id']}</td>";
    echo "<td>{$member['name']}</td>";
    echo "<td>{$member['department']}</td>";
    echo "<td>{$member['position']}</td>";
    echo "</tr>";
    echo "</table><br>";
}

// 編集・削除操作
function show_employee_operations($id) {
    echo "<a href='employee_update.php?id={$id}'>情報の編集</a><br>";
    echo "<a href='employee_delete.php?id={$id}'>情報の削除</a><br><br>";
}
?>

5.社員情報管理アプリの実行

ブラウザを起動して以下のURLを入力します。

http://localhost/company_app/index.php

実行画面

さらに応用・発展したい場合

  • 検索機能・絞り込み機能
  • ページネーション
  • バリデーション強化・CSRF対策
  • デザインカスタマイズ(CSS/Bootstrap等)

なども挑戦してみてください。