システムデザイン

提供:kuhalaboWiki
移動: 案内, 検索

目次

Information

Schedule

2013年前期
  1. 4/16(火) 久原 データベースシステム概要
  2. 4/23(火) 久原 PHPサーバーサイドプログラミング
  3. 4/30(火) 久原 課題制作日
  4. 5/7(火) 久原 PHPのスクリプト, PHPサーバーサイドプログラミング
  5. 5/14(火) 久原 phpMyAdminによるデータベースの作成,SQLコマンド
  6. 5/21(火) 久原 MySQLのINSERT, SELECT
  7. 5/28(火) 久原 MySQLのLIMIT, WHERE, LIKE, DELETE, サーバ変数など、カスタマイズ。
  8. 6/4(火) 久原 課題について
  9. 6/11(火) 永江
  10. 6/18(火) 永江
  11. 6/25(火) 永江
  12. 7/2(火) 永江
  13. 7/9(火) 永江
  14. 7/16(火) 永江
  15. 7/23(火) 永江


2012年前期
  1. 4/17(火) 久原 データベースシステム概要
  2. 4/24(火) 久原 PHPサーバーサイドプログラミング
  3. 5/1(火) 久原 PHPのスクリプト, PHPサーバーサイドプログラミング
  4. 5/8(火) 久原 phpMyAdminによるデータベースの作成,SQLコマンド
  5. 5/15(火) 久原 MySQLのINSERT, SELECT
  6. 5/22(火) 久原 制作日
  7. 5/29(火) 久原 MySQLのLIMIT, WHERE, LIKE, DELETE, サーバ変数など、カスタマイズ。
  8. 6/5(火) 永江 jqueryの基礎
  9. 6/12(火) 永江 jquery form入力、日付処理
  10. 6/19(火) 永江 jqueryイベント処理
  11. 6/26(火) 永江 イベント処理の続き
  12. 7/3(火) 永江 jquery-ui
  13. 7/10(火) 永江 twitter api + json
  14. 7/17(火) 予備(課題制作・自習)日
  15. 7/31(火) 永江 twitter api + json + jquery + jquery-ui 課題制作・提出・講評
2011年前期
  1. 4/12(火) 久原 データベースシステム概要
  2. 4/19(火) 久原 PHPサーバーサイドプログラミング
  3. 4/26(火) 久原 PHPのスクリプト, PHPサーバーサイドプログラミング
  4. 5/10(火) 久原 phpMyAdminによるデータベースの作成,SQLコマンド
  5. 5/17(火) 久原 LIMIT, WHERE, LIKE, DELETE, サーバ変数$_SERVERなど、カスタマイズ。
  6. 5/24(火) 久原 DELETE,検索機能など。カスタマイズ。
  7. 5/31(火) 久原、森山 小テスト。課題の締め切りは、6/14(火)までです。
  8. 6/7(火) 永江 php おさらい
  9. 6/14(火) 永江 php + mysql 復習
  10. 6/21(火) 永江 php + xml
  11. 6/28(火) 永江
  12. 7/5(火) 永江
  13. 7/12(火) 永江 Twitter API 勉強会
  14. 7/19(火) 節電休講
  15. 7/26(火) 節電休講
2010年前期
  1. 4/12(月)授業の概要,アートとテクノロジー
    • 今日の質問:カメラをどのように使っているか書いてください。
  2. 4/19(月)コンテンツと著作権
    • 今日の質問:自分の好きなキャラクターを書いてください。
  3. 4/26(月)メディアの革命,創造のサイクルの実例
    • 今日の質問:自分がよく利用しているネットのサービスついて説明してください。
  4. 5/10(月)著作物の自由とコピーレフト
    • 今日の質問:自分が使うフリーのコンテンツについて説明してください。
    • ここまでにHTMLは復習しておくこと。以下の週はPC実習
  5. 5/17(月)データベースシステム概要
    • 今日の質問:Linuxのようなテキストでコマンドを打って操作するインターフェイスの利点を述べてください。
  6. 5/24(月)PHPサーバーサイドプログラミング
    • 今日の質問:666とは?
  7. 5/31(月)phpMyAdminによるデータベースの作成, PHPサーバーサイドプログラミング
    • 今日の質問:データベースとは?table, record, fieldの語を使って説明してください。
  8. 6/7(月)PHPサーバーサイドプログラミング
    • 今日の質問:今日のSQLについて説明してください。
  9. 6/14(月)PHPのスクリプト,SQLコマンド
    • 今日の質問:SELECTについて説明してください。
  10. 6/21(月)PHPのスクリプト,SQLコマンド
    • 今日の質問:課題でどんなサイトを作りたいか?
  11. 6/28(月)LIMIT, WHERE, LIKE, DELETE, $_SERVERなど、カスタマイズ。検索機能など。
    • 今日の質問:ホームページを作る時に使うソフトは?
  12. 7/5(月)カスタマイズ。DELETEなど。
  13. 7/12(月)カスタマイズ
  14. 7/17(土)(月曜振替日)自由演習日。
  15. 7/26(月)小テスト
2009年前期
  1. 4/13(月) 授業の概要,アートとテクノロジー
    • 今日の質問:テクノロジーがアートのリテラシー(「読み」「書き」のどちらでも)に貢献した例をあげてください。
  2. 4/20(月) コンテンツと著作権
    • 今日の質問:音楽コンテンツをどのように入手しているか書いてください。
  3. 4/27(月) メディアの革命,創造のサイクルの実例
    • 今日の質問:自分の好きなキャラクターについて説明してください。
  4. 5/11(月) 著作物の自由とコピーレフト
    • 今日の質問:ブログ、動画投稿サイト、SNSなどで自分が最も利用しているサービスついて説明してください。
    • ここまでにHTMLは復習しておくこと。
  5. 5/18(月) データベースシステム概要,Linux/Apache/htaccessの設定(実習)
    • 今日の質問:Linuxのようなテキストでコマンドを打って操作するインターフェイスの利点を述べてください。
  6. 5/25(月) PHPサーバーサイドプログラミング(実習)
    • 今日の質問:やぶられにくいパスワードとは?
  7. 6/1(月) PHPサーバーサイドプログラミング(実習)
    • 今日の質問:書き込み権限が必要になるファイルにはどんなものがある?
  8. 6/8(月) 休講
  9. 6/15(月) phpMyAdminによるデータベースの作成。サンプルHTML,PHPの動作確認
  10. 6/22(月) PHPのスクリプト,SQLコマンドの説明
    • 今日の質問:SQLのSELECT文で何ができますか?
  11. 6/29(月) PHPのスクリプト,SQLコマンドの説明
  12. 7/6(月) LIMIT, WHERE, LIKE, DELETE, $_SERVERなど、カスタマイズ。検索機能など。
  13. 7/13(月) 予備
  14. 7/20(月) 祝日(オープンキャンパス)
  15. 7/27(月) 小テスト
2008年前期
  1. 4/14(月) 授業の概要,アートとテクノロジー
  2. 4/21(月) コンテンツと著作権,創造のサイクルの実例
  3. 4/28(月) メディアの革命
  4. 5/12(月) 著作物の自由とコピーレフト
  5. 5/19(月) データベースシステム概要(実習)
  6. 5/26(月) Linux/Apache/htaccessの設定(実習)
  7. 6/2(月) PHPサーバーサイドプログラミング(実習)
  8. 6/9(月) 休講
  9. 6/16(月) phpMyAdminによるデータベースの作成。サンプルHTML,PHPの動作確認
  10. 6/23(月) PHPのスクリプト,SQLコマンドの説明
  11. 6/30(月) PHPのスクリプト,SQLコマンドの説明
  12. 7/7(月) カスタマイズ
  13. 7/14(月) 小テスト

