新規作成 | ページ一覧 | RSS | MobileMemo | 検索 | ヘルプ | ファイル登録 | 更新履歴 | ログイン

トップページZaurusSL-C3000MySQL > 映画データベースを作る

ZaurusSL-C3000/MySQL/映画データベースを作る - データベース作成の練習

映画データベースを作ってみる

はじめに

TOP↑

ZaurusSL-C3000/初期設定/ハードの設定と初期インストールその5で 「apache+PHP+MySQLでデータベースを動かす」というのを書いたが、具体的にスクリプトが記載しなかった。というのも、本の丸写しはさすがにできなかったからである。


今回、「MySQL入門以前」ISBN:4839916578の「住所録」・「何でもデータベース」を作るという章を参考にして映画データベースを作ってみた。

映画データベースは、自分の見た映画やDVDを記録するためのもので、当初ClieのHandbaseで作業していたが、Zaurusへの移行にともない現在Portabase上で実際に作成した。しかし検索スピードが遅かったりフィルターが手間取ったりするので、MySQL+PHPに移そうと考えていたので勉強がてら作ってみた。

基本的なプログラムは「MySQL入門以前」の「住所録」および「何でもデータベース」の
スクリプトをベースにしている。また、頁単位で表示するところは、サムさんのものをベースにしています。そのため、MySQLの呼び出し方やechoとprintの使い方など統一がとれていないところがあることは承知しており、そういう不統一があるのはご理解ください。
一応、選択リストとラジオボタンを活用した例となっているので、他のものを作るときは少しは参考になればと思う。データの量が少ないとあまりスピードが実感できないが、「MySQL入門以前」に添付されている人物データベース6000件を使って検索するとそのスピードが実感できると思う。

注意
各スクリプトはコピーしてEUCで保存して使ってください。なお、ここに掲載しているスクリプトではエラー処理、ザウルスへの外部からのアクセスの制御などは全く行っていません。(MySQL入門以前のレベルではエラー処理はできないのです。)
例えば、MySQLへアクセスする場合もアクセスできなかったときの処理などを書くのが普通のようですがZaurusの話なので不特定多数が使うのは想定していません。
また、実際使ってみてPCでは正常に表示されるのですがZaurusだと文字化けすることが多いようです。多分MySQLのバージョンが古いためかと思われます。サムさんに教えていただいたEUCで登録するとほとんど文字化けがなくなると思います。
テストはPC上で行ったのですが、WindowsXPの母艦では逆にスクリプトやデータをEUCで登録するとIEでは逆に文字化けするので、Shift-JISを使用しなければならないようだ。(何か工夫をすればよいのかもしれませんがわかりません。)もちろん自己責任でお願いします。
もしもバックアップをとるのならば、ひとつはエクスポートしてテキストで保管する方法と、もうひとつはMySQLのデータそのものを別の場所にコピーしておくことなどをおすすめします。
お願い
私の技量はMySQL入門以前の段階ですので、一応動くのは確認していますが、間違っていたり、こういうふうに書いた方がよいよということがあれば、是非コメント欄でご指導ください。

関連リンク

TOP↑

映画データベースの設計

TOP↑
No.項目内容フィールド名属性備考
0連番idint自動連番
1登録日kyoudate登録した日、自動登録
2題名namechar(100)邦題(/原題)のように書く
3媒体baichar(12)劇場、保有・レンタル、DVD・ビデオ
4鑑賞日mitadate鑑賞した日「2005-5-30」という形式、半角
5分類bunchar(40)プルダウンジャンル別に記載
6制作年nenint4桁の整数、不明は0
7制作国kunichar(20)プルダウン国名は別に記載
8主演hitochar(200)全角100文字まで
9監督kanchar(100)全角50文字まで
10内容nakatext映画内容、感想など
11評価tenint5段階評価半角数字で

MySQLでデータベースを作る

TOP↑
$ su
# mysql
Welcom......
mysql> use mydb;
Database changed
mysql> create table eiga (id int not null auto_increment,kyou date,name char(100),
mysql> bai char(12), mita date, bun char(40), nen int,
    -> kuni char(20), hito char(200), kan char(100), naka text,
    -> ten int,index ind1(id));
