忍者ブログ
バナヤンの忍者風呂
忍者ブログのカスタマイズ、各種WEBツールのテストなど試行錯誤の日々。 VMLによる地図の作成を研究していましたが、一時中断して、今はPHPを勉強しているところです。
ニュース
この欄には、このブログの内容に関連するニュースを掲載する予定です。
お知らせ
この欄には管理人からのお知らせなどを掲載します。
[72] [73] [74] [75] [76] [77] [78]

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

PHP + SQLite データベース選択ページ

PHPとSQLiteを勉強中です。

前回の「PHP ディレクトリ内のファイルリスト(scandir) 」では、特定のディレクトリ内にあるファイルの一覧を取得してみました。そのサンプルとしてSQLiteデータベースの選択ページをお見せしました。

投稿後、見直す点が多々あることに気づきましたので、今回は修正したものを示すことにしました。

まず第1点目は、ページ構成の流れの部分です。前回の時点では、この部分については、あまり考慮しないで作成していました。サイトのページ構成は、トップページから目的のページまで、読者にわかりやすいようにしたいものです。理想は一発で目的のページが出るのが理想ですが、すべてを1つのページにまとめるのは困難ですから、ワン・ツー・スリーと3段階ぐらいまでが許容限度かと思います。3段階のページ移動を考えると、サイトトップ→カテゴリトップ→個別ページと移動する流れを考えることになります。

第2点目は、画面レイアウト上、第1点目をどのように実現するかということです。具体的には、ページ誘導のナビゲーションの部分です。ナビゲーションは、すべてのページが統一されていないとわかりずらくなってしまいます。したがって、ナビゲーションの位置が固定されて表示されることが望まれます。

そこで、今回はナビゲーションを上方のバーに置くこととし、バーの上側でカテゴリ、バーの下側で個別ページの選択をできるようにしました。もちろん、サイドバーを用いるレイアウトもあります。サイドバーを使用するレイアウトでは、レイアウトの整形のためTABLE要素を使用したり、スタイルシートでブロック要素をfloatにしたりと、ちょっとしたテクニックが必要になります。その点、上方のバーの上下でナビゲーションをする方法は、もっと簡便です。若干スタイルシートの工夫をしますが、floatを使用する場合よりも画面が崩れるようなことは少ないと思います。

第3点目は、前回の記述の中には、不要な記述がありました。この点は手直ししました。

それでは、まず画面イメージです。
[画面イメージ]TOPページ-データベース選択画面
SQLiteデータベース選択ページ・イメージ

上の画面でデータベースを選択した後、「TABLE」のカテゴリをクリックすると、下のようなカテゴリのトップページに移ります。

[画面イメージ]カテゴリ・TABLE選択画面
SQLiteデータベーステーブル選択ページ・イメージ

前のトップページで選択したデータベースは、セッションで保持され、このページで参照できるようになっています。ナビゲーションバーの下側のタブをクリックすると個別ページに移れます。

スクリプトも変更しているので示しておきます。

[ソース]TOPページ-データベース選択画面---sqlite_utility.php

<?php
#################### HTTPヘッダ ####################
// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
// HTTP/1.0
header("Pragma: no-cache");
#################### セッション #####################
session_start();
?>

<?php
############# 定義関数のインクルード#################
include_once('sqlite_utility.inc.php');
?>

<?php
####################  設定  ####################
//// データベース・ディレクトリ
$dirname='../db';
$files=scandir($dirname);
//// データベース
if($_SESSION['db']){
$dbname=$_SESSION['db'];
}
if($_POST['item']){
$dbname=$files[$_POST['item']];
$_SESSION['db']=$files[$_POST['item']];
}
?>


<!-------------------- HTML -------------------->
<html>
<head>
<link rel="stylesheet" type="text/css" href="sqlite_utility_style.css">
<style type="text/css">
<!--
-->
</style>
</head>
<body>
<h1>SQLite Utility</h1>
<div class='note_right'>
Current Directory : <?= dirname($_SERVER[PHP_SELF]) ?>
 | Database Directory : <?= $dirname ?>
</div>
<!-- Category navi -->
<div class='category'>
<div class='current_ctg'><a href='sqlite_utility.php'>Database</a></div>
<div class='ctg'><a href='sqlite_utility_table.php'>TABLE</a></div>
<div class='ctg'><a href='sqlite_utility_table.php'>VIEW</a></div>
</div>
<h2>
Database : <?= $dbname ?>
</h2>
<div class='navi'>
<div class='current_tab'>Choose</div>
</div>

<?php
$count=radio_files($files);
?>

</body>
</html>


[ソース]インクルードファイルの一部---sqlite_utility.inc.php

### 配列をラジオボタン付フォームで表示
###(ディレクトリ内のファイルの配列用)
### 総行数を返す
function radio_files($files){
$count=count($files);
echo "<form class='choice' method='post' action='$_SERVER[PHP_SELF]'>\r\n";
for($i=2;$i<$count;$i++){
echo "<input type='radio' name='item' value='$i'>".$files[$i]."\r\n";
}
echo "<input type='submit' name='choice' value='Go'>\r\n";
echo "</form>\r\n";
return $count;
}


[ソース]カテゴリトップ---sqlite_utility_table.php

<?php
#################### セッション #####################
session_start();
// データベース未設定の場合
if(!$_SESSION['db']){
header("Location:sqlite_utility.php");
}
#################### HTTPヘッダ ####################
// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
// HTTP/1.0
header("Pragma: no-cache");