データベースシステム概要

インターネット上のデータベースを使ったアート
データベース上の情報にアクセスしてFlashやWebスクリプトでヴィジュアライズした作品が多い。
クラウドソーシング
ビッグデータ

サーバーサイドプログラミング実習Apache/Linux

  • 実習のための準備
    • サーバ情報
    • WinSCPでサーバとローカルPCとの間でファイル転送する。
    • teratermPuTTYでサーバにログインし,Unixのコマンドを操作する。
  • 今、自分はどこで作業しているのか。サーバ側かローカルPC側か

よく使うUnixの基本的なコマンド

passwdコマンド パスワードの変更

[i0724000@sandbox ~]$ passwd
Changing password for user i0724000.
Changing password for i0724000.
(current) UNIX password:   現在のパスワードを入力(画面には何も表示されない)
New UNIX password:    新しいパスワードを入力
BAD PASSWORD: it does not contain enough DIFFERENT characters バスワードの文字が少ないとエラーになる。
New UNIX password:    新しいパスワードを入力
Retype new UNIX password:    新しいパスワードを再入力
passwd: all authentication tokens updated successfully.
[i0724000@sandbox ~]$

ls, ls -alコマンド ディレクトリ内のファイルの一覧表示(list -all long)

[i0724000@sandbox ~]$ ls
public_html
[i0724000@sandbox ~]$ ls -al
total 92
drwxr-xr-x   4 i0724000 i0724000  4096 2008-05-25 16:45 .
drwxr-xr-x 436 root     root     16384 2008-05-25 14:33 ..
-rw-------   1 i0724000 i0724000   162 2008-05-25 17:29 .bash_history
-rw-r--r--   1 i0724000 i0724000    33 2008-05-25 12:06 .bash_logout
-rw-r--r--   1 i0724000 i0724000   176 2008-05-25 12:06 .bash_profile
-rw-r--r--   1 i0724000 i0724000   124 2008-05-25 12:06 .bashrc
-rw-r--r--   1 i0724000 i0724000   500 2008-05-25 12:06 .emacs
drwxr-xr-x   2 i0724000 i0724000  4096 2008-05-25 12:07 public_html
-rw-------   1 i0724000 i0724000   705 2008-05-25 12:08 .viminfo
drwxr-xr-x   2 i0724000 i0724000  4096 2008-05-25 12:06 .xemacs
[i0724000@sandbox ~]$

cdコマンド ディレクトリの移動(change directory)

[i0724000@sandbox ~]$ cd public_html/    public_htmlディレクトリへ移動
[i0724000@sandbox public_html]$ cd ..      親(ホーム)ディレクトリへ移動
[i0724000@sandbox ~]$

mkdirコマンド ディレクトリの作成(make directory)

[i0724000@sandbox ~]$ mkdir conf  ディレクトリconfの作成
[i0724000@sandbox ~]$ cd conf  ディレクトリconfへ移動
[i0724000@sandbox conf]$ cd ..
[i0724000@sandbox ~]$ ls  現ディレクトリのリスト表示
conf  public_html
[i0724000@sandbox ~]$

catコマンド ファイルの中身を表示(catenate)

[i0724000@sandbox public_html]$ cat conf  ファイルindex.htmlの表示
i0724000
[i0724000@sandbox public_html]$

exitコマンド ログアウトする

[i0724000@sandbox]$ exit
または
[i0724000@sandbox]$ logout

注記

  • ~(チルダ)はホームディレクトリを意味する。..(ドットドット)は1つ上の親ディレクトリを意味する。
  • cdをカラで打つと、ホームディレクトリに戻る。
  • TABキーで,ファイル名を補完してくれる。
  • 上・下矢印キーで,過去に使用したコマンドを表示してくれる。
  • その他のコマンド
    • pwd 現在のディレクトリ(カレントディレクトリ)の表示
    • cp ファイルのコピー
    • mv ファイルの移動、名前の変更
    • rm ファイルの削除
    • vi テキストエディタ
    • xemacs テキストエディタ

アクセス制御

htaccessによるアクセス制御
アカウントとパスワードによって、特定のユーザだけにアクセスを許可する仕組み。ディレクトリごとにアカウントを設定することができる。(Apacheのみ)

PHPによるサーバサイドスクリプト実習

システムデザインの授業用のフォルダsysdを作り、サーバのpublic_htmlの下に、アップする。

http://blossom.media.t-kougei.ac.jp/~user10_000/sysd/

  • この授業の課題は上記のURLからリンクを張って見れるようにする。
  • 10_000の部分は自分のアカウントに変更する。

サーバ上のPHPに関する情報を表示

ローカルPC上で、以下の1行だけからなるphpinfo.phpという名前のファイルを作成する。

  • 保存場所は、public_html/sysdの中。
<?php phpinfo(); ?>

<?php?> で囲まれた部分がPHPのスクリプト

http://blossom.media.t-kougei.ac.jp/~i1224000/sysd/phpinfo.php

URLは上記のとおり。

現在日付,ファイル更新日付,アクセスカウンタ

  • test.php
  • アクセスカウンタの仕組み
    • カウント数を保存するファイルとしてcount.txtを使用している。count.txtはサーバ上に保存されなければならない。
    • ローカルPC上でメモ帳などで、count.txtを作成し、初期値として半角数字の1だけを記述する。
    • WinSCPでcount.txtをサーバに転送する。
    • サーバ上のcount.txtのパーミッション(ファイルアクセス権限)を666(rw-rw-rw-)にする。
  • r:read, w:write, x:execute
rwx binaryoctal
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7
owner group others
rwx rwx rwx
110 110 110
6 6 6

ownerもgroupもothersもread/wirteが可能でexecuteが不可

  • 以下のソースコード例。<?php?> で囲まれた部分がPHPのスクリプト
  • このソースのファイル名は,test.phpの場合なので,filemtime()関数内の./test.phpは,自分のつけたファイル名に応じて適宜変更すること。
  • ソースファイルtest.phpは、文字コードをUTF-8にしての保存すること。
<html>
<head>
<title>PHP test page</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h2>PHPのテストページ:現在時刻,ファイルの最終更新日時,アクセスカウンタの表示</h2>
<p>
現在の時刻は<?php echo date("Y/m/d(D) H:i:s", time()); ?>です。<br>
最後にこのファイルが修正されたのは,<?php print date("Y年m月d日H時i分s秒", filemtime("./test.php") ); ?> です。<br>
</p>
<p>
<i>アクセスカウント : <b>
<?php
  // 前もってカウント数を保存するファイルcount.txtを作成しておく。
  $countlog = "./count.txt";
  // データを読む
  $count = file_get_contents($countlog);
  // カウンタをひとつ増やす
  $count++;
  // カウンタの値をブラウザに表示する
  print "$count";

  // count.txtを書き込み可能な状態でオープンする
  $fp = fopen($countlog, "w");
  // count.txtにロックをかける
  flock($fp, LOCK_EX);
  // カウンタをcount.txtに保存する
  fputs($fp, $count, strlen($count));
  // count.txtにロックを解除する
  flock($fp, LOCK_UN);
  // count.txtをクローズする
  fclose($fp);
