はじめに

このブログは、MS-Access による業務システム構築をしている方へのステップアップガイドです。
対象として、情報システム部門などがなく、通常業務との兼任でシステム開発せざるを得ない立場の方を想定しています。
"ステップアップ"とは、Access 単体で解決出来ない下記のような問題への対処の意味。
  1. 遠隔地とのオンライン(VPN)接続が必要になった
  2. 扱うデータの規模が Access の限界に近いまたは超える
  3. 運用中のオンラインバックアップ等、保守面の問題解決
  4. MicroSoftに依存しないWeb対応
を指しています。これらを解決するために、データベース部分を MySQL に置き換えます。
Access は優れたUI開発ツールですので、フロントエンドに専念し、その便利さを最大限に活用すれば良いのです。
すなわち、本ブログの目的は具体的には「Access ユーザーのための MySQL 導入」となります。

ただし、管理人は Access のスキルはそれなりにありますが、 MySQL は入門者に毛の生えた程度のレベルです。
つまり、運用について最低限の知識しかありませんが、自分の会社の業務の範囲では問題なく活用出来ています。
とはいえ、身近に指導してもらえる相手もいないため、ここまでたどり着くのにも、試行錯誤や無駄な努力が数多くあり、必要以上の時間を費やしてしまいました。
ですから「分からない人の気持ちが分かる」ので、最小限の知識と労力で目的に到達出来るように構成します。
開発環境など
管理人が運用している Access は2010(DAO)、MySQLのバージョンは 5.7.1.8 です。
他府県にある職場内の専用PCをデータベースサーバーとして、自宅とはインターネットVPNにて接続・運用しています。
なお Access については中級者を対象としており、基本機能についての説明は省略しますのでご了承下さい。
MySQL についても、Access との連携については付属のサンプルデータベースの利用を前提としています。データベースやテーブルの新規作成・定義等の基本知識については、ネット上に優れた解説サイトがたくさんあるのでそれらを参照して下さい。

エキスパートの方から見た場合、適切でない記述も多々あると思われますので、「アホな事書いてるなぁ。」と感じられた場合は、ご遠慮なくコメントにてご指導ご鞭撻お願いします。

Webアプリの基本知識 - 何が必要か


Webアプリ開発はまだまだ入門レベルに過ぎないが、基本的な知識も少しは身についたのでまとめておく。

小規模事業者がMySQLで運用する社内システムをWebアプリ化するのに必要なソフトウェアは次のとおり。
中には"ソフトウェア"と呼ぶのは適切ではないものも含まれているが、とりあえずは便宜上そのように総称する事にした。
正確には、HTML以降のものは"スクリプト言語"と呼ばれているようだ。もちろんMySQLapache は他の製品でもかまわない。
これら以外に、ハードウェアとしてのサーバー機と固定IPアドレスの取得も必須。

ツール用途入手方法
MySQLデータベースフリーウエア
apacheWebサーバーフリーウエア
HTMLWebアプリの基本となる"ページ"の作成テキストファイルにタグを書くだけ
CSSアプリの外観デザインをレベルアップ同上
PHPデータベースの操作と簡易なアプリ機能テキストファイルにスクリプトコードを書くだけ
JavaScriptHTML文書に本格的なアプリ機能を付加する同上
jQueryアプリに必要な機能をまとめたJavaScriptのライブラリフリーウエア
Ajaxページの一部書き換えや"Access"のサブフォームに準じた機能も実現テキストファイルにスクリプトコードを書くだけ
これらがあれば、とりあえずは「いつでもどこでも動作する」アプリが作成可能となる。
インターネットブラウザが動作環境となるため、"MS-Access"や"Windows"が不要となるのが最大のメリット。
もちろん"OS"そのものは必須だが、もうマイクロソフトに限定される事はなくなるのである。
そして、すべてのソフトウェアが容易に入手可能である上に無料である事も大きなメリットとなる。