?>

<?php
#################### 定義関数のインクルード ####################
include_once('sqlite_utility.inc.php');
######################################################
?>
<?php
####################  設定  ####################
//// データベース
$dbname=$_SESSION['db'];
//// データベース接続
if(!$dbh){
$dbh = sqlite_open($dbname);
}
//// テーブル
$array = sqlite_tablename($dbh);
$table = $array[$_POST['item']];


##########################################################
?>


<!-------------------- HTML -------------------->
<html>
<head>
<link rel="stylesheet" type="text/css" href="sqlite_utility_style.css">
<style type="text/css">
<!--
-->
</style>
</head>
<body>
<h1>SQLite Utility</h1>
<div class='note_right'>
Current Path : <?= $_SERVER[PHP_SELF] ?>
</div>
<!-- Category navi -->
<div class='category'>
<div class='ctg'><a href='sqlite_utility.php'>Database</a></div>
<div class='current_ctg'><a href='sqlite_utility_table.php'>TABLE</a></div>
<div class='ctg'><a href='sqlite_utility_table.php'>VIEW</a></div>
</div>
<h2>
Database : <?= $dbname ?> TABLE: <?= $table ?>
</h2>
<div class='navi'>
<div class='current_tab'>SELECT * FROM</a></div>
<div class='tab'>INSERT INTO</a></div>
</div>

<?php
$count = radio_array($array);
?>
<h4><?= $table ?></h4>
<table>
<?php
if($table){
sqlite_field_names($dbh,$table);
sqlite_select($dbh,$table);
}
?>
</table>
</body>
</html>


[ソース]インクルードファイルの一部---sqlite_utility.inc.php

### テーブル名の配列を返す
function sqlite_tablename($dbh){
$query = "SELECT name FROM sqlite_master WHERE type='table'";
$result = sqlite_array_query($dbh,$query);
foreach($result as $row){
$array[] = $row[name];
}
return $array;
}

### 配列をラジオボタン付フォームで表示
### 選択したアイテム番号を返す
function radio_array($array){
$count=count($array);
echo "<form class='choice' method='post' action='$_SERVER[PHP_SELF]'>\r\n";
for($i=0;$i<$count;$i++){
echo "<input type='radio' name='item' value='$i'>".$array[$i]."\r\n";
}
echo "<input type='submit' value='Go'></form>";
return $count;
}
### テーブルのフィールド数を返す
function sqlite_fields($dbh,$table){
$query = "SELECT * FROM $table";
$result =sqlite_query($dbh,$query);
$fields = sqlite_num_fields($result);
return $fields;
}

/// 指定したテーブルのフィールドネーム
### <tr><th>フィールドネーム</th>・・・</tr>
function sqlite_field_names($dbh,$table){
$query = "SELECT * FROM $table";
$result =sqlite_query($dbh,$query);
$fields = sqlite_num_fields($result);
echo "<tr class='field_name'>";
for($i=0;$i<$fields;$i++){
$field_name=sqlite_field_name($result,$i);
echo "<th>".$field_name."</th>";
}
echo "</tr>";
return $field_name;
}

/// 指定したテーブルの結果セット
### <tr><th>フィールドネーム</th>・・・</tr>
function sqlite_select($dbh,$table){
$query = "SELECT * FROM $table";
$result =sqlite_query($dbh,$query);
$rows = sqlite_num_rows($result);
$fields = sqlite_num_fields($result);
for($j=0;$j<$rows;$j++){
$row=sqlite_fetch_array($result);
echo "<tr>";
for($i=0;$i<$fields;$i++){
echo "<td>".$row[$i]."</td>";
}
echo "</tr>";
}
return $field_name;
}


[スタイルシート]

h1 {
margin:0;
padding:2px;
border-bottom:#363 solid 2px;
background-color:#fff;
font-size:12px;
color:#363;
}
h2 {
margin:0;
height:24px;
padding:4px;
border-top:#030 solid 1px;
background-color:#363;
font-size:12px;
color:#fff;
}
h3 {
margin:4px;
font-size:12px;
}
h4 {
margin:0;
padding:4px;
border-top:#363 solid 1px;
background-color:#696;
font-size:12px;
color:#fff;
}
.category{
margin:0;
padding:0px;
background-color:#fff;
font-size:12px;
color:#363;
}
.ctg{
display:inline;
border-top:#363 solid 1px;
border-right:#363 solid 1px;
background-color:#cfc;
padding:4px;
}
.ctg a {
color:#363;
}
.current_ctg{
display:inline;
border-right:#363 solid 1px;
background-color:#363;
padding:5px;
color:#fff;
}
.current_ctg a {
color:#fff;
}
.navi{
margin:0;
background-color:#fff;
font-size:12px;
color:#363;
}
.tab{
display:inline;
border-bottom:#363 solid 1px;
border-right:#363 solid 1px;
background-color:#cfc;
padding:4px;
}
.tab a {
color:#363;
}
.current_tab{
display:inline;
border-right:#363 solid 1px;
background-color:#363;
padding:5px;
color:#fff;
}
.current_tab a {
color:#fff;
}
.note_right {
margin:0px 4px;
font-size:11px;
text-align:right;
}
table ,th ,td {
border-collapse:collapse;
border:#030 solid 1px;
}
.field_name {
background-color:#9c9;
}
.choice {
margin:6px;
}



PR
QRコード
忍者ブログ [PR]
Copyright (C) 2006 banayan ALL RIGHTS RESERVED.