?>
</b></i>
</p>
</body>
</html>

PHPスクリプト解説

  • 変数は$で始まる文字列
    • $countlogには、カウンターのファイル名が入る
    • $countには、現在のカウンタの数が入る
  • printやechoは文字列を表示する。
  • 日付は,time()関数で日付情報を獲得し,date()関数で表示フォーマットする日付関数のマニュアル
  • filemtime(), file_get_contents(), fopen(), flock(), fputs(), fclose()などはPHPのファイルシステム関数
    • PHPは強力な関数がたくさん準備されていて,かなりのことができてしまう。

指定したURLにリダイレクト

HTMLのmetaタグによる方法
10秒後に指定したURLにジャンプするようにするには以下のようにheaderを指定する。
10を0に変更すれば、瞬時にジャンプする。
<head>
<meta http-equiv="refresh" content="10;URL=http://example.jp/***/***.html"> 
</head>
PHPを使った方法
無条件にリダイレクトする。
if文を使えば条件に応じて違うところにリダイレクトすること可能。
<?php
  header("HTTP/1.1 301 Moved Permanently");
  header("Location: http://example.jp/***/***.html");
?>
2秒後にリダイレクトする。
<?php
  header("Refresh: 2; URL=http://example.jp/***/***.html");
?>


Webデータベースプログラミング実習PHP+MySQL

  • 作成環境
    • Webサーバは,Apache 2.2.8 on Linux Fedoracore
    • ページ記述言語はHTML, CSS。TeraPadなどのテキストエディタで作成。
    • ページ内埋め込みスクリプトは,PHP 5.2.4。テキストエディタまたはDreamweaverなどで作成。
    • データベースは,MySQL 5.0.45。PHP内で記述。
    • データベース管理は,phpMyAdmin 2.11.6で操作。
    • 文字セットはutf8を使用。
  • 概念図

作成例1 アンケート収集・結果表示

アンケートを取るサンプル / 結果を見るサンプル

データベース上のテーブルを作成

アンケートの収集結果は、データベース内でテーブルという形式で保存される。また、PHPからアンケートの内容をいつでも参照できる。

  1. phpMyAdminにログイン
  2. 左のカラムにある自分の学籍番号に基づいて作られたデータベースを選択
  3. 新しいテーブルを作成
    • データベース i**24*** に新しいテーブルを作成する」の項目に下記の情報を入力
    • テーブルの名前:data01 フィールド数:7
      • テーブル名のスペルを間違えないように。たとえば、datadateと間違えるなど。
  4. テーブルの構造は以下の通り。各フィールドを入力し終えたら、[保存する]をクリック。
テーブル data01
フィールド種別長さ照合順序その他説明
idint11 auto_increment自動的に割り振られるID
date_timedatetime   回答をとった日時
namaevarchar50utf8_general_ci 回答者の名前
ageint11  回答者の年齢
gendervarchar5utf8_general_ci 回答者の性別
progvarchar2utf8_general_ci 回答内容(プログラミングの経験)
commenttext utf8_general_ci 補足の回答項目
  • データベースにテーブルdata01が作成されていることを確認する。

Phpmyadmindata01.jpg

文字化け対処方法

phpmyadminで、テーブルの照合順序をutf8_general_ciにする。

  1. phpmyadminにログインする。
  2. data01などのテーブルを選択する。
  3. 「構造」タブを選択する。
  4. 「照合順序」をが「latin1_swedish_ci」になっているカラムを「utf8_general_ci」に変更する。
    • 鉛筆マークの「変更」ボタンをクリックすると変更できます。


アンケートをとるページ

update_table01.html

  • 文字コードはutf-8で保存する。
  • HTMLのフォームでデータを入力し,PHPスクリプトへ渡す。
  • ローカルPCのエディタで作成して、ソースファイルを作成して、WinSCPでサーバにアップロードする。
  • アップロードする場所は、/home/user09_***/public_html/以下のディレクトリ
  • データ追加エラーTable unLock Errorが出るときは、phpMyAdminで作成したテーブル名、フィールド名が正しいか確認するしてください。

http://blossom.media.t-kougei.ac.jp/~kuha/sysd/update_table01.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>update table</title>
<link href="./style00.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>アンケート</h2>
<form action="update_table01.php" method="post">
<p>
	名前:<input type="text" name="namae">
	年齢:
	<select name="age">
	<option value="17">17</option>
	<option value="18">18</option>
	<option value="19" selected>19</option>
	<option value="20">20</option>
	<option value="21">21</option>
	<option value="22">22</option>
	<option value="23">23</option>
	<option value="24">24</option>
	</select>
</p>
<p>
    性別:
	<input type="radio" name="gender" value="m" /> 男 
	<input type="radio" name="gender" value="f" /> 女
</p>
<p>
あなたはプログラミングは?:
	<select name="prog">
    <option value="1">まったくできない</option>
    <option value="2">すこしはできる</option>
	<option value="3">まあまあできるほう</option>
	<option value="4">かなりできる</option>
	<option value="5">プロ級</option>
    </select>
</p>
<p>
自由に記述してください<br>
	<textarea rows="5" cols="80" name="comment"></textarea>
	<br>
</p>
<input type="submit" name="exec1" value="送信">
<input type="reset" name="exec2" value="リセット">
</form>

</body>
</html>

update_table01.php

  • 文字コードはutf-8で保存する。
  • 役割 入力フォームのデータを受け取り,データベースに書き込む。
  • ユーザ名パスワードデータベース名は自分のものに変更すること。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>update table01</title>
<link href="./style00.css" rel="stylesheet" type="text/css" />
</head>
<body>
<?php
	$namae = $_POST["namae"];
	$age = $_POST["age"];
	$gender = $_POST["gender"];
	$prog = $_POST["prog"];
	$comment = $_POST["comment"];

	$namae = htmlspecialchars($namae);
	if (!get_magic_quotes_gpc()){
		$namae = addslashes($namae);
	}
	$comment = htmlspecialchars($comment);
	if (!get_magic_quotes_gpc()){
		$comment = addslashes($comment);
	}

	echo "<p>名前 : $namae <br>";
	echo "<p>年齢 : $age <br>";
	echo "性別 : $gender <br>"; 
	echo "プログラミング : $prog <br>"; 
	echo "コメント : $comment <br></p>"; 
// DBに接続
	if(!$con=mysql_connect("localhost","ユーザ名","パスワード")){   //ユーザ名とパスワードは各自で設定
		echo "接続エラー";
		exit;
	}
	else{
		echo "DB接続完了<br>";
	}
// DBを選択
	if(!mysql_select_db("データベース名",$con)){ 
		echo "データベース選択エラー<br>";
		exit;
	}
	else{
		echo "DB選択完了<br>";
	}
// フォームで送られてきたデータでINSERT文を作成
	$sql = "INSERT INTO data01(date_time, namae, age, gender, prog, comment) ";
	$sql .= " VALUES('" . date("Y/m/d H:i:s") . "', '$namae', '$age', '$gender', '$prog', '$comment');";
	echo $sql; // コメントアウトをはずすと、実行されたSQLが表示される。
// テーブルロック
	$sql4lock = "LOCK TABLES data01 WRITE;";
	$res4lock = mysql_query($sql4lock, $con) or die("<p>Table Lock Error[Insert data01]</p>");
