Search A.I.
Menu
ホーム

メールマガジン ホームページプログラミングテク

Windowsテク
Javaアプレット サンプル
Java Q & A
JavaScript Q & A
Perl Q & A
Perl レッスン
PHP レッスン
PHPテク
MS-DOS コマンド集
UNIX コマンド集
SQL コマンド集
SEの基礎講座
WEBシステム開発受注します
]無料フォームメール送信サービス
リンク集
PHP レッスン

1. PHP の基礎
2. PHPの文法、条件式
3. PHPの文法、条件式 - 続き
4. 配列について
5. ハッシュ配列について
6. 関数について
7. 関数について - 続き
8. 文字列操作関数
9. 配列操作関数
10. ファイル操作
11. ファイル操作 - 続き
12. パラメータの受け渡し
13. クッキーとセッション
14. 総合練習
15. メール送信
16. ファイルアップロード
17. クラスについて
18. クラスについて - 続き
19. MySQL
20. MySQL - 続き(1)
21. MySQL - 続き(2)
22. PostgreSQL
23. 総合練習
24. 総合練習解答



24. 総合練習解答

★前回の課題の解答

今日で全てのレッスンが終了になります。前回の解答を確認してください。

1. 以下の条件を満たすプログラムを作成してください。

(1) ログイン機能、ユーザ管理機能を作成します。
(2) データベースは、MySQLまたはPostgreSQLを使用し、テーブルは、ユーザ
テーブルを作成してください。ユーザテーブルの項目は、ユーザ名、
パスワード、メールアドレスとします。データの方や文字数については、
設計してください。
(3) ユーザ管理機能は、ユーザ一覧表示、ユーザ登録、ユーザ変更、ユーザ削除
を行います。
(4) ユーザのデータ項目は、ユーザ名、パスワード、メールアドレスとします。
(5) ログイン画面には、ユーザ名、パスワードのテキストボックスと、ログイン
ボタンを表示します。
(6) ログイン画面からログインボタンをクリックすると、ユーザテーブルのユーザ
名とパスワードが一致しているかを検索し、一致しているデータがなければ
ログインエラーとします。一致していれば、ユーザ一覧表示画面を表示します。
(7) ユーザ一覧画面は、登録されているユーザの、ユーザ名、メールアドレスを
全て表示します。また、ユーザ名をリンク表示し、リンクをクリックすると、
ユーザ変更画面を表示します。また、ユーザ一覧画面に、ユーザ新規登録
ボタンを表示し、クリックしたら、ユーザ登録画面を表示します。
(8) ユーザ登録画面は、ユーザ名、パスワード、メールアドレスのテキスト
ボックスと、登録ボタンを表示し、登録ボタンをクリックすると、ユーザ
データを新規登録します。ユーザ名は、半角英数字のみで必須、パスワードは
半角英数字のみで必須、メールアドレスは、メールアドレスチェックを行って
ください。
(9) ユーザ変更画面は、ユーザ名、パスワード、メールアドレスのテキスト
ボックスと、変更ボタン、削除ボタンを表示する。各テキストボックスには、
前のユーザ一覧表示画面で選択されたユーザデータをデフォルト表示します。
変更ボタンをクリックすると、該当するユーザデータの内容を変更します。
登録と同様にエラーチェックを行ってください。削除ボタンをクリックすると、
該当するユーザデータの内容を削除します。
(10) 画面のデザインについては、指定はありません。
(11) ログイン画面以外は、ログインしているユーザ以外は見れないようにして
ください。(セッションを使用)

→下のサンプルを参照してください。

index.php
-----------------------------------------------------------------
<html>
<body>
<center>

<form action="login.php" method="post">
ログイン名 <input type="text" name="login_name" size="20"><br>
パスワード <input type="password" name="password" size="20"><br>
<br>
<input type="submit" value="ログイン">
</form>

</center>
</body>
</html>
-----------------------------------------------------------------

common.php
-----------------------------------------------------------------
<?php

//セッション管理開始
session_start();

