Web版レシート管理作成記 テーブルデータの表示

プログラミング

ブラウザからリクエストを受取り、userテーブルのデータをレスポンスしてブラウザに表示するまでのサンプルプログラムです。

処理の流れと、処理のポイントを下図を使って解説します。

  • ブラウザでURLを指定します。(http://******.php.xdomain.jp/DBTestEntry.php)
    なお、ブラウザによって、httpは「セキュリティで保護されていないコンテンツ」と見なされサイトにアクセスできない場合があります。
    その場合、ブラウザの設定が必要です。
    例)Edgeの場合:設定>Cookieとサイトのアクセス許可>セキュリティで保護されていないコンテンツの順に選択し、「許可」として「http://******.php.xdomain.jp」を追加します。
  • エントリープログラム「DBTestEntry.php」から処理プログラム「DBTestClass.php」を呼出します。
    エントリープログラムと処理プログラムを別にするのは、最終的にMVCの構造にしたいからです。
    なお、「DBTestClass.php」は、サンプルプログラムのために、MVCのM(Model)とC(Controller)を併せ持たせています。
  • セッションを開始します。
    セッションを開始することで、セッション変数にデータを保管できるようになります。
    MVCによりプログラムが分割されても、プログラム間でセッション変数を共有できるため、データ共有が可能になります。
    また、Cookie(クッキー)にセッションIDを保管することによりブラウザとの連携を強化することもできます。
  • データベースに接続します。
    ホスト名、データベース名、ユーザー名、パスワード、文字セットを指定して接続します。
    これらの情報については前回のブログを参照してください。
    なお、データベースの処理はPDOで行います。
    PDO (PHP Data Objects) とは、PHPからデータベースにアクセスするための拡張モジュールです。
  • userテーブルからデータを抽出するSELECT文を作成し、実行します。
    userテーブルから抽出したデータは$row変数に格納されます。
  • $rowにあるテーブルデータを配列(table_data[])に格納します。
  • 配列データ(table_data[])をセッション変数「ses_table_data]に格納します。
    なお、このセッション変数「ses_table_data]に格納されたテーブルデータは、⑩で取り出して、レスポンスの作成に使われます。
  • header関数でHTML文を作成するプログラム「DBTest_view.php」にフォワードします。
    なお、「DBTest_view.php」はMVCのV(View)のプログラムになります。
  • セッションの開始をします。
    セッション変数「ses_table_data]の値を取り出すためにセッションの開始が必要です。
    セッションの開始は「DBTest_view.php」の先頭で行ってください。
    ブラウザへの出力コード(例えば<tr>)の前に開始しておく必要があるためです。
  • セッション変数「ses_table_data]を取り出し配列($table_data)に格納します。
  • 配列($table_data)からテーブルデータを取り出してHTMLを生成します。
  • HTMLをブラウザに送出(レスポンス)して、userテーブルデータを表示します。

サンプルコードを載せておきます。

DBTestEntry.php

<?php
/*************************************************
 * Enty 
 *
 */

require_once( __DIR__ . '/DBTestClass.php');
$controller = new DBTestClass();
exit;
?>

DBTestClass.php

<?php
/**
 * Description of DBTestClass
 * Userテーブルのデータをブラウザに表示するテストプログラムです
 */
class DBTestClass {

    // 変数の定義
    protected $pdo;
    protected $host;
    protected $dbname;
    protected $dbusr;
    protected $dbpass;
    protected $sessname = 'PHPSESSION_MEMBER';
    
    protected $table_data = [];

    //*****************************************************
    // コンストラクター
    //*****************************************************
    public function __construct() {
        $this->db_test_start();
    }

    //*****************************************************
    // テストコード
    //*****************************************************
    private function db_test_start(){
        // (1)セッションの開始処理
        if(session_status() === PHP_SESSION_ACTIVE){
            // 既にセッションがアクティブなら何もしません
        } else {
            if($this->sessname != ""){
                session_name($this->sessname);
            }
            session_start();  // セッション開始
        }
     
        // (2)DB接続処理
        $host = 'mysql1.php.xdomain.ne.jp';
        $dbname = '********_receipt';
        $dbusr = '********_kr';
        $dbpass = '**********';
        
        try {
          $this->pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $dbusr, $dbpass);
          $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
          $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        } catch(PDOException $Exception) {
          die('DB Connect Error;' . $Exception->getMessage());
        }
        
