
【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.php | HTML共通出力関数 |
社員情報はMySQLデータベース「company」の「employee」テーブルに保存されます。
1.3. データベースとテーブルの設計
テーブル設計
社員情報を保存するemployeeテーブルの構成は下記のとおりです。
| カラム名 | データ型 | 意味 | 制約 |
|---|---|---|---|
| id | INT | 社員番号 | PRIMARY KEY |
| name | VARCHAR(128) | 氏名 | NOT NULL |
| department | VARCHAR(64) | 部署 | |
| position | VARCHAR(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.php2.社員情報管理アプリの画面設計とページ遷移
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.phppost_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.php | DB登録・更新・削除の実処理 |
| common.php | 共通処理の読込と初期化 |
| common/data_check.php | 入力値のバリデーション |
| common/dbmanager.php | データベース接続と各種操作 |
| common/html_functions.php | HTML生成の共通関数群 |
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等)
なども挑戦してみてください。