//------------------------------------------------------------------------------
//データベースオープン関数
//引数 : なし
//戻り値 : データベースハンドル
function db_open()
{
//ホスト名
$db_host = "localhost";

//データベースユーザ
$db_user = "admin";

//パスワード
$db_pass = "admin";

//データベース名
$db_name = "test";

//データベース接続
$dbh = mysql_connect($db_host, $db_user, $db_pass);

//DBの接続に失敗した場合はエラー表示をおこない処理中断
if ($dbh == False) {
system_error("can not connect db\n");
}

//データベース選択
if (!(mysql_select_db($db_name, $dbh)))
{
system_error("Failed connect");
}

//データベースハンドルを返す
return $dbh;
}

//------------------------------------------------------------------------------
//データベースクローズ関数
//引数 : データベースハンドル
//戻り値 : なし
function db_close($dbh)
{
//データベースクローズ
mysql_close($dbh);
}

//------------------------------------------------------------------------------
//トランザクションの開始処理を行う
//引数 : データベースハンドル
//戻り値 : なし
function start_trans($dbh)
{
//トランザクション開始
$sql = "begin";
if (!(mysql_query($sql, $dbh)))
{
system_error("SQL Failed " . $sql);
}
}

//------------------------------------------------------------------------------
//トランザクションの完了処理を行う
//引数 : データベースハンドル
//戻り値 : なし
function end_trans($dbh)
{
//トランザクションの完了
$sql = "commit";
if (!(mysql_query($sql, $dbh)))
{
//ロールバック
rollback_trans($dbh);
system_error("SQL Failed " . $sql);
}
}

//------------------------------------------------------------------------------
//ロールバック処理を行う
//引数 : データベースハンドル
//戻り値 : なし
function rollback_trans($dbh)
{
//トランザクションの完了
$sql = "rollback";
if (!(mysql_query($sql, $dbh)))
{
system_error("SQL Failed " . $sql);
}
}

//------------------------------------------------------------------------------
//データベースからテーブル抽出を行う
//引数 : データベースハンドル、SQLクエリー
//戻り値 : 取得結果の配列
function get_array($dbh, $sql)
{
//SQL実行
if (!($rs = mysql_query($sql, $dbh)))
{
system_error("SQL Failed " . $sql);
}

//結果の取得
$item = array();
for ($i = 0; $arr = mysql_fetch_array($rs); $i++) {
reset($arr);
$item[$i] = $arr;
}

if(sizeof($item) > 0){
return $item;
} else {
return null;
}
}

//------------------------------------------------------------------------------
// 説明:DB更新時クエリーをトランザクション付きで行う
// 引数:データベースコネクション、SQLクエリー文字列、トランザクション管理フラグ
// 戻値:エラーの場合false、成功の場合は、true
function trans_exec($dbh, $sql, $trans = true)
{
if ($trans) {
// トランザクション開始
$trans_flg = start_trans($dbh);
}

$trans_flg = mysql_query($sql, $dbh);
if (!$trans_flg) {
// DB更新失敗の場合
// ロールバック
if ($trans)
{
rollback_trans($dbh);
}
system_error("SQL Failed " . $sql);
}

if ($trans) {
// コミット
$trans_flg = end_trans($dbh);
}
return true;
}

//------------------------------------------------------------------------------
//ログイン認証
//引数 : データベースハンドル、ログイン名、パスワード
//戻り値 : true: 認証成功、 false: 認証失敗
function check_login($dbh, $login_name, $password)
{
//認証SQL
$sql = "
select
login_name
from
login_user
where
login_name = " . escape_sql($login_name) . "
and
password = " . escape_sql($password) . "
";

$login = get_array($dbh, $sql);

if (count($login) > 0) {
//認証成功
return true;
}

//認証失敗
return false;
}

//------------------------------------------------------------------------------
//システムエラー発生時の処理
//引数 : エラーコード
//戻り値 : なし
function system_error($err_code)
{
print("エラー : " . $err_code);
die;
}

//------------------------------------------------------------------------------
//SQLクエリー文字列変換
//引数 : 文字列、カンマ付加フラグ
//戻り値 : 変換後の文字列
function escape_sql($str, $flag = true)
{
$ret = $str;
// $ret = str_replace("'", "''", $ret);
if ($flag) {
if (!$ret && $ret != "0") {
return 'null';
}
$ret = "'" . $ret . "'";
}
return $ret;
}

