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がシェアが高いのでオススメです。

Laravel

クラウドの利用

最近では、アプリケーションやデータベース、ストレージなどをクラウド上で構築・運用するのが主流となっています。

項目 説明
インフラ管理の手間を削減 物理サーバの構築や保守が不要
スケーラビリティ アクセス増加に応じて自動でリソースを拡張可能
コスト最適化 使った分だけの課金(従量課金制)
チーム開発のしやすさ クラウド環境により、チームでの環境共有が容易

代表的なクラウドサービスには以下のようなものがあります:

サービス名 提供元 主な用途
AWS (Amazon Web Services) Amazon 幅広いインフラサービス(EC2, RDS, S3など)
Microsoft Azure Microsoft Windows系と親和性が高い、企業向けサービスが豊富
Google Cloud Platform (GCP) Google 機械学習やBigQueryなど先進技術に強み

これらクラウドサービスとWebフレームワーク(例:Laravel)を組み合わせることで、モダンで拡張性の高い業務アプリを構築することができます。

PHP + MySQL Webサーバプログラミング