0 tab 2005-05-05 tab キャットウーマン tab SF tab 2003 tab 米 tab ・・・・
idのところはダミーで0を記入
テキストのところは改行があるときは「¥n」という記号を書き込み、当然改行せずに
続けて書く。
キャットウーマンの誕生¥nバットマンは出てこない。¥n次回作にはきっと

mysql> load data local infile '/mnt/cf/Documents/Csv_Files/eiga.txt'
   -> into table eiga;
お知らせ
通勤電車で地下探検LimitedさんのところにCSVで取り込む方法が書かれています。
mysql> select * into outfile '/mnt/cf/Documents/CSV_Files/out.txt' 
    -> fields enclosed by '"' terminated by ',' from eiga;
mysql> select * into outfile '/mnt/cf/Documents/CSV_Files/out.txt'
    -> fields  terminated by '\t' from eiga;

なお、試しに書き出してみるとテキストエリアの中の改行が¥<改行>のようなコードで変換されているようだ。もとにもどすにはエディターで(QXエディターの場合)、¥¥¥nを¥¥nに置き換えればよいようだ。

注意
zaurusでエクスポートにエラーコード28で失敗する場合は、日本MySQL会のマニュアルにあるように、suでmysqld、そしてtmpdir=/home/tempのように指定してやり、このtempフォルダーに出力ファイルを書き出すとよいようだ20060214

全体の設計

TOP↑
左フレーム右フレーム
全件表示データが降順に並ぶ
データ登録新規のデータ登録
一行検索1つの項目について検索する。
検索されたデータには修正、削除コマンドがつく
コマンドボタンから修正画面と削除画面に移る。
重要
リセットボタンを押してもデータが消去されず画面上残る場合があります。
その場合はデータも残ったままなので、登録ボタンを押す前に表示されている文字を消去してください。



■全体の構成

なお、画像をeigaのフォルダーに置いて、テキストの欄に次のようなhtml文を記入すれば画像の表示も可能。中にimgフォルダーを作ったときは/img/52.jpgのように書けばよい。

<img src="52.jpg" width="20%">

イメージ入りの例

http://homepage1.nifty.com/spen/img/scrn070.jpg

Index.htmlのスクリプト

TOP↑

index.htmlとしておくとアクセスが楽。フレームは左側を20%としてみた。(10%とか15%とか変更してみたがZaurusだと変わらないようだ・・・と思ったがNetFrontのキャッシュがきつくて、画面に反映されないだけだった。)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html lang="ja">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
  <title>映画データベース メイン</title>
</head>
<frameset cols =" 20%,*">
  <frame name ="menu" src = "e_menu2.php">
  <frame name ="main" src = "e_kensaku4.php">
  <noframes>
    <body>
      <p>フレーム対応のブラウザを使ってください</p>
    </body>
  </noframes>
</frameset>
</html>

メニュー画面の設計

TOP↑

左側に表示されるメニューの指定

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html lang="ja">
<head>
  <title>メニュー</title>
  <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
</head>
<body>
<p><a href="e_zenken1.php" target = "main">全件表示</a></p>
<p><a href="e_touroku3.php" target = "main">データ登録</a></p>
<p><a href="e_kensaku4.php" target = "main">一行検索</a></p>
<?php
//$koumokuにカテゴリーを検索したいMySQLの項目名を入れてください。
$koumoku="bun";
mysql_connect('localhost','zaurus','pass');
mysql_select_db('mydb');
$sql= "select distinct $koumoku from eiga";
$result = mysql_query($sql);
echo "<hr>\n";
echo "<select name=\"menu1\">";
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
      echo "<option value =\"".$row["$koumoku"]."\">". $row["$koumoku"] . "</option>";
}
echo "</select><br/><hr>";
?>
  </body>
</html>

データ登録のスクリプト

TOP↑

データ登録のフォームを作成し、入力する。

MySQL構文(新規登録)
insert into テーブル名 values (フィールド1の値,フィールド2の値,・・・・);
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html lang="ja">
  <head>
    <title>映画データベース登録フォーム</title>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
  </head>
  <body>
