23. 総合練習
レッスンは前回までで終了です。今日は、最後の総合練習として、1つだけ課題を
やっていただきます。
★課題
1. 以下の条件を満たすプログラムを作成してください。
(1) ログイン機能、ユーザ管理機能を作成します。
(2) データベースは、MySQLまたはPostgreSQLを使用し、テーブルは、ユーザ
テーブルを作成してください。ユーザテーブルの項目は、ユーザ名、
パスワード、メールアドレスとします。データの方や文字数については、
設計してください。
(3) ユーザ管理機能は、ユーザ一覧表示、ユーザ登録、ユーザ変更、ユーザ削除
を行います。
(4) ユーザのデータ項目は、ユーザ名、パスワード、メールアドレスとします。
(5) ログイン画面には、ユーザ名、パスワードのテキストボックスと、ログイン
ボタンを表示します。
(6) ログイン画面からログインボタンをクリックすると、ユーザテーブルのユーザ
名とパスワードが一致しているかを検索し、一致しているデータがなければ
ログインエラーとします。一致していれば、ユーザ一覧表示画面を表示します。
(7) ユーザ一覧画面は、登録されているユーザの、ユーザ名、メールアドレスを
全て表示します。また、ユーザ名をリンク表示し、リンクをクリックすると、
ユーザ変更画面を表示します。また、ユーザ一覧画面に、ユーザ新規登録
ボタンを表示し、クリックしたら、ユーザ登録画面を表示します。
(8) ユーザ登録画面は、ユーザ名、パスワード、メールアドレスのテキスト
ボックスと、登録ボタンを表示し、登録ボタンをクリックすると、ユーザ
データを新規登録します。ユーザ名は、半角英数字のみで必須、パスワードは
半角英数字のみで必須、メールアドレスは、メールアドレスチェックを行って
ください。
(9) ユーザ変更画面は、ユーザ名、パスワード、メールアドレスのテキスト
ボックスと、変更ボタン、削除ボタンを表示する。各テキストボックスには、
前のユーザ一覧表示画面で選択されたユーザデータをデフォルト表示します。
変更ボタンをクリックすると、該当するユーザデータの内容を変更します。
登録と同様にエラーチェックを行ってください。削除ボタンをクリックすると、
該当するユーザデータの内容を削除します。
(10) 画面のデザインについては、指定はありません。
(11) ログイン画面以外は、ログインしているユーザ以外は見れないようにして
ください。(クッキーを使用)
★前回の課題の解答
1. PostgreSQLを使用して、以下のテーブルを処理を実行するプログラムを作成して
ください。
NAME PRICE UP_DATE
Beer 500 2005/01/01 00:00:00
Juice 300 2005/02/23 00:00:00
Coke 150 2004/12/31 00:00:00
Tea 250 2005/04/01 00:00:00
Coffee 200 2005/10/01 00:00:00
(1) まず、トランザクション処理を開始してください。
(2) PRICEが300以下のデータを抽出してください。
(3) 以下のレコードを追加してください。
NAME PRICE UP_DATE
Soda 100 2005/05/01 00:00:00
(4) 全てのデータを抽出し、UP_DATEは、"2005年01月01日 24時00分"のフォーマット
で表示してください。
→下のサンプルを参照してください。
-----------------------------------------------------------------
#! /usr/local/bin/perl
print "Content-type:text/html\n\n";
print << "END_OF_HTML";
<HTML>
<BODY>
END_OF_HTML
use DBI;
$host = "localhost";
$dbn = "test";
$user = "admin";
$pswd = "admin";
# データベース接続
my $conn = DBI->connect("DBI:Pg:host=$host;dbname=$dbn", $user, $pass);
if(!$conn)
{
print("データベースの接続に失敗しました");
exit();
}
# (1) トランザクション開始
$st = $conn->prepare("begin");
$res = $st->execute;
if(!$res)
{
print("トランザクション開始処理に失敗しました");
exit;
}
# (2) PRICEが300以下のデータを抽出してください。
$query = "
select
*
from
drink
where
PRICE <= 300
";
# データベース読み込み
$st = $conn->prepare($query);
$res = $st->execute;
if(!$res)
{
print("SELECT SQL文に失敗しました");
exit;
}
while(@res = $st->fetchrow)
{
print $res[0] . ", ";
print $res[1] . ", ";
print $res[2] . "<br>\n";
}
# (3) 以下のレコードを追加してください。
$query = "
insert into drink (
name,
price,
up_date
) values (
'Soda',
'100',
'2005/05/01 00:00:00'
)";
# データベース書き込み
# レコード追加
$st = $conn->prepare($query);
$rec = $st->execute;
if (!$rec)
{
# ロールバック
$st = $conn->prepare("rollback");
$res = $st->execute;
if(!$res)
{
print("ロールバックに失敗しました");
exit;
}
exit;
}
# (4) 全てのデータを抽出し、UP_DATEは、"2005年01月01日 24時00分"のフォーマット
# で表示してください。
$query = "
select
name,
price,
to_char(up_date, 'YYYY年MM月DD日 HH24時MI分')
from
drink
";
# データベース読み込み
$st = $conn->prepare($query);
$res = $st->execute;
if (!$rec)
{
print("SELECT SQL文に失敗しました");
exit;
}
while(@res = $st->fetchrow)
{
print $res[0] . ", ";
print $res[1] . ", ";
print $res[2] . "<br>\n";
}
# トランザクション終了
$st = $conn->prepare("commit");
$res = $st->execute;
if(!$res)
{
print("コミット処理に失敗しました");
exit;
}
# データベースクローズ
$st->finish;
$conn->disconnect;
print << "END_OF_HTML";
</BODY>
</HTML>
END_OF_HTML
exit;
-----------------------------------------------------------------
■解説
前回のレッスンを参考にすれば、できるかと思います。
課題には書きませんでしたが、トランザクション終了処理と、データベースクローズは
しておいた方がいいです。
今回の場合は、更新処理が1つしかないので、ロールバック処理は必要ありませんが、
2つ以上の更新処理がある場合は、2つ目以降で、データベースの更新に失敗した時に、
ロールバック処理をしておいた方がいいです。
|