4.
CRUD処理
INSERT
INSERT文
INSERT
は、テーブルにレコードを挿入するSQLです。
INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES('データ1', 'データ2', ...);
入力フォーム
ファイル構成
crud/
├── env.php
├── lib/
| └── Database.php
└── insert_user.php
ユーザデータの入力フォームを作成します。

insert_user.php
<?php
// DB処理
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ユーザ追加</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body>
<main class="mx-auto bg-white p-6">
<h2 class="text-2xl mb-6">新規追加</h2>
<form action="" method="post" class="mb-8 space-y-4">
<div>
<label for="account_name" class="block">アカウント名</label>
<input type="text" name="account_name" id="account_name" required class="border p-2 w-full">
</div>
<div>
<label for="email" class="block">メールアドレス</label>
<input type="email" name="email" id="email" required class="border p-2 w-full">
</div>
<div>
<label for="display_name" class="block">表示名</label>
<input type="text" name="display_name" id="display_name" required class="border p-2 w-full">
</div>
<div>
<label for="password" class="block">パスワード</label>
<input type="password" name="password" id="password" required class="border p-2 w-full">
</div>
<div>
<button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded">登録</button>
</div>
</form>
</main>
</body>
</html>
POSTデータ取得
POSTデータを取得してブラウザで確認します。
insert_user.php
<?php
require_once 'env.php';
require_once 'lib/Database.php';
$user_id = null;
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// POSTリクエストの場合、ユーザデータを登録
insert($_POST);
}
function insert($posts)
{
var_dump($posts);
}
?>
...

array(4) { ["account_name"]=> string(5) "user1" ["email"]=> string(14) "[email protected]" ["display_name"]=> string(6) "User 1" ["password"]=> string(4) "1111" }
パスワードハッシュ
password_hash()
は、文字列をハッシュ値に変換する関数で、パスワードなどの機密情報をデータベースに保存するにはハッシュ値を生成します。
// 文字列をハッシュ値に変換
$hash = password_hash(文字列, PASSWORD_DEFAULT);
定数
定数にはハッシュ変換アルゴリズムを指定します。
|定数|アルゴリズム|備考| |-|-|-|-| |PASSWORD_DEFAULT|Bcrypt|PHP推奨アルゴリズム| |PASSWORD_BCRYPT|Bcrypt|出力は常に 60 文字| |PASSWORD_ARGON2I|Argon2i|メモリ消費量や計算時間の設定可能| |PASSWORD_ARGON2ID|Argon2id|Argon2i と Argon2d のハイブリッド|
insert()
で送信されたパスワードをハッシュ変換します。
insert_user.php
function insert($posts)
{
// パスワードハッシュ化
$posts['password'] = password_hash($posts['password'], PASSWORD_DEFAULT);
var_dump($posts['password']);
}
ハッシュ化確認
入力フォームからデータ送信し、パスワードがハッシュ化されたか確認します。
結果
string(60) "$2y$10$jXfUjzrIgd.2IGIIrzkH4OY/qjY2YdEZJKknvDVXnZvmr2ScA8fSO"
INSERT処理
SQLクエリ実行
insert()
に、ユーザデータ追加処理を実装します。
insert_user.php
function insert($posts)
{
// パスワードハッシュ化
$posts['password'] = password_hash($posts['password'], PASSWORD_DEFAULT);
// DB接続
$pdo = Database::getInstance();
// SQL作成
$sql = "INSERT INTO users (account_name, email, password, display_name)
VALUES(:account_name, :email, :password, :display_name);";
try {
// SQLを設定して、プリペアードステートメントを生成
$stmt = $pdo->prepare($sql);
// SQL実行
$result = $stmt->execute($posts);
} catch (PDOException $e) {
error_log($e->getMessage());
$error = "ユーザの登録に失敗しました。" . $e->getMessage();
return $error;
}
}
lastInsertId()
lastInsertId()
を実行すると、INSERT
完了後の id
を取得できます。
insert_user.php
function insert($posts)
{
...
try {
// SQLを設定して、プリペアードステートメントを生成
$stmt = $pdo->prepare($sql);
// SQL実行
$result = $stmt->execute($posts);
// 成功した場合は、登録したユーザのIDを取得
if ($result) {
$user_id = $pdo->lastInsertId();
// 登録したユーザのIDを返却
return $user_id;
}
} catch (PDOException $e) {
error_log($e->getMessage());
$error = "ユーザの登録に失敗しました。" . $e->getMessage();
return $error;
}
}
動作確認
データが追加できるか確認します。


Constraint Error(制約エラー)
account_name
, email
カラムはデータベース定義で UNIQUE
の制約がかかっています。よって、同じ値のレコードが重複すると Constraint Error が発生します。

