デモページ
JavaScript は jQuery を使用します。 テンプレート構造 IFRAME 内の処理( req フォルダ内 )が実際の問い合わせ処理になります。メインページの下部に CSS の calc 関数を使用してフィットさせています。
メインの control.php( エントリポイント ) 更新等を行う場合は、ここに入力値のコントロールが入ります。ここでは画面を表示するだけなので、共通処理と画面のみを require_once しています。 ※ コメントに # を使用しているのは、Ruby と Python に合わすためです( テンプレート )
<?php
# ***************************
# ソースベースの取り込み
# ***************************
require_once('settings.php');
# ***************************
# 画面定義
# ***************************
require_once('view.php');
?>
settings.php ( 共通処理 ) PHP としての設定と、アプリとしての初期設定と、デバッグ用のログ関数の定義を行っています。この処理は、問い合わせ処理側( req フォルダ内 )からも読み込まれて使用されます。
<?php
# ***************************
# 共通処理( UTF8N で保存 )
# ***************************
error_reporting( E_ALL & ~E_NOTICE & ~E_STRICT );
ini_set('display_errors', '1');
ini_set('date.timezone', 'Asia/Tokyo');
ini_set('default_charset', 'utf-8');
session_cache_limiter('nocache');
session_start();
header( "Content-Type: text/html; charset=utf-8" );
foreach( $_REQUEST as $key => $value ) {
# ここで $_REQUEST 内の(入力された)文字列の処理
}
# ***************************
# デバッグログの初期化
# ***************************
file_put_contents("debug.log", "開始\n" );
# ***************************
# メッセージ
# ***************************
$check_message = "";
# ***************************
# クライアント会話コントロール
# 1 は第一会話
# ***************************
$gpass = "1";
# ***************************
# デバッグログ関数(テキスト)
# ***************************
function txlog($message) {
file_put_contents("debug.log", "{$message}\n" , FILE_APPEND );
}
# ***************************
# デバッグログ関数
# (オブジェクト等)
# ***************************
function pplog($data) {
file_put_contents("debug.log", print_r($data, true) , FILE_APPEND );
}
?>
view.php ( メイン画面定義 )
画面定義は、PHP の HTML モードでは無くヒアドキュメントで行っています( これも、Ruby と Python に合わす為です )。変数のパースも {} を必ず使用するようにして、Ruby と Python との差異をできるだけ小さくしようとしています。
JavaScript の外部ファイルの読み込み時のキャッシュ制御を行う為、ページが表示された時間を URL に付加しています。
<?php
require_once('view_config.php');
# **************************************
# js キャッシュ用
# **************************************
$tm = mktime();
# **************************************
# 画面定義
# ( Ruby や Python に合わせた画面形式 )
# **************************************
$out_client = <<<HTML
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.1/css/bootstrap.css" />
<script src="{$view_js}?{$tm}"></script>
<style>
/* ブロックを左右に表示 */
.ttl {
display: inline-block;
width: 150px;
}
.entry {
display: inline-block;
}
.line {
margin-bottom: 0;
}
/* IFRAMEコントロール用 */
html,body {
height: 100%;
}
body {
margin: 0;
}
/* IFRAMEコントロール用 */
#head {
padding: 16px;
width: 100%;
height: {$view_head_height}px;
background-color: #e0e0e0;
}
#extend {
display: block;
margin-left: auto;
margin-right: auto;
width: calc( 100% - 3px );
height: calc( 100% - {$view_head_height}px - 2px );
border: solid 2px #c0c0c0;
}
</style>
</head>
<body>
<div id="head">
<p class="ttl">
氏名で検索
</p>
<p class="entry">
<input
id="cond"
type="text">
<input
class="ml-4 btn btn-success"
id="btn"
type="button"
value="問合せ">
<a
class="ml-4 btn btn-info btn-sm"
href="{$_SERVER["PHP_SELF"]}">GET 再読み込み</a>
</p>
<p class="line"></p>
<h4 class="text-danger">{$check_message}</h4>
</div>
<iframe id="extend" name="extend" class="iframe-option" src="req/control.php"></iframe>
</body>
</html>
HTML;
print $out_client;
?>
※ 画面上のスペーシングに Bootsrtap のクラスである ml-4( margin-left: 1.5rem !important; ) を使用しています。 ※ btn btn-success、btn btn-info btn-sm は、ボタン用の Bootsrtap のクラス view_config.php ( 画面用定数の定義 ) PHP の変数を使用して、画面に必要な文字列や数値を定義しています。
<?php # *************************** # 画面に埋め込む定数用変数 # *************************** $view_js = "entry.js"; $view_head_height = "100"; ?>
entry.js 1) Bootstrap のボタンの表示位置の調整を行っています。 2) 問い合わせの条件を JavaScript 側で作成して IFRAME の src にセットしています。
// ロードイベント
$(function(){
// ***************************
// ボタン表示位置微調整
// ***************************
$( ".btn" ).css({
"margin-top": "-4px"
});
// ***************************
// IFRAME に問合せを表示
// ***************************
$( "#btn" ).click(function() {
$("#extend").prop("src","req/control.php?nm=" + encodeURIComponent($("#cond").val()));
});
});
control.php ( 問い合わせのエントリポイント ) 単独で動作する問い合わせアプリケーションです。GET メソッドで QueryString を受け取って内部の SQL 処理に引き渡すので、real_escape_string でエスケープして専用の連想配列を作成しています。( オリジナルはそのままです ) データベースの接続に必要な値は、include_path に設定されたディレクトリに config.php を作成してセットします<?php $host = "MySQLサーバ"; $user = "ユーザ"; $pass = "パスワード"; $db = "データベース"; ?>
<?php
# ***************************
# ソースベースの取り込み
# ***************************
require_once('../settings.php');
require_once('../model.php');
require_once('config.php');
# ***************************
# MySQL 接続
# ***************************
$con = @new mysqli($host, $user, $pass, $db);
$con->set_charset("utf8");
# ***************************
# MySQL 用特殊文字エスケープ
# ***************************
foreach( $_REQUEST as $key => $value ) {
$_REQUEST["db"][$key] = $con->real_escape_string($value);
}
# ***************************
# テーブル表示
# ***************************
build_table($con);
# ***************************
# MySQL 接続解除
# ***************************
$con->close();
# ***************************
# 画面定義
# ***************************
require_once('view.php');
?>
view.php ( 問い合わせ用画面 )
テーブル表示時のカーソルを常にデフォルトに固定して、テーブルのデータが折り返さないように以下の CSS が追加定義されています
table 部分の行データの埋め込み部分に tbody を明示しているのは、行を jQuery で動的に作成した時に tbody が無いと Bootstrap の css が動作しないからです( 他のテンプレートと差異を少なくする為 )。
td,th {
cursor: default!important;
white-space: pre;
}
<?php
require_once('view_config.php');
# **************************************
# js キャッシュ用
# **************************************
$tm = mktime();
# **************************************
# 画面定義
# ( Ruby や Python に合わせた画面形式 )
# **************************************
$out_client = <<<HTML
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.1/css/bootstrap.css" />
<script src="{$view_js}?{$tm}"></script>
<style>
td,th {
cursor: default!important;
white-space: pre;
}
body {
margin: 0;
padding: 16px;
}
#tbl {
user-select: none;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
}
</style>
</head>
<body>
<table class="table table-hover">
<tbody id="tbl">
{$GLOBALS['table']}
</tbody">
</table>
</body>
</html>
HTML;
print $out_client;
?>
model.php ( テーブル作成部分 ) 1) 列データの文字列をまずループで作成しています( SQLを変更するだけで違った問い合わせを表現できます ) 2) 列データが完成する毎に、行データを作成して全体の文字列に追加していきます。
<?php
# ***************************
# モデル用関数を定義する
# ***************************
# ***************************
# テーブル表示
# ***************************
function build_table($con) {
// デバッグ用
txlog( "build_table:開始" );
pplog( $con );
// TR 内の HTML 文字列
$lines = "";
$sql= <<<SQL
select
社員コード,
氏名,
フリガナ,
所属,
性別,
作成日,
更新日,
給与,
手当,
管理者,
DATE_FORMAT(生年月日,'%Y/%m/%d') as 生年月日
from 社員マスタ
where 氏名 like '%{$_REQUEST["db"]["nm"]}%'
SQL;
$rs = $con->query($sql); // エラー処理省略(本当は必要)
// デバッグ用
pplog( $rs );
// 列情報を取得( タイトル用 )
$fields_data = $rs->fetch_fields();
foreach( $fields_data as $field ){
$lines .= "<th>{$field->name}</th>";
}
// 列データを取得
while( $row = $rs->fetch_array(MYSQLI_BOTH) ) {
$cells = "";
for( $i = 0; $i < $rs->field_count; $i++ ) {
$cells .= "<td>{$row[$i]}</td>";
}
$lines .= "<tr>{$cells}</tr>" . "\n";
}
// 埋め込み用グローバル変数へセット
$GLOBALS['table'] = $lines;
// デバッグ用
txlog( "build_table:終了" );
}
?>
関連する記事 Ruby + MySQL + IFRAME + Bootstrap : 問い合せ WEB アプリテンプレート Python + MySQL + IFRAME + Bootstrap : 問い合せ WEB アプリテンプレート CSS の calc 関数を使って、IFRAME を画面下半分にフィットさせる
|
|
【PHP + WEBアプリの最新記事】
- PHP : $.ajax でアップロード( 画像限定 ) / ファイルアップロード ver.3
- PHP : 選択した画像の表示 / ファイルアップロード ver.2
- PHP : ファイルアップロード ver.1
- 超簡易掲示板 ( JSON ) : PHP / CSS でスマホ用レスポンシブ対応
- PHP : 曲線が必要ならば ImageMagick ( 但し使えるかどうかはサーバー次第 )
- GD で画像縮小。『1) 単純縮小、2) 幅にあわす 3) 高さにあわす 4) 任意の幅と高さ』をその他の処理も含めてクラスでまとめ( class GD )
- PHP : 超簡易ログ
- Windows で Laravel を試す際、PHP の Windows バージョンが 5.6.30 なので、Laravel 5.2 をインストールします
- Laravel を試す為に Windows に Composer をインストール
- スマホ対応、サーバインデックス表示パッケージ( jQuery + Bootstrap(css) + mmenu + PHP )
- 超簡易掲示板 : 保存タイプは CSV
- PHP による『超簡易掲示板』 / アプリケーションからの POST 検証用
- PHP : 既存 GD 関連ライブラリで、背景をグラデーション(2)
- PHP : 既存 GD 関連ライブラリで、背景をグラデーション
- PHP : 入力値のデバッグ
- PHP : ImageMagick : 背景が透過する画像を作成
- PHP雛型(2会話DB更新処理) : MySQL、XMLHttpRequest、XML、JSON、Canvas
- PHP をテストする為の初心者用フォーム




メインの control.php( エントリポイント )
更新等を行う場合は、ここに入力値のコントロールが入ります。ここでは画面を表示するだけなので、共通処理と画面のみを 



