開発時期:2022年
開発者:AmpiTa Project
開発言語:PHP言語/HTMLタグ
背景・概要
コンサルティングのツールとして開発した医療機関集計システムでは、XMLファイルとして手元で利用できるデータベースは構築できます。
このデータを利用したいという声が多いため、ウェブで共有するためにPHP言語でデータ閲覧ページを構築しました。
XMLデータベースは自己使用、ウェブは公開用です。
元となるデータ
以前ご紹介した記事『保険医療機関データベース生成システム (EXE)』に掲載のデータベースが元となるデータです。
このシステムからCSVファイルをエクスポートし、phpMyAdminでサーバ上のデータベースにインポートして使います。
仕上がり
データベースを開いてみた結果は下記になります。
今回のシステムで実装したデータベースは、下記の検索機能を使うと直接アクセスできます。
公開データベースの利用料は無料、ID登録などは不要です。どなたでも自由にご利用頂けます。
phpMyAdmin
サーバ側はphpMyAdminから設定を行います
さくらインターネットであれば、サーバコントロールパネルを開いてデータベースを新設します。
データベース設置後、phpMyAdminを開いてカラムの設定をします。
初期設定を終えれば、次回からはデータをアップロードするだけになります。
閲覧用ウェブページ(1)PHP
閲覧用ウェブページは拡張子『.php』のウェブページです。ソースコードとしては裏で動くPHP言語と、ユーザーが見るHTMLタグで描かれた部分に大別されます。
PHP言語の部分は下記のようなソースコードで始めています。まずは変数を定義しています。
例えばダラーで始まる『$Data_A_ID』の部分がこのウェブページ内の変数、『search_class』はこのページの前段のページから貰った指示記号のようなもので、可視の場合はURLの含まれます。前段ページから貰うので『$_GET[‘search_class’]』という処理で変数『$Data_A_ID』に情報を貰います。
<?php
header("Content-type: text/html; charset=utf-8");
$Data_A_ID = $_GET['search_class'];
$Sort_A_ID = $_GET['sort_a'];
変数代入のあとは、変数が空であるかどうかをチェックします。もし空であった場合、既定値を代入します。
if(empty($Sort_A_ID))
{$Sort_A_ID ="Asc";}
データベースを全件表示すると重すぎてスタックしてしまう可能性があるので、制限を掛けています。
『define』で指定するのは定数の名前(name)、数値(value)の順に入れ込みます。
ページの表示件数を制限しているので、ここが何ページ目なのかを示せるように計算式も仕込んでいます。
define('MAX','20');
$RecNumberNow= MAX * ($Page_ID - 1);
次にデータベースへの接続を行います。
if(is_countable($errors) === false){
if構文の内側は下記のようになっています。
データベースに接続するための情報はここに記述してありますので、元ファイルを盗まれると困ります。データ自体は公開している内容なので、データベースにアクセスされること自体は問題ではありません。個人情報が入っている訳でも無く、厚生労働省が公開しているデータなので、流出リスクはありません。
Select From 構文で所定のデータベースに接続します。
Order by 構文で並び順などを指定します。
$dsn =
'mysql:host=mysql999.db.sakura.ne.jp;
dbname=MeKiKi_database;
charset=utf8';
$user = 'User_no_Onamae';
$password = 'SQL_Password_UsoDesu';
try{
$dbh = new PDO($dsn, $user, $password);
$strSelect = "SELECT * FROM MEDICAL_PROVIDERL_DATABASE";
$strOrderLimit = " ORDER BY ".$Sort_A_ID." ,id Asc LIMIT ".$RecNumberNow.", ".MAX;
$statement = $dbh->prepare($strSelect.$strOrderLimit);
$Max_statement = $dbh->prepare($strSelect.$strWhere);
}
catch (PDOException $e)
{
print('Error:'.$e->getMessage());
$errors['error'] = "DB接続失敗";
}
件数は制限しているものの、メモリを無制限にするとサーバ負荷が大きくなるかもしれないので、制限を設けた方が良いと思います。下記コードは無制限です。
ini_set("memory_limit", "-1");
下記のように書き換えると制限できるので、今回は下記のようにしてセットしてます。
ini_set("memory_limit", "2048M");
閲覧用ウェブページ(2)HTML
閲覧用ページを見せる部分はHTMLで描いています。
HTMLの基本形であるヘッダーの記述から始めています。
<!DOCTYPE html>
<html>
<head>
<title>
医療機関検索 | MeKiKi (presented by NES)
</title>
<meta charset="utf-8">
</head>
本文は『Body』から『/Body』の間に書きます。
ここから本文ですと宣言する『<Body>』のあとの最初の記述は『h1』で囲んだ、一番大きいサイズのフォントでページタイトルを第一行目に示す指示を入れています。
<body>
<h1>
医療機関検索(病院リスト/診療所リスト/歯科リスト)
</h1>
</a>
そのあとのメインの情報であるデータベース表示は『Table』を使っています。
最初に1行目『tr』には、『th』でカラムを作っていきます。ここで th ~ /th でカラムを何個でも作れますが、画面の横幅を考えると10個程度が限度になると思います。
カラム設定を終えたら『/tr』で閉じます。
次にデータが来ます。
『foreach』でデータを呼び出します。
カラムの1つ目には医療機関名、2つ目には都道府県名という設定です。
中身を入れ終えたら『/table』で表組みを閉じます。
本文は『/body』で閉じます。
HTMLタグは『/html』で閉じます。
<table border='1' cellpadding='3' align="center">
<tr>
<th>医療機関名</th>
<th>都道府県</th>
</tr>
<?php
if ($row_count > 0)
{
foreach($rows as $row)
{
?>
<td align="center"> <?php echo $row['clinic_namel']; ?> </td>
<td align="center"> <?php echo $row['pref']; ?> </td>
</tr>
<?php
}
}
?>
<?php
elseif(is_countable($errors) <> false): foreach($errors as $value)
{
echo "<p>".$value."</p>";
}
endif;
?>
</table>
<hr>
<div style="text-align: center;">
<a href="https://ampita.jp" target="_blank" style="text-decoration:none;">AmpiTa
</a>
</div>
</body>
</html>
おまけで付けた最後の一文はサイトのタイトルとハイパーリンクです。
『hr』は水平線です。
『div』では書式を設定しますが、ここでは文字の中央揃えを指示しています。
『a href』ではハイパーリンク付きの文字を指示しています。文字の部分を『img』にすれば画像にリンクを付けることもできます。
おわりに
このデータベース公開用のPHPウェブページは、さほど責任を持たなくても良い、本来は内部用の資料を一部公開するためのウェブページであり、無償なのでクレームを付けられたとしても、対処の必要はありません。ゆえに、緩く作られています。
本気の業務用データベースとして使う場合には、処理速度や表示方法など工夫が必要だと思います。