<?php
extract($_POST);

//映画データ登録のフォーム文
//登録ボタンを押したらPOSTで出力し、e_touroku2.phpにデータを渡す
echo "
<p>データを入力してください</p>\n
<form action=\"e_touroku2.php\" method=\"post\" >\n
<p>題名:<input type=\"text\" name=\"name\" size=\"50\"></p>\n";

//ラジオボタンの設定。ただし値は見出しと同じにする
echo "<p>媒体:
<input type=\"radio\" name=\"bai\" value=\"劇場\">劇場
<input type=\"radio\" name=\"bai\" value=\"DVD\" checked>DVD
<input type=\"radio\" name=\"bai\" value=\"Video\">Video
</p>\n
<p>鑑日:<input type=\"text\" name=\"mita\" size=\"20\">半角(例 2005-05-20)</p>\n";

//選択リストの設定
echo "<p>分類:
 <select name=\"bun\">
  <option value=\"ヒューマン\">ヒューマン</option>
  <option value=\"恋愛\">恋愛</option>
  <option value=\"青春\">青春</option>
  <option value=\"ファミリー向け\">ファミリー向け</option>
  <option value=\"時代劇\">時代劇</option>
 </select>
</p>\n
<p>制作:<input type=\"text\" name=\"nen\" size=\"10\">年</p>\n
<p>国名:
 <select name=\"kuni\">
  <option value=\"日\">日本</option>
  <option value=\"米\">アメリカ</option>
  <option value=\"仏\">フランス</option>
  <option value=\"他\">その他</option>
 </select>
</p>\n
<p>主演:<input type=\"text\" name=\"hito\" size=\"50\"></p>\n
<p>監督:<input type=\"text\" name=\"kan\" size=\"50\"></p>\n
<p>評価:<input type=\"text\" name=\"ten\" size=\"2\">(1〜5半角)</p>\n
<p>内容:</p>\n
<p><textarea name=\"naka\" rows=\"10\" cols=\"50\">
</textarea></p>\n
<p><input type=\"submit\" value=\"登録\">\n
<input type=\"reset\" value=\"リセット\"></p>\n
</form>\n
";
?>
	</body>
</html>

登録フォームからPOSTで出力されたデータを受け取り、データベースに書き込む
それだけだと何も表示されないので、とりあえず最新2件を表示

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html lang="ja">
  <head>
    <title>映画データ登録</title>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
  </head>
  <body>
<?php
//e_touroku3.phpのデータを受け取る
extract($_POST);
//MySQLに接続するときの多少エラー処理を考えた記載方法
if( !$conn = mysql_connect('localhost','zaurus','pass')){
  die( 'MySQL接続失敗');
  }
//データベースの選択
mysql_select_db('mydb', $conn);
//今日の日付を取得して登録日($kyou)に入力
$kyou = date("y-m-d");
//受け取ったデータを映画DBに登録
$sql = "insert into eiga values(0, '$kyou', '$name',
'$bai', '$mita', '$bun', $nen, '$kuni', '$hito', '$kan', '$naka', $ten)";
mysql_query($sql);
?>
<?php
//データベースへの接続
mysql_connect('localhost','zaurus','pass');
mysql_select_db('mydb');
//eigaテーブルからid降順で最新2件を選択表示
$sql= "select * from eiga order by id desc limit 2";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);
  if($rows == 0){
    echo "<p>該当データがありません。</p>";
  }
  else{
//選択したデータを1行ずつレイアウトして表示
  while($row = mysql_fetch_array($result)){
  echo "<p>";
  echo $row["id"]," 鑑賞日 ",$row["mita"]," 登録日 ",$row["kyou"],"<br />";
  echo $row["name"]," 評価: ",$row["ten"],"<br />";
  echo $row["bai"]," ",$row["bun"]," ",$row["nen"],"/",$row["kuni"],"<br />";
  echo "主演:",$row["hito"],"<br />";
  echo "監督:",$row["kan"],"<br />";
  echo nl2br($row["naka"]);
  echo "</p><hr />";
  }
}
?>
  </body>
</html>

データ確認のスクリプト

TOP↑