Web検索機能サンプルアプリでどう使われているか

  • MySQLデータベースがサーバー機上で動作している事
  • apacheが稼働しているWebサーバーの任意のディレクトリ内にCSSファイルとjQueryライブラリファイルをアップロード
    ※サンプルアプリではPHPファイル内にスタイル指定を書いているが、実際の運用では複数のページでシステムを構成する事になるので、独立したCSSファイルを利用しなければデザイン統一性を維持するための管理が煩雑になり過ぎる
  • Webアプリケーションとして機能するには、サーバーにアクセスした場合に既定の動作をする"index.html"、検索などを行うフォームを記述したページ、データベース処理を実行するページという、最小でも 5つのファイルが必要となる
    PHPファイルでのスクリプト処理の流れ
  1. 検索処理用PHPファイルにjQueryライブラリのリンク利用を記述する
    ※これだけでページ全体のイベント機能取得が可能になる(利用中のバージョンは"jquery-3.3.1.min.js")
  2. 検索用フォームと部品(テキストボックスやボタン)を記述
  3. 呼び出されて所定の機能を行う関数を記述
    ※<?PHP>ブロック内にPHP用関数、<script>ブロック内にJavaScript用関数を書く
  4. ページを開くと上から順に実行するが、関数は読み込まれるだけで呼び出されるまでは実行されない
  5. <script>ブロック内にJavaScriptのコードが書かれていれば、関数以外のコードはそのまま実行される
  6. フォームのオプションである"action = 移動先ページ名"により、ボタンが押されると指定されたフォームに切り替わる
    ※ボタン以外の要素でも"type=submit"であれば動作する
  7. フォームのオプションである"mothod='post'"により、フォーム内の部品に入力された値を他のページで利用出来る
  8. <script>ブロック内に書かれたjQueryの関数は、指定した部品で発生するイベントに応じて動作する
ごくおおまかにまとめるとこんな感じかな。やっぱり文章で表現するのは難しい事を実感する。( ´・ω・`)

あれ ? ちょっと待てよ。Ajax がどこにもないぞ !?
・・・いや実はあるのだ。以下次号。(;`ー´)

Web検索 - データベースへの引数処理

データベース制御を行う"DB_LIST_s.php"では冒頭で引数処理をしているのであらためて再確認。
例によって 2行目まではデータベース接続準備で、その次の行から引数処理である。

まずは最低限のセキュリティ対策として、検索語句に対して strip_tags($_POST['検索語句']) としている。
strip_tags は引数の文字列に対してHTMLタグを排除してくれる関数である。
これにより、$_POST["検索語句"] で受け取った文字列によってスクリプトコードが実行される可能性を未然に防止出来る。
後は、検索を開始する位置に関する変数に値をセットしているだけなので說明は省略する。

$DBHOST="mysql:host=localhost;dbname=sakila;charset=UTF8";
$DB=new PDO($DBHOST,"access","pass1234");
if(isset($_POST['検索語句'])){$検索語 = strip_tags($_POST['検索語句']);}else {$検索語="";}
if(isset($_POST["開始"])){$開始位置 = $_POST["開始"];} else {$開始位置 = 0;}
$開始表示位置 = $開始位置 + 1; // 結果表示用
$終了表示位置 = $開始位置 + 20; // 〃
$SQL = "Select * from film_list Where タイトル like '%$検索語%' Order by FID ";
$DATA=$DB->query($SQL); // クエリの実行
$件数 = $DATA->rowcount(); // 結果行数の取得
変数 $検索語 に$_POST に格納されたキーワードがセットされているのでこれを利用して SQL文の検索条件とし、クエリを実行して取得した行数を変数に代入。

$SQL = $SQL." limit $開始位置,20";
$DATA=$DB->query($SQL); // 20行単位で表示するためクエリを再実行
その後であらためて、20行ずつ表示するための limit オプション付加処理を行う。

2018-4-7 search_shouhin (4)
上は「man」という検索キーワードを入力して Enterを押したところだが、今回はこれに加えて