        // (3)select文発行
        try {
           $sql= "SELECT * FROM user WHERE AI_User BETWEEN :AIFrom AND :AITo";
           $stmh = $this->pdo->prepare($sql);
           $stmh->bindValue(':AIFrom', 0, PDO::PARAM_STR);
           $stmh->bindValue(':AITo', 200, PDO::PARAM_STR);
           $stmh->execute();

           // select文で抽出したデータ($row)を$table_data[]にセットします
           while($row = $stmh->fetch(PDO::FETCH_ASSOC)){
               $this->table_data[] = $row;
           }
        } catch (PDOException $Exception) {
           die('DB select Error;' . $Exception->getMessage());
        }
        
        // (4)抽出したテーブルデータをセッションに保管
        unset($_SESSION['ses_table_data']);
        $_SESSION['ses_table_data'] = $this->table_data;
        
        // (5)DBTest_view.phpへリダイレクト
        header('Location: DBTest_view.php');
        exit;
    }
}

// クラスのインスタンス化を行う
new DBTestClass();
?>

DBTest_view.php

<?php
    // セッションが開始してなければセッションを開始する
    if(session_status() != PHP_SESSION_ACTIVE){
        session_name('PHPSESSION_MEMBER');
        session_start();
    }
    
    // セッションからユーザーデータを取り出す
    $table_data = isset($_SESSION['ses_table_data']) ? $_SESSION['ses_table_data'] : [];
?>
<!-- Userテーブルのデータをブラウザに表示するテストプログラム -->
<!doctype html>
<html>
<head>
<meta charset="utf-8">

<style>
    div.main{
            width: 960px;
            min-height:300px;
            margin:0 0 0 0;
            padding:10px;
            background-color:#ffffff;
    }
    table{border: 0; border-collapse: collapse;}
    #button_area{width:100%}
    h1{text-align: center; color: #002060;  background-color:#F4B084; line-height: 120%}
    .label2{border: solid 1px #000000; border-collapse: collapse; height: 30px;}
    .label3{color: #ffffff; background-color:#305496; font-weight: 600; border: solid 1px #000000; border-collapse: collapse; text-align: center; height: 25px;}
    .func_button{color:#ffffff; background-color:#4472c4; font-weight: 600; width: 80px; height: 40px;font-size:11pt;}
    #back{
        float : left;
        text-align: left;
    }
    #next{
        text-align : right;
    }
    .select_button{
        line-height:20pt;
        padding:2px 10px 2px 10px;
        border-style: solid;
        border-width: 1px;
        border-color: 000000;
        text-decoration:none;
        font-size:11pt;
        font-weight: 600;
        text-align: center;
        color:#800080;
        border-color: 000000;
        background-color:#d9d9d9;
    }
</style>

<title>user table data</title>
</head>

<body>

<div class="main">

<h1>userテーブルのデータ</h1>

<form action="event.php" method="post">

<table style="width:100%;">

    <tr>
        <th style="width:115px; text-align: center" class="label3">AI</th>
        <th style="width:220px; text-align: center" class="label3">User ID</th>
        <th style="width:220px; text-align: center" class="label3">パスワード</th>
        <th style="width:405px; text-align: center" class="label3">名前</th>
    </tr>
    <?php
        if (!empty($table_data)) {
            foreach($table_data as $data){
    ?>
                <tr>
                    <td class="label2" style="text-align: center;">
                        <?= htmlspecialchars($data['AI_User']) ?>
                    </td>
                    <td class="label2" style="text-align: left;">
                        <?= htmlspecialchars($data['UID']) ?>
                    </td>
                    <td class="label2" style="text-align: left;">
                        <?= htmlspecialchars($data['password']) ?>
                    </td>
                    <td class="label2" style="text-align: left">
                        <?= htmlspecialchars($data['name']) ?>
                    </td>
                </tr>
    <?php
            }
        } else {
            echo "<tr><td colspan='4' class='label2' style='text-align: center;'>データがありません。</td></tr>";
        }
    ?>

</table>

<p></p>
<table id="button_area" style="width:100%">
    <tr>
        <td style="width:33%; text-align: center;"></td>
        <td style="text-align: center;"><input class="func_button" name="backward" value="戻る" type="submit" /></td>
        <td style="width:33%; text-align: center;"></td>
    </tr>
</table>
<table>

</table>

</form>

</div>

</body>
</html>

上記プログラムはFTTPで、サイトのルートにデプロイします。
デプロイ後、ブラウザから下記URLを入力すれば、userテーブルの情報が表示されます。
http://******.php.xdomain.jp/DBTestEntry.php

タイトルとURLをコピーしました