//------------------------------------------------------------------------------
// HTMLの文字エスケープ
// htmlspecialcharsを呼び、空の場合は&nbsp;を出力
// 引数:エスケープする文字列、&nbsp;変換フラグ、改行変換フラグ
// 戻り値:エスケープ後の文字列
function escape_html($str, $sp_flag = false, $cr_flag = false)
{
$ret = htmlspecialchars($str);
//改行エスケープ
if ($cr_flag) {
$ret = str_replace("\r\n", "<br>", $ret);
$ret = str_replace("\r", "<br>", $ret);
$ret = str_replace("\n", "<br>", $ret);
}

if ($ret == "") {
if ($sp_flag) {
return "&nbsp;";
}
return "";
}
return $ret;
}

//------------------------------------------------------------------------------
//半角英数字チェック
//引数 : チェック文字列
//戻り値 : true:半角英数字のみ、false:半角英数字以外あり
function check_alpha($str)
{
if (strlen($str) == 0)
{
//空文字の場合
return false;
}

for ($i = 0; $i < strlen($str); $i++)
{
//1文字ずつ取得
$a = ord(substr($str, $i, 1));
if (($a < ord("0") or $a > ord("9")) and ($a < ord("a") or $a > ord("z")) and
($a <> ord("@")) and ($a <> ord(".")) and ($a <> ord("_")) and ($a <> ord("-")))
{
//半角英数字以外の文字があった場合
return false;
}
}

return true;
}

//------------------------------------------------------------------------------
//メールアドレスチェック
//引数 : チェック文字列
//戻り値 : true:正常、false:正しくない
function check_email($str)
{
//半角英数字のチェック
if (check_alpha($str) == false)
{
return false;
}

//"@"のチェック
$pos = strpos($str, "@");
if ($pos == 0)
{
return false;
}

//"."のチェック
if (strpos($str, ".", $pos+1) == 0)
{
return false;
}

return true;
}

?>
-----------------------------------------------------------------

login.php
-----------------------------------------------------------------
<?

require './common.php';

// データベース接続
$dbh = db_open();

// ログイン認証処理
if (!check_login($dbh, $_POST["login_name"], $_POST["password"])) {
print "ログインに失敗しました。<br>\n<br>\n<br>\n<a href=\"index.php\">ログイン画面へ</a>";
exit;
}

// データベースクローズ
db_close($dbh);

// セッション書き込み
$_SESSION["login_info"] = $_POST["login_name"];

// ユーザ一覧画面へ遷移させる
header("Location: user_list.php");

exit;

?>
-----------------------------------------------------------------

user_list.php
-----------------------------------------------------------------
<?
// ユーザ一覧表示画面

require './common.php';

// データベース接続
$dbh = db_open();

// ログイン認証処理
if (!session_is_registered("login_info")) {
header("Location: index.php");
exit;
}

// ユーザ一覧取得
$sql = "
select
login_id,
login_name,
email
from
login_user
";

// データベース読み込み
$user = get_array($dbh, $sql);

// データベースクローズ
db_close($dbh);

?>
<html>
<body>
<center>
ユーザ一覧<br>
<br>
<table border="1">
<tr>
<td>ユーザ名</td>
<td>メールアドレス</td>
</tr>
<?

for ($i = 0; $i < count($user); $i++) {
print "<tr><td><a href=\"user_up.php?uid=" . $user[$i]["login_id"] . "\">" . $user[$i]["login_name"] . "</a></td>";
print "<td>" . $user[$i]["email"] . "</td></tr>\n";
}

?>
</table>
<br>
<form action="user_up.php" method="get">
<input type="submit" value="ユーザ登録">
</form>
</center>
</body>
</html>
-----------------------------------------------------------------

user_up.php
-----------------------------------------------------------------
<?
// ユーザ一覧表示画面

require './common.php';

$mode = "登録";

// データベース接続
$dbh = db_open();

// ログイン認証処理
if (!session_is_registered("login_info")) {
header("Location: index.php");
exit;
}

if ($_GET["uid"]) {
// 変更の場合
$mode = "変更";

// ユーザ情報取得
$sql = "
select
login_id,
login_name,
password,
email
from
login_user
where
login_id = " . escape_sql($_GET["uid"]) . "
";

// データベース読み込み
$user = get_array($dbh, $sql);
}

// データベースクローズ
db_close($dbh);