インクリメンタルサーチ機能

を追加してみよう。一文字入力するたびに検索結果が更新される"リアルタイム検索"である。
"search_shouhin.php"では jQuey によってページ内のイベントを監視出来る事は既述したが、当然キー入力についても可能である。
VBA の"OnKeyDown/キー入力時"プロパティと同様の機能である KeyUP メソッドを利用すれば良い。

$("#検索語").keyup(function(a){	// インクリメンタルサーチ
a.preventDefault();
開始位置=0;
DB処理();})
"search_shouhin.php"の script ブロック内に書くのだが、コードは"検索実行"ボタンや"次"ボタンと同じ要領なのでコピペして要素名を訂正するだけでも良いだろう。これだけでキー入力がある度に常に先頭位置から再検索するという動作になる。

180412shouhin_serch-5.jpg
「ba」という検索キーワードを入力したところ。1文字入力するたびに検索結果リストが更新されている。
ただし良く見れば分かるはずだが、検索だけでは上のサンプルと何も変わらないのでちょっとだけ表現にこだわってみた。

リンク済み表示のリセットと一行置きの着色

"タイトル"項目のリンクを何度かクリックしていると、タイトル文字が次第に「クリック済み」として既定のカラーに変わってしまい、うっとおしい感じがする。ブラウザの標準機能なので当たり前なのだが、スタイルシートを利用すれば元の文字カラーに統一出来る。
上記の機能を実現するため、"DB_LIST_s.php"の先頭に次のようなコードを追加した。