全件表示のスクリプト。idで降順に表示(新しいものが先頭に)

MySQL構文(検索、表示)
全件表示:select * from テーブル名;
表示するフィールドを限定:select フィールド1,フィールド2 from テーブル名;

なお、nl2br($row["naka"])という部分はテキストエリアの中の改行(¥n)を<br>に変換するコマンド。これがないとテキストエリアで改行してもHTML上で改行が反映されない。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html lang="ja">
  <head>
  <title>映画データベース全件検索</title>
  <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
</head>
<body>
<?php
//データベースへの接続
mysql_connect('localhost','zaurus','pass');
mysql_select_db('mydb');
//eigaテーブルからid降順ですべてを選択
$sql= "select * from eiga order by id desc";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);
  if($rows == 0){
    echo "<p>該当データがありません。</p>";
  }
  else{
//選択したデータを1行ずつレイアウトして表示
    while($row = mysql_fetch_array($result)){
      echo "<p>".$row["id"]." 鑑賞日 ".$row["mita"]." 登録日 ".$row["kyou"]."<br />";
      echo $row["name"]." 評価: ".$row["ten"]."<br />";
      echo $row["bai"]." ".$row["bun"]." ".$row["nen"]."/".$row["kuni"]."<br />";
      echo "主演:".$row["hito"]."<br />";
      echo "監督:".$row["kan"]."<br />";
      echo nl2br($row["naka"])."</p><hr />";
    }
  }
?>
</body>
</html>

データ検索のスクリプト

TOP↑

前半は検索欄を作成し、検索項目をひとつ選んだあと、検索語を入力して、検索ボタンを押す。後半で検索結果を表示する。

MySQL構文(検索、表示2)
条件付き検索:select 表示対象フィールド from テーブル名 where 条件式;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html lang="ja">
  <head>
    <title>映画データベース一行検索</title>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
  </head>
  <body>
<?php
//検索ボタンを押して戻ってきたときにPOSTを取得する
extract($_POST);
//最初は$fldが定義されていない。検索ボタンを押したときに選択項目を取得
if($fld == "name"){$s01 = "selected";}
if($fld == "bun"){$s02 = "selected";}
if($fld == "hito"){$s03 = "selected";}
if($fld == "kan"){$s04 = "selected";}
if($fld == "naka"){$s05 = "selected";}
if($fld == "ten"){$s06 = "selected";}
if($fld == "id"){$s07 = "selected";}
//検索欄を作成し、検索項目を選択、検索語を入れて、検索ボタンを押すとPOSTを出力する
echo "
<form action=\"e_kensaku4.php\"  method=\"post\" >\n
<p>
  <select name=\"fld\">\n
  <option value=\"name\" $s01>題名</option>\n
  <option value=\"bun\" $s02>分類</option>\n
  <option value=\"hito\" $s03>主演</option>\n
  <option value=\"kan\" $s04>監督</option>\n
  <option value=\"naka\" $s05>内容</option>\n
  <option value=\"ten\" $s06>評価</option>\n
  <option value=\"id\" $s07>連番</option>\n
  </select>\n
が <input type=\"text\" name=\"nam\" value=\"$nam\" size=\"40\">
</p>\n
<p><input type=\"submit\" value=\"検索\">
<input type=\"reset\" value=\"リセット\"></p>\n
</form>\n
";
//データベースの中から検索項目に検索語が含まれているものを選択する
//後半はそれを1行ずつ表示させる
if($nam<>''){
  mysql_connect('localhost','zaurus','pass');
  mysql_select_db('mydb');
  $sql= "select * from eiga where $fld like '%$nam%'";
  $result = mysql_query($sql);
  $rows = mysql_num_rows($result);
  if($rows == 0){
    echo "<p>該当データがありません。</p>";
  }
  else{
    while($row = mysql_fetch_array($result)){
    echo "<p>".$row["id"]." 鑑賞日 ".$row["mita"]." 登録日 ".$row["kyou"]."<br />";
    echo $row["name"]." 評価: ".$row["ten"]."<br />";
    echo $row["bai"]." ".$row["bun"]." ".$row["nen"]."/".$row["kuni"]."<br />";
    echo "主演:".$row["hito"]."<br />";
    echo "監督:".$row["kan"]."<br />";
    echo nl2br($row["naka"])."</p>";
    echo "<a href=\"e_shusei3.php?id=".$row["id"]."\">[このレコードを修正する] </a> ";
    echo "<a href=\"e_sakujo1.php?id=".$row["id"]."\">[このレコードを削除する] </a><hr>";
    }
  }
}
?>
</body>
</html>

