0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ウェブアプリでデータベースを操作するの続き

0
Last updated at Posted at 2026-04-25

はじめに

データベースを使ってコンテンツを表示するページを作りたいと、友人(@digital24s さん)から相談されました。PHP プログラムで MySQL に接続して操作する仕組を整理しました。

ウェブアプリでデータベースを操作する #PHP - Qiita

その続きです。

データベースに接続して SSR で表示する

前回の記事のウェブアプリは、フロントエンドプログラムがデータを表示する、いわゆる「CSR(Client Side Rendering)」のプログラムでした。
これに対して、PHP で書かれるウェブアプリのプログラムは、「SSR(Server Side Rendering)」にすることが多いかも知れません。

参考 レンダリングパターンをいらすとやで解説してみた #AdventCalendar - Qiita

「SSR」のウェブアプリは、フロントエンドで表示するための HTML データをバックエンドプログラムが作成します。画面を更新するときは、HTML データを作成し直して入替します。

説明.png

前回の記事のデータベースに接続して一覧表示するプログラムを、SSR で書換したいと思います。

SSR で一覧表示する

参考 PHPでデータベースのデータを取得し、HTMLのテーブルで一覧表示する方法 - 森の株

HTML データの雛形の中に、PHP のコードを書いていきます。

ssr.php
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<?php
    try {
        // データベースに接続
        $pdo = new PDO("mysql:host=(ホスト); dbname=sakila", "(ユーザ)", "(パスワード)");

        // データを取得
        $stmt = $pdo->query("SELECT actor_id, first_name, last_name, last_update FROM actor");
        $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

        // 処理が成功したことを返す
        $message = "Succeeded.";
    } 
    catch (Throwable $e) {
        // エラー発生したことを返す
        $message = "Failed: " . $e->getMessage();
    }
?>
<body>
    <p><?= $message ?></p>

    <ul>
        <?php foreach ($rows as $item): ?>
            <li>
                (<?= $item['actor_id'] ?>) <?= $item['first_name'] ?> <?= $item['last_name'] ?>
            </li>
        <?php endforeach; ?>
    </ul>
</body>    
</html>

データベースに接続してデータを取得して変数 $rows にセットします。これを HTML タグに仕込んだ PHP コードで表示します。↑

ボタン押下したら一覧表示する

上記のプログラムは、ウェブブラウザでページが開かれた時点でデータを取得して一覧表示します。ページを開いたときは一覧表示しないで、ボタン押下すると一覧表示するようにしたいと思います。

参考 PHPで検索フォームを作るには?簡単な検索機能を実装してみよう! | 侍エンジニアブログ

ssr.php
(前略)
<body>
    <p><?= $message ?></p>

    <form method="GET" action="ssr.php">
        <button type="submit" name="action" value="list">取得</button>
    </form>
    (後略)

formbutton を用意して、ボタン押下するとパラメータ action に「list」をセットして、自分自身 ssr.php を呼出し直すようにします。↑

ssr.php
<?php
    try {
        // 指定されたパラメータを取得
        $action = $_GET['action'] ?? '';

        if ($action === "list") {
            // データベースに接続
            $pdo = new PDO("mysql:host=(ホスト); dbname=sakila", "(ユーザ)", "(パスワード)");
            // データを取得
            $stmt = $pdo->query("SELECT actor_id, first_name, last_name, last_update FROM actor");
            $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
        }
        (後略)

PHP スクリプトが呼出されたとき、指定されたパラメータ action を確認します。「list」が指定されていたら、データベースから取得するようにします。↑
最初に ssr.php が呼出されるときは、パラメータの指定なしで、変数 $rows は内容がセットされないので、画面に一覧表示されなくなります。

条件を指定して一覧表示する

上記のプログラムはテーブルに登録されている全てのデータを取得して表示しています。条件を指定して一致したデータを取得して表示するようにしたいと思います。

参考 PHPのパラメータはこれで解決!値送信から取得まで解説 | 侍エンジニアブログ

ssr.php
    (前略)
    <form method="GET" action="ssr.php">
        <input type="text" name="keyword" placeholder="キーワード" value="<?= $keyword ?>">
        <button type="submit" name="action" value="find">検索</button>
    </form>
    (後略)

名前 keywordinput タグを追加する。action は「find」にしました。↑

ssr.php
        (前略)
        // 指定されたパラメータを取得
        $action = $_GET['action'] ?? '';

        if ($action === "find") {
            // 指定されたパラメータを取得
            $keyword = $_GET['keyword'] ?? '';
            // データベースに接続
            $pdo = new PDO("mysql:host=(ホスト); dbname=sakila", "(ユーザ)", "(パスワード)");
            // データを取得
            $stmt = $pdo->prepare("SELECT actor_id, first_name, last_name, last_update FROM actor " 
            . "WHERE first_name LIKE :keyword OR last_name LIKE :keyword");
            $stmt->bindValue(':keyword', "%{$keyword}%", PDO::PARAM_STR);
            $stmt->execute();
            $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
            (後略)

パラメータ action に「find」が指定されていたら、パラメータ keyword を確認して
データベースから取得します。↑

登録と削除できるようにする

続いて、データを「登録」「削除」できるようにしたいと思います。

ssr.php
    (前略)
    <form method="POST" action="ssr.php">
        <input type="text" name="actor_id" placeholder="ID (空なら新規、既存なら更新)">
        <input type="text" name="first_name" placeholder="First Name">
        <input type="text" name="last_name" placeholder="Last Name">
        
        <button type="submit" name="action" value="regist">登録更新</button>
        <button type="submit" name="action" value="remove">削除</button>
    </form>
    (後略)

パラメータ action が「regist」のとき「新規登録」と「更新登録」します。「remove」のとき「削除」します。form タグに名前 action_id などの input タグを追加します。↑

ssr.php
        (前略)
        if ($action === "regist") {
            // 指定されたパラメータを取得
            $actorId = $_POST['actor_id'] ?? null;
            $firstName = $_POST['first_name'] ?? '';
            $lastName = $_POST['last_name'] ?? '';
            // データベースに接続
            $pdo = new PDO("mysql:host=(ホスト); dbname=sakila", "(ユーザ)", "(パスワード)");
            // データを挿入/更新
            $stmt = $pdo->prepare("INSERT INTO actor (actor_id, first_name, last_name, last_update) VALUES (:actor_id, :first_name, :last_name, NOW()) "
            . "ON DUPLICATE KEY UPDATE first_name = VALUES(first_name), last_name = VALUES(last_name), last_update = NOW()");
            $stmt->bindValue(':actor_id', $actorId, PDO::PARAM_INT);
            $stmt->bindValue(':first_name', $firstName, PDO::PARAM_STR);
            $stmt->bindValue(':last_name', $lastName, PDO::PARAM_STR);
            $stmt->execute();
            // 処理が成功したことを返す
            $message = "Registered.";
        }    
        else if ($action === "remove") {
            // 指定されたパラメータを取得
            $actorId = $_POST['actor_id'] ?? null;
            // データベースに接続
            $pdo = new PDO("mysql:host=(ホスト); dbname=sakila", "(ユーザ)", "(パスワード)");
            // データを削除
            $stmt = $pdo->prepare("DELETE FROM actor WHERE actor_id = :actor_id");
            $stmt->bindValue(':actor_id', $actorId, PDO::PARAM_INT);
            $stmt->execute();
            // 処理が成功したことを返す
            $message = "Deleted.";
        }
        (後略)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?