//テーブルロックが成功したら$sqlを実行する
	if($res4lock)
	{
		$res = mysql_query($sql, $con) or die("<p>データ追加エラー</p>");
	}
// テーブルアンロック
	$sql4unlock = "UNLOCK TABLES;";
	$res4unlock = mysql_query($sql4unlock, $con) or die("<p>Table unLock Error[Insert data01]</p>");
// DBから切断
	mysql_close($con);
// メッセージ出力
	echo "<p>送信完了</p>"; 
	echo "<p>アンケートご協力ありがとうございました。</p>";
?>
</body>
</html>

次のように書いても同じ。 $sqlの組み方に注意。

http://blossom.media.t-kougei.ac.jp/~kuha/sysd/update_table02.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>update table01</title>
<link href="./style00.css" rel="stylesheet" type="text/css" />
</head>
<body>

<?php
	$namae = $_POST["namae"];
	$age = $_POST["age"];
	$gender = $_POST["gender"];
	$prog = $_POST["prog"];
	$comment = $_POST["comment"];

	$namae = htmlspecialchars($namae);
	if (!get_magic_quotes_gpc()){
		$namae = addslashes($namae);
	}
	$comment = htmlspecialchars($comment);
	if (!get_magic_quotes_gpc()){
		$comment = addslashes($comment);
	}

	$time00 = date("Y/m/d H:i:s"); //現在時刻の取得

?>
	<p>名前 : <?php echo $namae ?><br>
	<p>年齢 : <?php $age ?><br>
	性別 : <?php $gender ?><br> 
	プログラミング : <?php $prog ?><br>
	コメント : <?php $comment ?><br></p> 

<?php
// DBに接続
	if( $con=mysql_connect("localhost","ユーザ名","パスワード") ){   //ユーザ名とパスワードは各自で設定
		echo "DB接続完了<br>";
	}
	else{
		echo "接続エラー";
		exit;
	}
// DBを選択
	if( mysql_select_db("データベース名",$con) ){ 
		echo "DB選択完了<br>";
	}
	else{
		echo "データベース選択エラー<br>";
		exit;
	}
// フォームで送られてきたデータでINSERT文を作成
	$sql = "INSERT INTO data01(date_time, namae, age, gender, prog, comment) ";
	$sql .= " VALUES('$time00', '$namae', '$age', '$gender', '$prog', '$comment');";
	echo $sql; // コメントアウトをはずすと、実行されたSQLが表示される。
// テーブルロック
	$sql4lock = "LOCK TABLES data01 WRITE;";
	$res4lock = mysql_query($sql4lock, $con) or die("<p>Table Lock Error[Insert data01]</p>");
//テーブルロックが成功したら$sqlを実行する
	if($res4lock)
	{
		$res = mysql_query($sql, $con) or die("<p>データ追加エラー</p>");
	}
// テーブルアンロック
	$sql4unlock = "UNLOCK TABLES;";
	$res4unlock = mysql_query($sql4unlock, $con) or die("<p>Table unLock Error[Insert data01]</p>");
// DBから切断
	mysql_close($con);
?>
	<p>送信完了</p> 
	<p>アンケートご協力ありがとうございました。</p>
</body>
</html>

PHPスクリプト解説

  • 変数は$で始まる文字列
  • POSTGETの変数渡し
    • $namae = $_POST["namae"];で変数namaeの値をPOSTで受け取る。
    • htmlspecialchars()でHTMLの特殊文字を HTMLの表示形式に変換する。
    • get_magic_quotes_gpc()の値がOFFのとき、addslashes() で「"」と「'」などをエスケープする。
  • echoで画面表示。"(ダブルクォーテーション)で文字列を囲む。
  • if else文で条件分岐
if(条件){
  条件が真の場合,実行される文;
}
else{
  条件が偽の場合,実行される文;
}
  • if文の条件内の!(感嘆符)は論理演算子の1つで、否定を意味する。
  • .(ピリオド)は文字列の連結
  • mysql_query()の()の中にSQLを記述する。
  • \n はアスキーコードの改行を意味する。このコードが来るとテキストエディター上で改行される。

たとえば以下の文字列は

今日は、いい天気\n明日は晴れ

テキストエディター上で以下のように表示される

今日は、いい天気
明日は晴れ

SQL解説

  • INSERT文でテーブルにレコードを追加する。構文解説
  • INSERT文の構文例
INSERT INTO テーブル名(フィールド名1, フィールド名2, ..... , フィールド名n) VALUES('フィールドの値1','フィールドの値2', ..... ,'フィールドの値n');
  • INSERT文の実行例
INSERT INTO data01(date_time, namae, age, gender, prog, comment) VALUES('$date_time','$namae','$age','$gender','$prog','$comment');

INSERT INTO data01(date_time, namae, age, gender, prog, comment) VALUES('2008/06/30 06:50:43','太郎','19','m','3','データーベースプログラミングをマスターしたいです。');

アンケートを見るページ

サンプルURL http://blossom.media.t-kougei.ac.jp/~kuha/sysd/show_table01.php

ファイル名 show_table01.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>show table</title>
<link href="./style00.css" rel="stylesheet" type="text/css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h2>テーブルの中身</h2>
登録日時降順
<?php
// DBに接続
	if(!$con=mysql_connect("localhost","ユーザ名","パスワード")){ 
		echo"接続失敗";
		exit;
	}
// DBを選択
	if(!mysql_select_db("データベース名",$con)){ 
		echo"データベース選択失敗";
		exit;
	}
// SELECT文を設定
       $sql = "SELECT * FROM data01 ORDER BY date_time DESC";
// SELECT文実行
	if(!$res=mysql_query($sql)){
		echo "SQL失敗<BR>";
		exit;
	}
?>
検索結果表示
<table border=1>
<tr><td>id</td><td>date_time</td><td>name</td><td>age</td><td>gender</td>
<td>programing</td>
<td>comment</td>
</tr>

<?php while( $row=mysql_fetch_array($res) ){ ?>
	<tr>
	<td><?php echo $row["id"] ?> </td>
	<td><?php echo $row["date_time"] ?></td>
	<td><?php echo $row["namae"] ?></td>
	<td><?php echo $row["age"] ?></td>
	<td><?php echo $row["gender"] ?></td>
	<td><?php echo $row["prog"] ?></td>
	<td><?php echo nl2br($row["comment"]) ?></td>
	</tr>
<?php } ?>

</table>

<?php
// 結果セットの解放
	mysql_free_result($res);
// データベースから切断
	mysql_close($con);
?>
</body>
</html>

PHPスクリプト解説

  • $res = mysql_query("SELECT ...")
    • SQLのSELECT文を実行して,データベースから条件に合致するレコードを取得する。検索結果をすべて$resに格納する。検索に失敗したら,0(偽)を返す。
  • $row=mysql_fetch_array($res)
    • 検索結果が格納された$resから,先頭から順番に1レコード文のデータを配列$rowに入れる。レコードがなくなったら0(偽)を返す。
    • $row["フィールド名"]で,レコードのフィールドの値を参照できる。
  • while文で繰り返しループ処理。(条件)が真の間,繰り返し実行される。偽になったらループを抜ける。
while(条件){
  条件が真の間,実行される文;
}