(参考)データ検索で2項目で検索し結果を指定件数で改頁して表示する

TOP↑

検索結果が大量にあるとNetFrontではいつまでたっても表示が終了しない可能性がある。
イラチな人は耐えられないので、一度に表示されるデータの件数を指定する方法。
通勤電車で地下探検Limitedザウルスでのデータベース構築を参考に作ってみた。
menuなどに追加するか、e_kensaku4.phpと差し替えてください。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html lang="ja">
 <head>
   <title>映画データベース2行検索(改ページ表示)</title>
   <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
 </head>
<body>
<?php
//初期設定(1頁の表示件数)
$maxl=10;
//POST GETのデータを受け取る
extract($_POST);
extract($_GET);

//検索結果表示の際に、検索欄の検索項目が初期化されるのを防ぐ
if($fld == "name"){$s01 = "selected";}
if($fld == "bun"){$s02 = "selected";}
if($fld == "hito"){$s03 = "selected";}
if($fld == "kan"){$s04 = "selected";}
if($fld == "naka"){$s05 = "selected";}
if($fld == "ten"){$s06 = "selected";}
if($fld == "id"){$s07 = "selected";}

//2項目目の検索結果表示の際に、検索欄の検索項目が初期化されるのを防ぐ
if($fld2 == "name"){$ss01 = "selected";}
if($fld2 == "bun"){$ss02 = "selected";}
if($fld2 == "hito"){$ss03 = "selected";}
if($fld2 == "kan"){$ss04 = "selected";}
if($fld2 == "naka"){$ss05 = "selected";}
if($fld2 == "ten"){$ss06 = "selected";}
if($fld2 == "id"){$ss07 = "selected";}

//検索結果表示の際の頁、行位置の設定
//GETで渡された?pageを取り出し$pageにセット
$page = $HTTP_GET_VARS["page"];
//頁数がセットされていない場合は頁数に1をセット
if ($page < 1) {
	$page = 1;
}
//開始行を算出
//例えば$maxl=10、4頁目の開始行は(4−1)*10=30
//なお、0行目から始まる
$startline =  ($page - 1) * $maxl;
//終了行を算出
$endline   =  $page * $maxl -1;

//検索フォーム表示
//最初はフォームだけの表示
//検索ボタンが押されるとPOSTで$fldと$namがセットされる
//改頁の検索が実行されるとGETで$fldと$namがセットされる
echo "
<form action=\"e_kensaku7.php\"  method=\"post\" >\n
<p>
 <select name=\"fld\">
  <option value=\"name\" $s01>題名</option>\n
  <option value=\"bun\" $s02>分類</option>\n
  <option value=\"hito\" $s03>主演</option>\n
  <option value=\"kan\" $s04>監督</option>\n
  <option value=\"naka\" $s05>内容</option>\n
  <option value=\"ten\" $s06>評価</option>\n
  <option value=\"id\" $s07>連番</option>\n
 </select>\n
が <input type=\"text\" name=\"nam\" value=\"$nam\" size=\"40\">
</p>\n
<p>
 <select name=\"fld2\">
  <option value=\"name\" $ss01>題名</option>\n
  <option value=\"bun\" $ss02>分類</option>\n
  <option value=\"hito\" $ss03>主演</option>\n
  <option value=\"kan\" $ss04>監督</option>\n
  <option value=\"naka\" $ss05>内容</option>\n
  <option value=\"ten\" $ss06>評価</option>\n
  <option value=\"id\" $ss07>連番</option>\n
 </select>\n
が <input type=\"text\" name=\"nam2\" value=\"$nam2\" size=\"40\">
</p>\n
<p><input type=\"submit\" value=\"検索\">
<input type=\"reset\" value=\"リセット\"></p>\n
</form>\n
";