- try-catch で例外処理されエラーメッセージが表示
UPDATE
UPDATE文
UPDATEの基本構文
UPDATE
文は、テーブルにレコードを更新するSQLです。ただし、条件を指定しない場合、すべてのレコードを更新されてしまいます。
UPDATE テーブル名 SET カラム1 = 'データ1', カラム2 = 'データ2', ...;
特定のレコードのみ更新
WHERE
で条件指定すると特定のレコードのみ更新します。
UPDATE テーブル名 SET カラム1 = 'データ1', カラム2 = 'データ2', ... WHERE 条件;
users.id を指定して account_name 更新
users
テーブルから任意の id
で検索し、account_name
を更新します。
UPDATE users SET account_name = 'user2' WHERE id = 11;
ユーザ更新処理
ユーザ追加と同様のプログラム update_user.php
を作成し実装します。
クエリ実行
update_user.php
<?php
require_once 'env.php';
require_once 'lib/Database.php';
// POSTリクエストの場合、ユーザデータを更新
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$result = update($_POST);
}
// ユーザデータを更新する関数
function update($posts)
{
// DB接続
$pdo = Database::getInstance();
// SQL作成
$sql = "UPDATE users SET account_name = :account_name WHERE id = :id;";
try {
// SQLを設定して、プリペアードステートメントを生成
$stmt = $pdo->prepare($sql);
// SQL実行
return $stmt->execute($posts);
} catch (PDOException $e) {
error_log($e->getMessage());
$error = "ユーザの更新に失敗しました。" . $e->getMessage();
return $error;
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ユーザ更新</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body>
<main class="mx-auto bg-white p-6">
<h2 class="text-2xl mb-6">ユーザ更新</h2>
<form action="" method="post" class="mb-8">
<div class="flex items-center gap-4">
<input
type="text"
name="id"
id="id"
class="w-48 px-4 py-2 border border-gray-300 rounded-md"
placeholder="id">
<input
type="text"
name="account_name"
id="account_name"
class="w-48 px-4 py-2 border border-gray-300 rounded-md"
placeholder="account_name">
<button
type="submit"
class="px-4 py-2 bg-blue-500 text-white rounded">
更新
</button>
</div>
</form>
<h2 class="py-2 text-2xl">結果</h2>
<?php if (isset($result)): ?>
<div class="border-b border-gray-200 p-2">
<?= $result ?>
</div>
<?php endif; ?>
</main>
</body>
</html>
動作確認
指定したユーザIDのレコードが更新できたか確認します。
update_user.php の入力

select_users.php の結果

DELETE
DELETE文
DELETE
文はテーブルにレコードを更新するSQLです。条件を指定しないとすべてのレコードを削除されてしまいます。
DELETE FROM テーブル名;
特定のレコードのみ削除
WHERE
で条件指定すると特定のレコードのみ削除します。
users.id を指定してレコード削除
users
テーブルから任意の id
で検索し、レコード削除します。
DELETE FROM users WHERE id = 11;
ユーザ削除処理
delete_user.php
を作成し実装します。
delete_user.php
<?php
require_once 'env.php';
require_once 'lib/Database.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// idがPOSTされている場合、削除処理を実行
delete($_POST['id']);
}
// POSTリクエストの場合、ユーザデータを削除
function delete($id)
{
// DB接続
$pdo = Database::getInstance();
// SQL作成
$sql = "DELETE FROM users WHERE id = :id;";
try {
// SQLを設定して、プリペアードステートメントを生成
$stmt = $pdo->prepare($sql);
// SQL実行
$result = $stmt->execute(['id' => $id]);
} catch (PDOException $e) {
error_log($e->getMessage());
$error = "ユーザの削除に失敗しました。" . $e->getMessage();
return $error;
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ユーザ削除</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body>
<main class="mx-auto bg-white p-6">
<h2 class="text-2xl mb-6">ユーザ削除</h2>
<form action="" method="post" class="mb-8">
<div class="flex items-center gap-4">
<input
type="text"
name="id"
id="id"
class="w-48 px-4 py-2 border border-gray-300 rounded-md"
placeholder="id">
<button
type="submit"
class="px-4 py-2 bg-red-500 text-white rounded">
削除
</button>
</div>
</form>
</main>
</body>
</html>
動作確認
指定したユーザIDのレコードが削除されたか確認します。
delete_user.php の処理

select_users.php の結果

以下のように「クラウドの利用」についての説明を追加した構成にできます:
MVC と ORM
業務アプリでは1から作成しない
CRUD
(作成、読み込み、更新、削除)を自作でしましたが、大規模システムではあまり現実的ではありません。もしロジックが変更になった時に、複数のプログラムを修正する必要があります。
自作ライブラリ作成
これらの問題を解決するには、MVC や ORM をはじめとした設計や自作ライブラリで開発する方法があります。ただし、自作ライブラリはグループ開発では情報が共有しづらいため、よほどの実績がない限りオススメしません。
Webフレームワークの利用
通常のWeb開発では、Webフレームワークを利用するのが一般的です。PHP Webフレームワークでは、Laravel
がシェアが高いのでオススメです。

クラウドの利用
最近では、アプリケーションやデータベース、ストレージなどをクラウド上で構築・運用するのが主流となっています。
項目 | 説明 |
---|---|
インフラ管理の手間を削減 | 物理サーバの構築や保守が不要 |
スケーラビリティ | アクセス増加に応じて自動でリソースを拡張可能 |
コスト最適化 | 使った分だけの課金(従量課金制) |
チーム開発のしやすさ | クラウド環境により、チームでの環境共有が容易 |
代表的なクラウドサービスには以下のようなものがあります:
サービス名 | 提供元 | 主な用途 |
---|---|---|
AWS (Amazon Web Services) | Amazon | 幅広いインフラサービス(EC2, RDS, S3など) |
Microsoft Azure | Microsoft | Windows系と親和性が高い、企業向けサービスが豊富 |
Google Cloud Platform (GCP) | 機械学習やBigQueryなど先進技術に強み |
これらクラウドサービスとWebフレームワーク(例:Laravel)を組み合わせることで、モダンで拡張性の高い業務アプリを構築することができます。