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