//最初$namが空欄のときは最終行のあたりまでの文は実行されない
//検索が実行されると$namに値が入り実行される
//改頁のときはGETで$namが渡され実行される
if($nam<>''){
mysql_connect('localhost','zaurus','pass');
mysql_select_db('mydb');
$sql= "select * from eiga where $fld like '%$nam%' and $fld2 like '%$nam2%' order by id desc";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);  //行数取得

//検索結果が空行ならば
if($rows == 0){
    echo "<p>該当データがありません。</p>";
}

//検索結果があれば以下を実行する
else{

//検索結果の行数をもとに最終頁数を計算(ceilは切り上げ)
$maxpage=ceil($rows/$maxl);

//現在の頁/最終頁を表示「.」は文字列の連結
print("<p align='left'>Page ".$page."/".$maxpage."</p>");

//mysql_data_seekにより検索結果の表上で内の指定した行に移動する
mysql_data_seek($result,$startline);
//$iに$startlineを代入
$i=$startline;
//最終行でなく かつ $i<=$endlineの条件の間
//検索結果の表から検索結果の行を取り出し表示する
  while($row = mysql_fetch_array($result) and $i<=$endline){
   echo "<p>".$row["id"]." 鑑賞日 ".$row["mita"]." 登録日 ".$row["kyou"]."<br />";
   echo $row["name"]." 評価: ".$row["ten"]."<br />";
   echo $row["bai"]." ".$row["bun"]." ".$row["nen"]."/".$row["kuni"]."<br />";
   echo "主演:".$row["hito"]."<br />";
   echo "監督:".$row["kan"]."<br />";
   echo nl2br($row["naka"])."<br />";
   echo "<a href=\"e_shusei3.php?id=".$row["id"]."\">[修正] </a> ";
   echo "<a href=\"e_sakujo1.php?id=".$row["id"]."\">[削除] </a></p><hr>";
	$i=$i+1;
  }

//検索結果表示の下に各頁へのリンクを作成する

//HTML文を出力 caption を出力
print("<caption align='bottom'>");

//現在表示している頁が1ページより後の頁の場合は前の頁のリンクを作成
  if ($page > 1) {
    $i = $page - 1;
//HTML文を出力 .$pageに指定された頁数をセットしてGETで渡すリンクを作成
    print("<a href='e_kensaku7.php?page=".$i ."&fld=".$fld."&nam=".$nam."&fld=".$fld2."&nam2=".$nam2."'>前頁</a>");
  }

//現在表示している頁が1ページではなく最終頁ではない場合は前頁と次頁を
//区切る「・」を出力
  if ($page <> 1 and $page <> $maxpage) {
    print("・");
  }

//現在表示している頁が最終頁より前の頁の場合は前の頁のリンクを作成
  if ($page < $maxpage) {
   $i = $page + 1;
//HTML文を出力 .$pageに指定された頁数をセットしてGETで渡すリンクを作成
   print("<a href='e_kensaku7.php?page=".$i ."&fld=".$fld."&nam=".$nam."&fld=".$fld2."&nam2=".$nam2."'>次頁</a>");
  }
///HTML文を出力 改行
print("<br>");

//出力可能な頁数数分繰り返す
  for ($i=1;$i<=$maxpage;$i++) {
//現在の頁の時は [ ]で囲む
    if ($i==$page){
        print("[".$i."]");
    } else {
//HTML文を出力 .$pageに指定された頁数をGETで渡すリンクを作成
        print("<a href='e_kensaku7.php?page=".$i."&fld=".$fld."&nam=".$nam."&fld=".$fld2."&nam2=".$nam2."'>$i</a>");
    }
//最終頁以外では頁間を区切る「・」を出力
    if ($i <> $maxpage) {
        print("・");
    }
   }  //forの終わり
//HTML文を出力 /caption を出力
print("</caption>");
  }  //elseの終わり
}  //if($namの終わり
?>
	</body>
</html>

修正のスクリプト

TOP↑

e_kensaku4.phpで修正するを押したときに、これが呼び出される。