<style>
.LIST tr:nth-child(even) {background:#eee}
a:link {color:blue;}
a:visited {color:blue;}
</style>
スタイルシートは別ファイルでまとめるのが基本だが、ちょっとした処理だけなら直接書き込んでも良い。

"LIST"という名称でクラスを作成し、 tr:0 {background:#eee} によって一行置きの着色を行っている。
tr は、テーブルの行全体の改行動作に対応し、nth-child(even) で偶数行に対する動作を指定する。その動作の内容が背景を明るいグレーに着色する {background:#eee} である。
ちなみに奇数行にするには引数を nth-child(odd) とすれば良い。
もちろん、ここに書き込んだだけでは何も起こらないので、テーブルのオプションでクラス名を追加している。
Print "<table cellspacing='2' class='LIST'>";

a:link(リンク前) と a:visited(リンク済み)は、リンク文字列に関する着色指定。今回の用途では a:visited だけでも良いのだが、ページのスタイルによってはリンク前のカラーが異なっている可能性も考慮し、利用法とも同色に指定する事で対処している。

ボタンクリックでリストの表示 /非表示を切替

"search_shouhin.php"に追加した"リスト表示切替"ボタンは、必須機能ではなく、ちょっとしたお遊びである。
<input type = "button" id="B2" value = "リスト表示切替" onclick = LIST()>

<script>
:
function LIST() // 検索結果ブロックの表示/非表示を切替
{$("#検索結果").slideToggle();}
:
</script>
script 内に作成した LIST() 関数によって、"検索結果"ブロックの表示制御をわずか一行のコードで行っている。
slideToggle() は、ページ内の指定エリアをスムーズに表示/非表示に切り替える事が出来る便利なメソッド。

180412shouhin_serch-6.jpg
リスト内のボタンに表示していた"商品番号"を"選択"という表示に変更して位置を右端に移動し、完成した商品検索ページ。
検索機能に限らないが、凝りだすとキリがないので、とりあえず目的の機能は実現出来たので、全コードの掲載。
"search_shouhin.php"
<head>
<title>Webアプリ実用品を目指す ( ´ー`)</title>
<h1>商品検索</h1>
<script type = "text/javascript" src ="jquery-3.3.1.min.js"></script>
</head>

<form name="検索メニュー" method="POST">
検索語 :
<input name="検索語" type="text" id="検索語">
<input type = "submit" value = "検索" name="検索実行" id="検索実行">
<input type = "reset" value = "クリア">
<input type = "submit" id="前" value = "<" >
<input type = "submit" id="次" value = ">" >
<input type = "button" id="B2" value = "リスト表示切替" onclick = LIST()>
</form>
<div id="検索結果">ここに検索結果リストを表示</div>

<script type='text/javascript'>
var 開始位置 = 0;
//$(document).ready(function(){}); // イベントを感知する準備(ページ要素を全部読み込むまで待機)
$("#検索結果").hide(); // 結果リストエリアを非表示にする
$("#検索実行").click(function(a){
a.preventDefault(); // 既定の動作をキャンセル ※送信の抑止
開始位置 = 0;
DB処理();
});

$("#次").click(function(a){
a.preventDefault();
開始位置 = 開始位置 + 20;
DB処理();
});

$("#前").click(function(a){
a.preventDefault();
if(開始位置 >= 20){開始位置 = 開始位置 - 20} else 開始位置 = 0;
DB処理();
});
$("#検索語").keyup(function(a){ // インクリメンタルサーチ
a.preventDefault();
開始位置=0;
DB処理();})


function DB処理(){
$("#検索結果").show(); // 結果リストエリアを表示
var 検索語 = $("#検索語").val();
$.post("DB_LIST_s.php", {検索語句:検索語,開始:開始位置}, function(data){
if (data.length>0){$("#検索結果").html(data);} })
}

function LIST() // 検索結果ブロックの表示/非表示を切替
{$("#検索結果").slideToggle();}
</script>

"DB_LIST_s.php"
<style>
.LIST tr:nth-child(even) {background:#eee}
a:link {color:blue;}
a:visited {color:blue;}
</style>
<?php
$DBHOST="mysql:host=localhost;dbname=sakila;charset=UTF8";
$DB=new PDO($DBHOST,"access","pass1234");
if(isset($_POST['検索語句'])){$検索語 = strip_tags($_POST['検索語句']);}else {$検索語="";}
if(isset($_POST["開始"])){$開始位置 = $_POST["開始"];} else {$開始位置 = 0;}
$開始表示位置 = $開始位置 + 1; // 結果表示用
$終了表示位置 = $開始位置 + 20; // 〃
$SQL = "Select * from film_list Where タイトル like '%$検索語%' Order by FID ";
$DATA=$DB->query($SQL); // クエリの実行
$件数 = $DATA->rowcount(); // 結果行数の取得
if($件数 == 0){ Print "<font color=red>該当なし (´д`)</font>";exit;}

$SQL = $SQL." limit $開始位置,20";
$DATA=$DB->query($SQL); // 20行単位で表示するためクエリを再実行
Print "検索結果 = $開始表示位置 番目から $終了表示位置 番目(全 $件数 件) <br>";
Print "<form name = 'SEL' method = 'POST' action='shouhin_info.php'>";
Print "<table cellspacing='2' class='LIST'>";
Foreach ($DATA as $ROW){
Print "<td width='300'><a href ='shouhin_info.php?行番号=".$ROW["FID"]."'>"
.$ROW["タイトル"]."</a></td>";
Print "<td>".$ROW["カテゴリ"]."</td>";
Print "<td style='font-size:small'>".mb_substr($ROW["概要"],0,40)."</td>";
// 指定文字数を取り出す substr 関数は日本語で文字化けするため mb_substr を使用する
$ref="location.href='shouhin_info.php?行番号=".$ROW["FID"]."'";
Print "<td><input type='button' id='行番号ボタン' style='width:60px'
value='選択' onclick=$ref ></td>";

Print "</tr>";
}
Print "</table>";
Print "</form>";
?>

Web検索 - jQuery でデータベース制御

最後になったが、今回から検索の中核処理に入る。
まず重要なのは、PHP や HTML のスクリプト内からデータベースを操作するには、jQuery が必須である事。

180410shouhin_serch.jpg
"search_shouhin.php"ファイルを開くと、検索用のフォームが表示される。
ここまでは HTMLの機能。そして、これ以降は jQuery の機能である。

180410shouhin_serch-2.jpg
"検索"ボタンを押すと、商品番号順に先頭から20行分を表示。

180410shouhin_serch-3.jpg
">"ボタンを押せば次の20行を表示する。"<"はその逆の動作となる。

180410shouhin_serch-4.jpg
キーワードを入力して Enter を押すか、"検索"ボタンをクリックすれば条件に合致したレコードのみを表示する。
この一連の動作の間、ページの更新は発生せず、すべて"ID = 検索結果"のブロックのみが書き換えられるようになっている。

このような機能は PHP や HTML だけでは実現出来ない。そして、JavaScript を使用すれば一部の描画は可能だが、データベースを制御してその結果を表示するには更に jQuery が必要となる。
とはいえ jQuery は、JavaScript で作成されたライブラリ。つまり実際には JavaScript でも実現可能なのだが、非常に煩雑なコード記述が必要なため、アプリとして必要とそれるさまざまな機能を容易に利用出来るように提供されている。しかも無償で。( ´ー`)

jQeyry を利用するには、ライブラリをダウンロードして任意のフォルダに保存し、head 内にそのパスを書くだけ。
下のスクリプト内の <script> タグで囲んだ 4行目(赤文字部分)である。
ここでは、アプリ用のファイルと同じフォルダに保存しているのでフォルダパスは省略してある。
head の後の form ブロックは、
<form name="検索メニュー" method="POST">
としているので、submit の設定されたボタンをクリックすると、通常はサーバーにデータを送信してページの更新が発生する。
しかし、jQuery の機能を利用すれば、送信を抑止した上で $_POST 変数だけを取得する事が出来るのだ。
このフォームは $_POST 変数を生成させるだけの役目なので、名前や ID は省略しているが、フォーム内の制御すべき要素にはすべて"ID"を付けている。JavaScript や jQuery はこの"ID"によってオブジェクトの識別を行うので必須である。
もちろん、"ID"はページ内でユニークな値でなければならない。
今回も、読みやすさを優先して必要最低限の記述で 50行弱でまとめた。すなわちエラー処理などは二の次である。( ´ー`)

<head>
<title>Webアプリ実用品を目指す ( ´ー`)</title>
<h1>商品検索</h1>
<script type = "text/javascript" src ="jquery-3.3.1.min.js"></script>
</head>

<form name="検索メニュー" method="POST">
検索語 :
<input name="検索語" type="text" id="検索語">
<input type = "submit" value = "検索" name="検索実行" id="検索実行">
<input type = "reset" value = "クリア">
<input type = "submit" id="前" value = "<" >
<input type = "submit" id="次" value = ">" >
</fom>
<input type = "button" id="B2" value = "リスト表示切替" name="実行" onclick = LIST()>
<div id="検索結果">ここに検索結果リストを表示</div>

<script type='text/javascript'>
var 開始位置 = 0;
$("#検索結果").hide(); // 結果リストエリアを非表示にする
$("#検索実行").click(function(a){
a.preventDefault(); // 既定の動作をキャンセル ※送信の抑止
開始位置 = 0;
DB処理();
});
$("#次").click(function(a){
a.preventDefault();
開始位置 = 開始位置 + 20;
DB処理();
});
$("#前").click(function(a){
a.preventDefault();
if(開始位置 >= 20){開始位置 = 開始位置 - 20} else 開始位置 = 0;
DB処理();
});

function DB処理(){
$("#検索結果").show(); // 結果リストエリアを表示
var 検索語 = $("#検索語").val();
$.post("DB_LIST_s.php", {検索語句:検索語,開始:開始位置}, function(data){
if (data.length>0){$("#検索結果").html(data);}
})
}

function LIST() // 検索結果ブロックの表示/非表示を切替
{$("#検索結果").slideToggle();}
</script>

PHPスクリプトの後半部分が <scipt> で始まる jQuery のコードである。
本サンプルで使用している jQuery は、オブジェクトとメソッドの組み合わせがほとんど。
$("#オブジェクト名").メソッド
という書式が基本である。
var 開始位置 = 0;
$(document).ready(function(){ }); // イベントを感知する準備
$("#検索結果").hide(); // 結果リストエリアを非表示にする
最初にデータベース操作に使用する変数を用意し、次のコードによってページ内でのイベント発生をリアルタイムで監視する事が出来るようになる。
そして、hide メソッドで"検索結果"ブロックを非表示としている。これらは最初のページ読み込み時に実行されるので、
<form name="検索メニュー" method="POST"> で作成された見出し文字列は開く時に一瞬表示された後で消去される。

これ以降は function となっているので、実行はされない。その最初の処理がデータベース操作となる。
    $("#検索実行").click(function(a){ 
a.preventDefault(); // 既定の動作をキャンセル ※送信の抑止
開始位置 = 0;
DB処理();
});
ID が"検索実行"となっているボタンをクリックすると動作し、開始位置変数を初期化して DB処理 関数を呼び出している。

function DB処理(){ 
$("#検索結果").show(); // 結果リストエリアを表示
var 検索語 = $("#検索語").val();
$.post("DB_LIST_s.php", {検索語句:検索語,開始:開始位置}, function(data){
if (data.length>0){$("#検索結果").html(data);}
})
}
DB処理() 関数だが、ここで行っているのは、
  1. show で"検索結果"ブロックを表示
  2. テキストボックスの値を検索語変数に格納
  3. $.post ( )で前回作成した"DB_LIST_s.php"を開いて波括弧内に書いた引数を渡す
  4. その結果生成される HTMLコードを data として取得
  5. html(data) によって"検索結果"として表示する
という処理になる。検索語句開始$_POST の配列変数に格納されるので、"DB_LIST_s.php"ではこれらを参照してSQL文を組み立てるようになっていれば良い。

一見したところは煩雑なプログラムに見えるのだが、基本事項さえ理解出来ればまったくシンプルに実現出来るのだと感嘆する。
jQuery の利用により、今までの試行錯誤は何だったんだ!? というくらいに容易にデータベース操作が可能になるのである。
さらに次号に続く。( ´ー`)

Web検索 - 結果リストからの選択処理

リンク機能で他のページにジャンプして詳細情報を表示するには

リンク機能を実装しているのが前回にあげた
    $ref="location.href='shouhin_info.php?行番号=".$ROW["FID"]."'";
Print "<td><input type='button' style='width:60px'
value=".$ROW["FID"]." onclick=$ref ></td>";
Print "<td width='300'><a href ='shouhin_info.php?行番号=".$ROW["FID"]."'>"
.$ROW["タイトル"]."</a></td>";
というスクリプトコード。
最も簡単で汎用的なのが <a href = 'URL' > タグを使用する方法である。
この時同時に引数として"キーワード = 値"を ? に続けて付加してやれば良い。PHPスクリプト内では、
Print "<a href ='移動先ページのURL?キーワード = 値' ></a>";
となる。ちょっと說明が前後するがタイトル項目ではこの方法を使用している。
見やすくするためスタイル指定とテーブル関係のタグを省略すると、
<a href ='shouhin_info.php?行番号=".$ROW["FID"]."'>".$ROW["タイトル"]."</a>";
となる。結果リストのすべての行には、配列変数 $ROW["FID"] によって個別の値が設定されているので、これを引数として付加してやるだけである。今回のサンプルでは、検索結果の先頭行では
<a href ='shouhin_info.php?行番号="1"'>"ACADEMY DINOSAUR"</a>";
という文字列が生成される事になる。これにより、タイトルのリンク文字をクリックすれば"shouhin_info.php"ページに切り替わる。

ボタンクリックで他のページにジャンプするには

ボタンクリックでのリンクには、onclick (イベント属性)を使用するためタグが少し異なる。
Print "<input type='button' value='ボタンの文字' onclick="location.href='URL?キーワード = 値' '">"
となる。ただし一目見て分かるはずだが、引用符の入れ子が矛盾(重複)するのでこのように書くと動作しない。
今のところスマートに解決する方法を思いつかないので・・・
この場合は、いったん引数部分を変数に格納してやればシンプルに処理出来る。それが、
$ref="location.href='shouhin_info.php?行番号=".$ROW["FID"]."'"; 
のコードである。これにより、文字列リンクと同じ機能となる。
ボタンのタグ内で onclick=$ref としてやれば、PHPにより変数部分を値に変換してくれるので、
5行目のボタンをクリックすると、実行時には onclick="location.href='shouhin_info?行番号 = 5' '"
として html コードが生成される。

引数を受け取って詳細情報ページを表示する

これは意外とカンタン。( ´ー`)
商品の詳細情報を表示するPHPファイルを作成し、グローバル変数の $_GET でリンク情報を取得すれば実現する。
<h1>商品情報</h1>

<?php
$DBHOST="mysql:host=192.168.0.101;dbname=sakila;charset=UTF8";
$DB=new PDO($DBHOST,"access","pass1234");
$番号 = 1;
if(isset($_POST["行番号"])){$番号= key($_POST["行番号"]);}
else if(isset($_GET["行番号"])) $番号=$_GET["行番号"];
$SQL = "Select * from film_list Where FID = $番号";

$DATA=$DB->query($SQL); // クエリの実行
$件数 = $DATA->rowcount(); // 結果行数の取得
if($件数 == 0){ Print "<font color=red>該当なし (´д`)</font>";exit;}
$ROW = $DATA->fetch(PDO::FETCH_ASSOC); // 先頭行の取得
Print "<table border='1' width='800'>";
Print "<td width='100'>商品番号</td><td>".$ROW["FID"]."</td><tr>";
Print "<td>タイトル</td><td>".$ROW["タイトル"]."<tr>";
Print "<td>概要説明</td><td>".$ROW["概要"]."</td><tr>";
Print "<td>出演者</td><td >".$ROW["出演者"]."<tr>";
Print "<td>カテゴリ</td><td>".$ROW["カテゴリ"]."<tr>";
Print "</table>";
?>
<br>
<input type="submit" value="前の画面に戻る" onclick="history.back()">
<input type="button" value="検索画面に戻る" onclick="location.href='search_shouhin.php'">
上のスクリプトで注意すべきは赤文字にした条件判定部分。
汎用的に利用出来るよう、form 内のパーツ(要素)から $_POST 変数を引き渡された場合にも対応出来るようにしている。
ただし、$_POST の場合は key 関数で配列内の値を取得しなければならない。
$番号 = 1;
if(isset($_POST["行番号"])){$番号= key($_POST["行番号"]);}
else if(isset($_GET["行番号"])) $番号=$_GET["行番号"];
$SQL = "Select * from film_list Where FID = $番号";
$_POST["行番号"]$_GET["行番号"] というグローバル変数がすべて未定義であった場合またはこのページを単独で開いた場合には商品番号 1番の情報を表示するように、初期値を代入した $番号 という変数を最初に用意してある。

180409shouhin_info.jpg
商品番号 16 を選択して詳細情報を表示させたところ。機能実現最優先のため見栄えは無視している。( ´ー`)
"前の画面に戻る"ボタンの onclick="history.back() は、単に直前(呼び出し元など)のページに戻るのに使う。
このボタンを使うと、検索結果リストを表示したままの状態で検索ページに戻る事が出来る。
アクセス数
カレンダー
03 | 2018/04 | 05
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 - - - - -
最新記事
カテゴリ
PHP (5)
最新コメント
月別アーカイブ
全記事表示リンク

全ての記事を表示する

リンク
検索フォーム