while($row=mysql_fetch_array($res))$res内に読み取るレコードがなくなるまでループを繰り返す。

  • nl2br(文字列)
    • 文字列内の改行コード文字の前に HTML の改行タグを挿入する。
    • 改行コードとは、もともとタイプライターの「CR」(Carriage Return : 行頭復帰)と「LF」(Line Feed : 行送り)の2つのコードに由来しており、WindowsではCR+LF(\r\n)、Mac OSではCR(\r)、UNIXではLF(\n)が使われている。

SQL解説

  • SELECT文でテーブから条件に合致するコードを検索する。構文解説
  • SELECT文の構文例
SELECT フィールド名 FROM テーブル名 検索条件
  • INSERT文の実行例
SELECT * FROM data01 ORDER BY date_time DESC
  • テーブルdata01から,すべてのフィールド(*)を取り出す。検索は,日時(date_time)の降順(ORDER BY ... DESC)で取り出す。
  • WHEREを使って,検索条件を絞り込む。以下の例は,フィールドageの値が21未満のレコードのみを検索する。
SELECT * FROM data01 WHERE age < 21 ORDER BY date_time DESC

作成例2 簡単BBS

書き込みと表示の一体型ページ

  • テーブル名:data02 フィールド数:4
テーブル data02
フィールド種別長さ照合順序その他
idint11 auto_increment
date_timedatetime   
namaevarchar50utf8_general_ci 
commenttext utf8_general_ci 

ファイル名 easy_bbs01.php

  • 文字コードはutf-8で保存する。
  • 役割 データ入力フォーム,データベースへの書込み,データの表示
  • 上記のアンケートの例を1つのページにまとまたもの。
  • $_SERVER['SCRIPT_NAME']は,サーバ変数の1つで、自分のファイル名を取得する。 この場合は、easy_bbs01.phpになる。
  • if文の条件判定の括弧内にあるand論理演算子の論理積。およびを意味する。&&とも書く。


サンプルURL: http://blossom.media.t-kougei.ac.jp/~kuha/sysd/easy_bbs01.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>easy bbs</title>
<link href="./style00.css" rel="stylesheet" type="text/css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h2>簡単BBS</h2>
<?php
// DBに接続
	if(!$con=mysql_connect("localhost","ユーザ名","パスワード")){ 
		echo"接続失敗";
		exit;
	}
// DBを選択
	if(!mysql_select_db("データベース名",$con)){ 
		echo"データベース選択失敗";
		exit;
	}
// POSTデータ取得
	$namae = $_POST["namae"];
	$comment = $_POST["comment"];
	$namae = htmlspecialchars($namae);
	if (!get_magic_quotes_gpc()){
		$namae = addslashes($namae);
	}
	$comment = htmlspecialchars($comment);
	if (!get_magic_quotes_gpc()){
		$comment = addslashes($comment);
	}
// 現在日付、時刻の取得
	$time00 = date("Y/m/d H:i:s");

// POSTデータが存在するときINSERT文を作成、DB更新
	if(!empty($namae) and !empty($comment))
	{
	  $sql = " INSERT INTO data02( date_time, namae, comment) VALUES( '$time00','$namae','$comment');";
	  echo $sql;
// テーブルロック
	  $sql4lock = "LOCK TABLES data02 WRITE;";
	  if( mysql_query($sql4lock, $con) ){
		$res = mysql_query($sql, $con) or die("<p>データ追加エラー</p>"); //INSERT文 実行
	  }
	  else{
		echo "<p>Table Lock Error[Insert data02]</p>";
	  }
// テーブルアンロック
	  $sql4unlock = "UNLOCK TABLES;";
	  $res4unlock = mysql_query($sql4unlock, $con) or die("<p>Table unLock Error[Insert data02]</p>");
	}
//データ入力フォーム
?>
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
<p>
名前:<input type="text" name="namae"><br>
書込み内容<br>
	<textarea rows="5" cols="40" name="comment"></textarea>
	<br>
</p>
<input type="submit" name="exec1" value="送信">
<input type="reset" name="exec2" value="リセット">
</form>

<?php
// SQLのSELECT文作成
	$sql = "SELECT * FROM data02 ORDER BY date_time DESC";
// SELECT文実行
	if(!$res=mysql_query($sql)){
		echo "SQL失敗<BR>";
		exit;
	}
?>

<h2>検索結果表示</h2>

<table>
<?php while($row=mysql_fetch_array($res)){ ?>
	<tr><td><hr></td></tr>
	<tr><td><?php echo $row["namae"] ?> at <?php echo $row["date_time"] ?></td></tr>
	<tr><td><?php echo nl2br($row['comment']) ?></td></tr>
	</tr>
<?php 	} ?>
</table>
<?php
// 結果セットの解放
	mysql_free_result($res);
// データベースから切断
	mysql_close($con);
?>
</body>
</html>

SQLの応用

抽出データ数の制限 LIMIT

  • SELECT文で抽出データ数を制限する。
  • 以下の例は、簡単BBSで、時間の新しい順に最新の10件だけを抽出する例。
SELECT * FROM data02 ORDER BY date_time DESC LIMIT 10

抽出レコードの条件設定 WHERE

  • SELECT文で抽出レコードの条件を指定する。
  • 以下の例は、「アンケートを見るページ」で、プログラミング経験が「2」以下のレコードだけを抽出するSQLの例。
SELECT * FROM data01 WHERE prog <= 2 ORDER BY date_time DESC
  • 以下の例は、「アンケートを見るページ」で、プログラミングスキル値をメニューから選択して、選択した値以上のレコードだけを抽出するPHPスクリプトの例。ファイル名「show_table02.php
  • サンプルURL : http://blossom.media.t-kougei.ac.jp/~kuha/sysd/show_table02.php
  • 基準となるプログラミングスキル値を入れる変数として$prog_stが追加されている。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>show table</title>
<link href="./style00.css" rel="stylesheet" type="text/css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h2>テーブルの中身</h2>
<?php
// DBに接続
	if(!$con=mysql_connect("localhost","ユーザ名","パスワード")){ 
		echo"接続失敗";
		exit;
	}
// DBを選択
	if(!mysql_select_db("データベース名",$con)){ 
		echo"データベース選択失敗";
		exit;
	}
// POSTデータ取得
	$prog_st = $_POST["prog_st"];
	if( empty($prog_st) ) $prog_st = 0;
// SELECT文を設定
    $sql = "SELECT * FROM data01 WHERE prog >= $prog_st ORDER BY date_time DESC";
// SQLの表示。デバック用。運用時にはコメントアウトする。
	echo $sql;
// SELECT文実行
	if(!$res=mysql_query($sql)){
		echo "SQL失敗<BR>";
		exit;
	}
//データ入力フォーム
?>
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
<p>
プログラミングスキル値が
	<select name="prog_st">
	<option value="1" <?php if($prog_st == 1) echo "selected" ?>>1</option>
	<option value="2" <?php if($prog_st == 2) echo "selected" ?>>2</option>
	<option value="3" <?php if($prog_st == 3) echo "selected" ?>>3</option>
	<option value="4" <?php if($prog_st == 4) echo "selected" ?>>4</option>
	<option value="5" <?php if($prog_st == 5) echo "selected" ?>>5</option>
	</select>
