Level 6 WWWインタフェースを持つデータベース閲覧システムの作成

作成したデータベースを、WWW形式で、検索するシステムを構築せよ。 つまり、WWW サーバをCGI,Servlet,PHP対応にし、そこから、データベースにアクセスできるようにする。 ヒント: 使用する言語は任意で良い。level 5 をこちらで兼ねても良いが...

Level5で作成したプログラムを変更しhtmlから値を受け取るQBE方式のシステム を作成する。フォームから値を受け取りSQL文を生成し、htmlで出力する。

作成したシステム

中村電機 オンラインショップ
賞味期限  2006/01/15頃


プログラム

メインページ : oratest.php
require('sql.php');

--form部は省略--

//FORMから値を受け取ってSQLを生成する関数へ渡す処理
if(isset($_POST['st_w'])){
$cate_id = $_POST["cate"];
$item_word = htmlspecialchars(trim($_POST["item_word"]));
$maker_word = htmlspecialchars(trim($_POST["maker_word"]));
$serial_word = htmlspecialchars(trim($_POST["serial_word"]));
$price = htmlspecialchars(trim($_POST["price"]));
$highlows = $_POST["highlows"];

//print "$cate_id,$item_word,$maker_word,$serial_word,$key_word
"; $sql=make_sql($cate_id,$highlows,$item_word,$maker_word,$serial_word,$price); //$sql="select * from item"; echo $sql;//debug /* 検索結果を受け取ってhtmlで表示する処理 */ list($ros,$res)=select_data($sql); print "<center>"; print "検索結果 : $ros 件ヒットしました。
"; print "</center>"; print "<center><table cellpadding=15 cellspacing=0 bgcolor#ffffaa width=80%>"; for($i=0;$i<$ros;$i++){ reset($res); $a=0; while($val=each($res)){ $data=$val['value']; $tmp[$a++]=$data[$i]; } --省略-- }

メインページはQBE方式をFORMを使用して実現している。FORMに入力された値を SQL文を生成する関数に渡し、生成されたSQLを実行しその結果を受け取って整形 して表示する。

関数sql.php
//SQL文を生成する関数
function make_sql($cate,$highlows,$item,$maker,$serial,$price){
 --省略--    
    $sql="select * from ".$table;
   if($item != NULL){
   $fr=TRUE;
   $item=str_replace(' ',' ',$item); //全角スペースを半角スペースに変換
   //スペースで区切られた入力を
   $buf=ereg_replace('[[:space:]]',"%' OR ITEM_NAME LIKE '%",$item);
   $sql = $sql." where "."ITEM_NAME LIKE '%".$buf."%' ";
   }
   --省略--
    /*
    カテゴリを指定しない場合は全てのテーブルから検索する。
    */
    if($table_all){
    for($i=1;$i<count($category);$i++){
        $tmp=$tmp.str_replace('TB',$category[$i],$sql);
	    if($i%(count($category)-1)!=0){
	    $tmp=$tmp." UNION  ";
	        }
		}
		$sql=$tmp;
    }
    $fr=FALSE;
    return $sql;    
}
//SQLを実行する関数
function select_data($sql){
    $con=oci_connect(USER,PASS,DB); //接続
    $stmt=oci_parse($con,$sql); 
    if(!oci_execute($stmt,OCI_DEFAULT)){
    echo "oi! select?n";
    return;
    }
    //oci_commit($con);

    $ros=oci_fetch_all($stmt,$res);
    return array($ros,$res);
    oci_close($con); //切断
}

Level5での問題点だった"カテゴリを指定しない"で検索を実装した。カテゴリを 指定しない場合は全てのテーブルにアクセスしその結果をUNIONでくっつけて表 示することにした。この方法だと、検索結果が膨大になってしまうという問題が ある。検索結果が多い場合の処理は実現できなかった。以降のLebelで改良して いく。

実行結果

賞味期限が切れてしまうと実行できなくなるため念のため。

検索条件を入力して検索ボタンを押す。

上記のようにちゃんと検索結果が表示されている事がわかる。

以上
Level5 index Level7