MySQL構文(修正)
修正:update テーブル名 set フィールド名=修正したい値 where 条件式;

前半部分は、最初は該当する値がないので、スルーされる。
まずは、後半で該当するデータをidをキーに呼び出し、それを修正フォームに書き込んでいく。チェックボックスや選択リストのところは結構苦労した。呼び出されたデータをもとにリストの何に該当しているかを判断させ、selected、checkedなどをつけた。
登録ボタンを押した時点で再度自分自身e_shusei3.phpが呼び出されて、その値がデータベースの各項目に設定され、sql文でデータベースに登録される。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html lang="ja">
  <head>
    <title>映画データベース修正</title>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
  </head>
  <body>
<?php
extract($_POST);
extract($_GET);
mysql_connect('localhost','zaurus','pass');
mysql_select_db('mydb');

//MySQLレコード修正 最初はname1という値はないのでif文はパスされる
if($name1<>""){
//修正ボタンが押されたときの修正処理
  if(isset($changedata)){

  $sql = "update eiga set
    kyou = '$kyou1', name = '$name1', bai = '$bai1',
    mita = '$mita1', bun = '$bun1', nen = '$nen1',
    kuni = '$kuni1', hito = '$hito1', kan = '$kan1',
    naka = '$naka1', ten = '$ten1'
    where  id = $id_1";

  mysql_query($sql);
  echo "レコードの修正が完了しました";
  }
 else{
//新規登録処理
//今日の日付を取得して登録日($kyou)に入力
  $kyou1 = date("Y-m-d");
//受け取ったデータを映画DBに登録
  $sql = "insert into eiga values(0, '$kyou1', '$name1',
          '$bai1', '$mita1', '$bun1', $nen1, '$kuni1', '$hito1', '$kan1', '$naka1', $ten1)";
  mysql_query($sql);
  echo "レコードを新規登録しました。";
  }
echo mysql_error();
//これは確認用。うまく動けば次の行は削除か//をつけてコメントにする
echo $sql;
  exit;
}

//修正のためのフォーム
$sql = "select * from eiga where id = $id";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);