以上のレコードを表示
<input type="submit" name="exec1" value="実行">
</form>
<br />
登録日時降順
</p>
検索結果表示
<table border=1>
<tr><td>通し番</td><td>回答日時</td><td>名前</td><td>年齢</td><td>性別</td>
<td>スキル</td><td>コメント</td>
</tr>
<?php while( $row=mysql_fetch_array($res) ){ ?>
	<tr>
	<td><?php echo $row["id"] ?> </td>
	<td><?php echo $row["date_time"] ?></td>
	<td><?php echo $row["namae"] ?></td>
	<td><?php echo $row["age"] ?></td>
	<td><?php echo $row["gender"] ?></td>
	<td><?php echo $row["prog"] ?></td>
	<td><?php echo nl2br($row["comment"]) ?></td>
	</tr>
<?php } ?>
</table>

<?php
// 結果セットの解放
	mysql_free_result($res);
// データベースから切断
	mysql_close($con);
?>
</body>
</html>

WHEREとLIKEでキーワード検索

  • 以下の例は、「簡単BBS」で、検索キーワード「abc」をコメント(comment)に含むレコードだけを抽出するSQLの例。
SELECT * FROM data02 WHERE comment LIKE '%abc%'
  • 以下の例は、「簡単BBS」で、検索キーワードを指定して、コメントにキーワードを含むレコードだけを抽出するPHPスクリプトの例。ファイル名「easy_bbs02.php
  • サンプルURL : http://blossom.media.t-kougei.ac.jp/~kuha/sysd/easy_bbs02.php
  • キーワードを入れる変数として$kwordが追加されている。
  • SQLは、$sql,$where,$orderの3つの文字列を連結して作成している。
    • $whereで、WHERE句の条件を指定
    • $orderで、ORDERの昇順・降順を指定
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>easy bbs</title>
<link href="./style00.css" rel="stylesheet" type="text/css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h2>簡単BBS</h2>
<?php
// DBに接続
	if(!$con=mysql_connect("localhost","ユーザ名","パスワード")){ 
		echo"接続失敗";
		exit;
	}
// DBを選択
	if(!mysql_select_db("データベース名",$con)){ 
		echo"データベース選択失敗";
		exit;
	}
// POSTデータ取得
	$namae = $_POST["namae"];
	$comment = $_POST["comment"];
	$kword = $_POST["kword"];
	$namae = htmlspecialchars($namae);
	if (!get_magic_quotes_gpc()){
		$namae = addslashes($namae);
	}
	$comment = htmlspecialchars($comment);
	if (!get_magic_quotes_gpc()){
		$comment = addslashes($comment);
	}
	$kword = htmlspecialchars($kword);
	if (!get_magic_quotes_gpc()){
		$kword = addslashes($kword);
	}
	$time00 = date("Y/m/d H:i:s");

// POSTデータが存在するときINSERT文を作成、DB更新
	if(!empty($namae) and !empty($comment))
	{
	  $date00 = date("Y/m/d H:i:s");
	  $sql = "INSERT INTO data02(date_time, namae, comment) VALUES('$time00','$namae','$comment');";
//	  echo $sql;
// テーブルロック
	  $sql4lock = "LOCK TABLES data02 WRITE;";
	  $res4lock = mysql_query($sql4lock, $con) or die("<p>Table Lock Error[Insert data02]</p>");
	  if($res4lock)
	  {
		$res = mysql_query($sql, $con) or die("<p>データ追加エラー</p>");
	  }
// テーブルアンロック
	  $sql4unlock = "UNLOCK TABLES;";
	  $res4unlock = mysql_query($sql4unlock, $con) or die("<p>Table unLock Error[Insert data02]</p>");
	}
//データ入力フォーム
?>
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
<p>
名前:<input type="text" name="namae"><br>
書込み内容<br>
	<textarea rows="5" cols="40" name="comment"></textarea>
	<br>
検索キーワード:<input type="text" name="kword">
</p>
<input type="submit" name="exec1" value="送信">
<input type="reset" name="exec2" value="リセット">
</form>

<?php
// SQLのSELECT文作成
	$sql = "SELECT * FROM data02 ";
	$where = "WHERE comment LIKE '%$kword%' ";
	$order = "ORDER BY date_time DESC";
	$sql .= $where.$order;
//	echo $sql;
// SELECT文実行
	if(!$res=mysql_query($sql)){
		echo "<p>SQL失敗</p>";
		exit;
	}
?>

<h2>検索結果表示</h2>

<table>
<?php while($row=mysql_fetch_array($res)){ ?>
	<tr><td><hr></td></tr>
	<tr><td><?php echo $row["namae"] ?> at <?php echo $row["date_time"] ?></td></tr>
	<tr><td><?php echo nl2br($row['comment']) ?></td></tr>
	</tr>
<?php 	} ?>
</table>

<?php
// 結果セットの解放
	mysql_free_result($res);
// データベースから切断
	mysql_close($con);
?>
</body>
</html>

レコードの削除 DELETE

以下のDELETE文で、条件に合致するレコードを削除することができる。

DELETE FROM テーブル名 WHERE 条件式;

たとえば、id50であるレコードをdata01テーブルから削除するSQLは以下のとおり。

DELETE FROM data01 WHERE id = 50;
  • 以下の例は、「アンケートを見るページ」で、レコード選択して削除するPHPスクリプトの例。ファイル名「show_table03.php
  • サンプルURL : http://blossom.media.t-kougei.ac.jp/~kuha/sysd/show_table03.php
  • 削除したいレコードの「id」をフォーム内のhidden属性のデータとして変数$del_recに入れてPOST渡しをし、SQLのDELTE文で削除している。
  • この状態では誰でも削除できてしまうので、htaccessでアクセス制限をかけるとか、レコードごとにパスワードを設定するとかするのが一般的。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>show table</title>
<link href="./style00.css" rel="stylesheet" type="text/css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h2>テーブルの中身を表示03</h2>
<?php
// DBに接続
	if(!$con=mysql_connect("localhost","アカウント名","パスワード")){ 
		echo"接続失敗";
		exit;
	}
// DBを選択
	if(!mysql_select_db("データベース名",$con)){ 
		echo"データベース選択失敗";
		exit;
	}
// POSTデータ取得
	$prog_st = $_POST["prog_st"];
	if( empty($prog_st) ) $prog_st = 0;
	$del_rec = $_POST["del_rec"];
// 削除するレコードがある場合、DELETE文を実行
	if( $del_rec > 0 ){
		$sql_d = "DELETE FROM data01 WHERE id = $del_rec ";
		// SQLの表示。デバック用。運用時にはコメントアウトする。
		echo $sql_d."<br>";
		if(!$res=mysql_query($sql_d)){
			echo "SQL DELETE失敗<BR>";
			exit;
		}
	}
// SELECT文を設定
    $sql = "SELECT * FROM data01 WHERE prog >= $prog_st ORDER BY date_time DESC";
// SQLの表示。デバック用。運用時にはコメントアウトする。
	echo $sql;
// SELECT文実行
	if(!$res=mysql_query($sql)){
		echo "SQL失敗 SELECT<BR>";
		exit;
	}
//データ入力フォーム
?>
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
<p>
プログラミングスキル値が
	<select name="prog_st">
	<option value="1" <?php if($prog_st == 1) echo "selected" ?>>1</option>
	<option value="2" <?php if($prog_st == 2) echo "selected" ?>>2</option>
	<option value="3" <?php if($prog_st == 3) echo "selected" ?>>3</option>
	<option value="4" <?php if($prog_st == 4) echo "selected" ?>>4</option>
	<option value="5" <?php if($prog_st == 5) echo "selected" ?>>5</option>
	</select>