?>
<html>
<body>
<center>
ユーザ<?=$mode?><br>
<br>
<table border="1">
<form action="post.php" method="post">
<input type="hidden" name="login_id" value="<?=$_GET["uid"]?>">
<tr>
<td>ユーザ名</td>
<td><input type="text" name="login_name" value="<?=$user[0]["login_name"]?>" size="20"></td>
</tr>
<tr>
<td>パスワード</td>
<td><input type="text" name="password" value="<?=$user[0]["password"]?>" size="20"></td>
</tr>
<tr>
<td>メールアドレス</td>
<td><input type="text" name="email" value="<?=$user[0]["email"]?>" size="30"></td>
</tr>
</table>
<br>
<input type="submit" value="ユーザ<?=$mode?>">
<?
if ($_GET["uid"]) {
print "<input type=\"submit\" name=\"del\" value=\"ユーザ削除\">\n";
}
?>
<input type="button" value="戻る" onClick="javascript:history.back();">
</form>
</center>
</body>
</html>
-----------------------------------------------------------------

post.php
-----------------------------------------------------------------
<?
require './common.php';

// データベース接続
$dbh = db_open();

// ログイン認証処理
if (!session_is_registered("login_info")) {
header("Location: index.php");
exit;
}

// トランザクション開始
start_trans($dbh);

// エラーチェック
if (!$_POST["login_name"]) {
print("ユーザ名を入力してください。");
// データベースクローズ
db_close($dbh);
exit;
}
elseif (!check_alpha($_POST["login_name"])) {
print("ユーザ名は半角英数字で入力してください。");
// データベースクローズ
db_close($dbh);
exit;
}

if (!$_POST["password"]) {
print("パスワードを入力してください。");
// データベースクローズ
db_close($dbh);
exit;
}
elseif (!check_alpha($_POST["password"])) {
print("パスワードは半角英数字で入力してください。");
// データベースクローズ
db_close($dbh);
exit;
}

if (!check_email($_POST["email"])) {
print("メールアドレスを正しく入力してください。");
// データベースクローズ
db_close($dbh);
exit;
}

if ($_POST["del"])
{
// ユーザ削除処理の場合
$sql = "
delete from
login_user
where
login_id = " . escape_sql($login_id) . "
";
}
elseif ($_POST["login_id"])
{
// ユーザ更新処理の場合
$sql = "
update
login_user
set
login_name = " . escape_sql($login_name) . ",
password = " . escape_sql($password) . ",
email = " . escape_sql($email) . "
where
login_id = " . escape_sql($login_id) . "
";
}
else {
// ユーザ新規登録の場合
$sql = "
insert into login_user (
login_name,
password,
email
) values (
" . escape_sql($login_name) . ",
" . escape_sql($password) . ",
" . escape_sql($email) . "
)";
}

// データベース書き込み
trans_exec($dbh, $sql, true);

// トランザクション終了
end_trans($dbh);

// データベースクローズ
db_close($dbh);

// ユーザ一覧画面へ遷移させる
header("Location: user_list.php");

exit;
-----------------------------------------------------------------

■解説
かなり長いですが、全ファイルのソースを記述いたしました。
ファイル構成は以下の通りです。

index.php : ログイン画面表示
common.php : 共通処理ファイル
login.php : ログイン処理
user_list.php : ユーザ一覧画面表示
user_up.php : ユーザ登録・変更画面表示
post.php : ユーザ登録・変更処理

ログイン画面表示は.htmlでも構いません。
index.phpから、ログインボタンを押すと、login.phpに飛び、ログイン認証を行い
ます。失敗すると、エラー画面を表示して終了します。なお、上記サンプルでは、
ログイン認証処理は、一括してcommon.php内で行っています。

ログインに成功すると、セッションにログイン情報を書き込んで、ユーザ一覧画面を
表示します。

ユーザ登録画面と、ユーザ変更画面は、同じファイルにしています。ユーザ変更の
場合は、uidというパラメータを渡すようにし、uidがある場合は、変更処理に
なるようにします。

ユーザ登録・変更画面から、更新処理をする場合は、どの処理でもpost.phpに飛ぶ
ようにし、データベースに書き込んでいます。エラーがなければ、更新処理後、
ユーザ一覧画面を表示します。

詳細の処理については、上記サンプルを確認してください。

セッションは、セッションの有効時間が経過すると、自動的にログアウトしてしまい
ますが、この場合はタイムアウトした方がセキュリティ上、安全と言えます。

 




前の章へ


このエントリーをはてなブックマークに追加


OfficeLance

お問い合わせはこちらから