if($rows == 0){
echo "<p>該当データがありません。</p>\n";
}
else{
while($row = mysql_fetch_array($result)){
echo "<p>データを修正してください。</p>\n";
echo "<form action = \"e_shusei3.php\" method = \"post\">";

  echo "<p>連番:".$row["id"]."</p>\n";

  echo "<p>題名:<input type = \"text\" name = \"name1\" value =\"".$row["name"]."\" size = \"40\"></p>\n";

//ラジオボタンのときの修正前のデータの取得と表示
$bai1 = $row["bai"];
if($bai1 == "劇場"  ){$c01 = "checked";}
if($bai1 == "DVD"){$c02 = "checked";}
if($bai1 == "Video" ){$c03 = "checked";}
  echo "<p>媒体:
  <input type=\"radio\" name=\"bai1\" value=\"劇場\"   $c01>劇場\n
  <input type=\"radio\" name=\"bai1\" value=\"DVD\" $c02>DVD\n
  <input type=\"radio\" name=\"bai1\" value=\"Video\"  $c03>Video\n
  </p>\n";

  echo "<p>鑑日:<input type = \"text\" name=\"mita1\" value =\"".$row["mita"]."\" size=\"50\"></p>\n";

//選択リストのときの修正前のデータの取得と表示
  $bun1 = $row["bun"];
  if($bun1 == "ヒューマン"){$s01 = "selected";}
  if($bun1 == "恋愛"){$s02 = "selected";}
  if($bun1 == "青春"){$s03 = "selected";}
  if($bun1 == "ファミリー向け"){$s04 = "selected";}
  if($bun1 == "時代劇"){$s05 = "selected";}
echo "<p>分類:
 <select name=\"bun1\">
  <option value=\"ヒューマン\" $s01>ヒューマン</option>
  <option value=\"恋愛\"       $s02>恋愛</option>
  <option value=\"青春\"       $s03>青春</option>
  <option value=\"ファミリー向け\" $s04>ファミリー向け</option>
  <option value=\"時代劇\"     $s05>時代劇</option>
 </select>
</p>\n";

  echo "<p>制作:<input type = \"text\" name = \"nen1\" value =\"".$row["nen"]."\" size = \"20\"></p>\n";

//選択リストのときの修正前のデータの取得と表示
  $kuni1 = $row["kuni"];
  if($kuni1 == "日"){$t01 = "selected";}
  if($kuni1 == "米"){$t02 = "selected";}
  if($kuni1 == "仏"){$t03 = "selected";}
  if($kuni1 == "他"){$t04 = "selected";}
  echo "<p>国名:
 <select name=\"kuni1\">
  <option value=\"日\" $t01>日本</option>
  <option value=\"米\" $t02>アメリカ</option>
  <option value=\"仏\" $t03>フランス</option>
  <option value=\"他\" $t04>その他</option>
 </select>
</p>\n";

  echo "<p>主演:<input type = \"text\" name = \"hito1\" value =\"".$row["hito"]."\" size = \"40\"></p>\n";

  echo "<p>監督:<input type = \"text\" name = \"kan1\" value =\"".$row["kan"]."\" size = \"40\"></p>\n";

  echo "<p>内容:<textarea name = \"naka1\" rows =\"10\" cols = \"50\">";
  echo nl2br($row["naka"]);
  echo "</textarea></p>\n";

  echo "<p>評価:<input type = \"text\" name = \"ten1\" value =\"";
  echo $row["ten"];
  echo "\" size = \"4\"></p>\n";

  echo "<input type = \"hidden\" name = \"kyou1\" value =\"";
  echo $row["kyou"];
  echo "\">\n";
  echo "<input type = \"hidden\" name = \"id_1\" value =\"";
  echo $row["id"];
  echo "\">\n";

  echo "<p><input type=\"submit\" name=\"changedata\" value=\"修正登録\">";
  echo "<input type=\"reset\" value=\"リセット\">\n";
  echo "<input type=\"submit\" name=\"newdata\" value=\"新規登録\"><p/>";
  echo "</form>";
 }
}
?>
  </body>
</html>

削除のスクリプト

TOP↑

単純に削除すると危険なので、確認作業を行う

MySQL構文(削除)
全件削除:delete from テーブル名;
指定レコード削除:delete from テーブル名 where 条件;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html lang="ja">
  <head>
    <title>映画データベースデータ削除</title>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
  </head>
  <body>
<?php
extract($_POST);
extract($_GET);
mysql_connect('localhost','zaurus','pass');
mysql_select_db('mydb');

//MySQLレコード削除
if($kakunin=="確認"){
  $sql = "delete from eiga where id = $id";

  mysql_query($sql);
  echo "レコードの削除が完了しました";
  exit;
}

//削除確認のためのフォーム
$sql = "select * from eiga where id = $id";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);
  if($rows == 0){
    echo "<p>該当データがありません。</p>";
  }
  else{
  while($row = mysql_fetch_array($result)){
  echo "<p>このレコードを削除します。</p>";
  echo "<form action = \"e_sakujo1.php\" method = \"post\">";
  echo "<p>".$row["id"]." 鑑賞日 ".$row["mita"]." 登録日 ".$row["kyou"]."<br />";
  echo $row["name"]." 評価: ".$row["ten"]."<br />";
  echo $row["bai"]." ".$row["bun"]." ".$row["nen"]."/".$row["kuni"]."<br />";
  echo "主演:".$row["hito"]."<br />";
  echo "監督:".$row["kan"]."<br />";
  echo nl2br($row["naka"])."</p>";
  echo "<input type = \"hidden\" name = \"id\" value =\"".$row["id"]."\">";
  echo "<p><input type=\"submit\" name=\"kakunin\" value=\"確認\">";
  echo "<input type=\"reset\" value=\"リセット\"></p>";
  echo "</form>";
  }
}
?>
</body>
</html>

エラー処理のメモ

TOP↑
mysql_connect('localhost','zaurus','pass') or die("接続エラー");
mysql_select_db('eiga') or die("接続エラー");

修正履歴

TOP↑

コメントをどうぞ

TOP↑

掲示板にお願いします