以上のレコードを表示
<input type="submit" name="exec1" value="実行">
</form>
<br />
登録日時降順
</p>
<h2>検索表示</h2>
	<table border=1>
	<tr><td>id</td><td>delete</td><td>date_time</td><td>name</td><td>age</td><td>gender</td>
	<td>programing</td>
	<td>comment</td>
	</tr>
<?php
	while($row=mysql_fetch_array($res)){
		$Nr = $row["id"];
?>
		<tr>
		<td><?php echo $Nr ?></td>
		<td>
		<!-- 削除するレコードを選択する FORM -->
		<form method=post action="<?php echo $_SERVER['SCRIPT_NAME'] ?>">
		<input type=hidden name=del_rec value="<?php echo $Nr ?>">
		<input type=submit name=submit value=Del></form>
		<!-- form ここまで -->
		</td>
		<td> <?php echo $row["date_time"] ?></td>
		<td> <?php echo $row["namae"] ?></td>
		<td> <?php echo $row["age"] ?></td>
		<td> <?php echo $row["gender"] ?></td>
		<td> <?php echo $row["prog"] ?></td>
		<td> <?php echo nl2br($row["comment"]) ?></td>
		</tr>
 <?php 	} ?>
	</table>
<?php
// 結果セットの解放
	mysql_free_result($res);
// データベースから切断
	mysql_close($con);
?>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>easy bbs</title>
<link href="./style00.css" rel="stylesheet" type="text/css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h2>簡単BBS03</h2>
<?php
// DBに接続
	if(!$con=mysql_connect("localhost","アカウント名","パスワード")){ 
		echo"接続失敗";
		exit;
	}
// DBを選択
	if(!mysql_select_db("データベース名",$con)){ 
		echo"データベース選択失敗";
		exit;
	}
// POSTデータ取得
	$namae = $_POST["namae"];
	$comment = $_POST["comment"];
	$kword = $_POST["kword"];
	$namae = htmlspecialchars($namae);
	if (!get_magic_quotes_gpc()){
		$namae = addslashes($namae);
	}
	$comment = htmlspecialchars($comment);
	if (!get_magic_quotes_gpc()){
		$comment = addslashes($comment);
	}
	$kword = htmlspecialchars($kword);
	if (!get_magic_quotes_gpc()){
		$kword = addslashes($kword);
	}
	$time00 = date("Y/m/d H:i:s");
// 削除するレコードがある場合、DELETE文を実行
	$del_rec = $_POST["del_rec"];
	if( $del_rec > 0 ){
		$sql_d = "DELETE FROM data02 WHERE id = $del_rec ";
		// SQLの表示。デバック用。運用時にはコメントアウトする。
		echo "$sql_d <br>";
		if(!$res=mysql_query($sql_d)){
			echo "SQL DELETE失敗<BR>";
			exit;
		}
	}

// POSTデータが存在するときINSERT文を作成、DB更新
	if(!empty($namae) and !empty($comment))
	{
		$time00 = date("Y/m/d H:i:s");
		$sql = "INSERT INTO data02( date_time, namae, comment) ";
		$sql .= "VALUES('$time00','$namae','$comment');";
//		echo $sql;
// テーブルロック
		$sql4lock = "LOCK TABLES data02 WRITE;";
		$res4lock = mysql_query($sql4lock, $con) or die("<p>Table Lock Error[Insert data02]</p>");
		if($res4lock)
		{
			$res = mysql_query($sql, $con) or die("<p>データ追加エラー</p>");
		}
// テーブルアンロック
		$sql4unlock = "UNLOCK TABLES;";
		$res4unlock = mysql_query($sql4unlock, $con) or die("<p>Table unLock Error[Insert data02]</p>");
	}
//データ入力フォーム
?>
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
<p>
名前:<input type="text" name="namae"><br>
書込み内容<br>
	<textarea rows="5" cols="40" name="comment"></textarea>
	<br>
検索キーワード:<input type="text" name="kword">
</p>
<input type="submit" name="exec1" value="送信">
<input type="reset" name="exec2" value="リセット">
</form>

<?php
// SQLのSELECT文作成
	$sql = "SELECT * FROM data02 ";
	$where = "WHERE comment LIKE '%$kword%' ";
	$order = "ORDER BY date_time DESC";
	$sql .= $where.$order;
//	echo $sql;
// SELECT文実行
	if(!$res=mysql_query($sql)){
		echo "<p>SQL失敗</p>";
		exit;
	}
?>

<h2>検索表示</h2>
	<table>
<?php while($row=mysql_fetch_array($res)){
		$Nr = $row["id"];
?>
		<tr><td><hr></td></tr>
		<tr><td>
		<!-- 削除するレコードを選択するFORM -->
		<form method=post action="<?php echo $_SERVER['SCRIPT_NAME'] ?>">
		<input type=hidden name=del_rec value=<?php echo $Nr ?>>
		<input type=submit name=submit value=Del></form>
		<!-- FORM ここまで -->
		<?php echo $row["namae"] ?> at <?php echo $row["date_time"] ?>
		</td></tr>
		<tr><td><?php echo nl2br($row["comment"]) ?></td></tr>
		</tr>
<?php } ?>
	</table>
<?php
// 結果セットの解放
	mysql_free_result($res);
// データベースから切断
	mysql_close($con);
?>
</body>
</html>

サーバ変数 $_SERVER

サーバ変数はPHPで予め定義されている変数で、サーバの持つ様々な情報を保持している。配列になっているので$_SERVER['何らかのキー']として使う。

$_SERVER['HTTP_REFERER']    // リファラー
$_SERVER['SCRIPT_NAME']    //自分のファイル名
$_SERVER['HTTP_USER_AGENT']    //ユーザが利用しているブラウザ情報
$_SERVER['REMOTE_ADDR'];    //ユーザのIPアドレス
$_SERVER['REMOTE_HOST'];    //ユーザのホスト名
  • 上記の情報を収集してデータベースに記録するには、テーブルに情報保存用のフィールドを追加する必要がある。そして、INSERT文で、収集したいサーバ変数を挿入する。
  • 以下の例は、「簡単BBS」において、INSERT文で、リファラーを追加する例。事前に、phpMyAdminでテーブルdata02にリファラー保存用のフィールドrefererを作成しておく必要がある。
$sql = "INSERT INTO data02(date_time, namae, comment, referer) VALUES('$time00','$namae','$commen','$_SERVER['HTTP_REFERER']');

REMOTE_HOSTの値は取得できないように設定しているサーバも多い。その場合、gethostbyaddr()関数を使用する。この関数はIPアドレスからホスト名を取得する。

gethostbyaddr($_SERVER['REMOTE_ADDR']);

ユーザのIPアドレスを取得して、IPアドレスとhost名を取得する例。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>easy bbs</title>
<link href="./style00.css" rel="stylesheet" type="text/css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h2>簡単BBS03</h2>
<?php
// DBに接続
	if(!$con=mysql_connect("localhost","アカウント名","パスワード")){ 
		echo"接続失敗";
		exit;
	}
// DBを選択
	if(!mysql_select_db("データベース名",$con)){ 
		echo"データベース選択失敗";
		exit;
	}
// POSTデータ取得
	$namae = $_POST["namae"];
	$comment = $_POST["comment"];
	$kword = $_POST["kword"];
	$namae = htmlspecialchars($namae);
	if (!get_magic_quotes_gpc()){
		$namae = addslashes($namae);
	}
	$comment = htmlspecialchars($comment);
	if (!get_magic_quotes_gpc()){
		$comment = addslashes($comment);
	}
	$kword = htmlspecialchars($kword);
	if (!get_magic_quotes_gpc()){
		$kword = addslashes($kword);
	}
	$time00 = date("Y/m/d H:i:s");
//	$hostn = $_SERVER['REMOTE_HOST'];
	$ip = $_SERVER['REMOTE_ADDR'];
	$hostn = gethostbyaddr($_SERVER["REMOTE_ADDR"])

;

// 削除するレコードがある場合、DELETE文を実行
	$del_rec = $_POST["del_rec"];
	if( $del_rec > 0 ){
		$sql_d = "DELETE FROM data02 WHERE id = $del_rec ";
		// SQLの表示。デバック用。運用時にはコメントアウトする。
		echo "$sql_d <br>";
		if(!$res=mysql_query($sql_d)){
			echo "SQL DELETE失敗<BR>";
			exit;
		}
	}

// POSTデータが存在するときINSERT文を作成、DB更新
	if(!empty($namae) and !empty($comment))
	{
		$sql = "INSERT INTO data02( date_time, namae, comment, hostn, ip) ";
		$sql .= "VALUES('$time00','$namae','$comment','$hostn','$ip');";
		echo $sql;
// テーブルロック
		$sql4lock = "LOCK TABLES data02 WRITE;";
		$res4lock = mysql_query($sql4lock, $con) or die("<p>Table Lock Error[Insert data02]</p>");
		if($res4lock)
		{
			$res = mysql_query($sql, $con) or die("<p>データ追加エラー</p>");
		}
// テーブルアンロック
		$sql4unlock = "UNLOCK TABLES;";
		$res4unlock = mysql_query($sql4unlock, $con) or die("<p>Table unLock Error[Insert data02]</p>");
	}
//データ入力フォーム
?>
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
<p>
名前:<input type="text" name="namae"><br>
書込み内容<br>
	<textarea rows="5" cols="40" name="comment"></textarea>
	<br>
検索キーワード:<input type="text" name="kword">
</p>
<input type="submit" name="exec1" value="送信">
<input type="reset" name="exec2" value="リセット">
</form>

<?php
// SQLのSELECT文作成
	$sql = "SELECT * FROM data02 ";
	$where = "WHERE comment LIKE '%$kword%' ";
	$order = "ORDER BY date_time DESC";
	$sql .= $where.$order;
//	echo $sql;
// SELECT文実行
	if(!$res=mysql_query($sql)){
		echo "<p>SQL失敗</p>";
		exit;
	}
?>

<h2>検索表示</h2>
	<table>
<?php while($row=mysql_fetch_array($res)){
		$Nr = $row["id"];
?>
		<tr><td><hr></td></tr>
		<tr><td>
		<!-- 削除するレコードを選択するFORM -->
		<form method=post action="<?php echo $_SERVER['SCRIPT_NAME'] ?>">
		<input type=hidden name=del_rec value=<?php echo $Nr ?>>
		<input type=submit name=submit value=Del></form>
		<!-- FORM ここまで -->
		<?php echo $row["namae"] ?> at <?php echo $row["date_time"] ?> from <?php echo gethostbyaddr($row["ip"]); ?> ip = <?php echo $row["ip"] ?>
        </td></tr>
		<tr><td><?php echo nl2br($row["comment"]) ?></td></tr>
		</tr>
<?php } ?>

	</table>
<?php
// 結果セットの解放
	mysql_free_result($res);
// データベースから切断
	mysql_close($con);
?>
</body>
</html>

参考資料

課題

PHP+MySQLを使用したWebデータベースシステムを作成して、以下の一覧から参照できるようにしてください。 例題をそのまま使うのではなく、各自でカスタマイズしてください。

各自のpublic_htmlの下のsysdという名前のフォルダの中に index.html を作り、課題のページをリンクしてください。

アカウントがi1224000の学生の場合、URLは以下の通りです。

http://blossom.media.t-kougei.ac.jp/~i1224000/sysd/index.html

i1224000のindex.htmlの例

  • 文字コードは、utf-8にしてください。
<html>
<body>
ここは1224000のコーゲータローのシステムデザインの課題のページです。<br>
<h4>システムデザイン課題</h4>
<ul>
<li><a href="update_table01.html">アンケートを取るページ</a></li>
<li><a href="show_table01.php">アンケート結果を見る</a></li>
<li><a href="easy_bbs01.php">簡単BBS</a></li>
</ul>

</body>
</html>

以下の一覧から課題のページが参照できることを確認すること。

締め切りは、2013/6/25(火)です。

2013年度

2013年度の課題のページ /

2012年度

1024000 / 924003 / 924073 / 1024011 / 1024012 / 1024032 / 1024056 / 1024058 / 1024063 / 1024068 / 1024076 / 1124004 / 1124006 / 1124008 / 1124014 / 1124015 / 1124016 / 1124017 / 1124018 / 1124024 / 1124027 / 1124030 / 1124034 / 1124037 / 1124040 / 1124048 / 1124049 / 1124050 / 1124053 / 1124054 / 1124058 / 1124060 / 1124061 /

2011年度

1024001 / 1024003 / 1024004 / 1024007 / 1024010 / 1024012 / 1024017 / 1024018 / 1024024 / 1024025 / 1024026 / 1024031 / 1024032 / 1024038 / 1024040 / 1024042 / 1024044 / 1024047 / 1024052 / 1024053 / 1024054 / 1024055 / 1024057 / 1024061 / 1024064 / 1024069 / 1024070 / 1024073 / 1024075 / 1024080 /

2010年度

0624095 / 0724040 / 0724069 / 0724085 / 0724091 / 0724101 / 0824002 / 0824049 / 0824085 / 0824092 / 0924004 / 0924009 / 0924010 / 0924011 / 0924014 / 0924015 / 0924018 / 0924023 / 0924024 / 0924025 / 0924026 / 0924027 / 0924028 / 0924030 / 0924033 / 0924035 / 0924036 / 0924038 / 0924040 / 0924044 / 0924045 / 0924047 / 0924048 / 0924049 / 0924050 / 0924051 / 0924053 / 0924054 / 0924058 / 0924060 / 0924061 / 0924062 / 0924063 / 0924065 / 0924072 / 0924078 / 0924079 / 0924082 / 0924083 / 0924084 / 0924085 / 0924086 / 0924088 / 0924089 / 0924094 / 0924095 / 0924096 / 0924099 / 0924103 /

2009年度

0824002 / 0824009 / 0824015 / 0824025 / 0824031 / 0824037 / 0824041 / 0824056 / 0824080 / 0824106 / 0824108 / 0824111 / 0724023 / 0724041 / 0724085 / 0624087 / 0624100 /

2008年度

0424402 / 0524122 / 0724003 / 0724024 / 0724027 / 0724042 / 0724061 / 0724062 / 0724063 / 0724067 / 0724071 / 0724079 / 0724086 / 0724097 / 0824401 /

過去のDB課題

2007 / 2006 / 2005 / 2004 /

小テスト

  • 場所はいつものPC演習室です。
  • 持ち込みは不可です。
  • 机の上には一切,何も置かないで下さい。
  • 座席は隣は1つ空けて座ってください。
  • 試験中に他のホームページを開くことは,不正行為と見なします。

--Kuha 2007年4月16日 (月) 21:39 (JST)

個人用ツール
名前空間

変種
操作
案内
ツールボックス