システムデザイン
(→ファイル名 easy_bbs01.php) |
(→サーバ変数 $_SERVER) |
||
(1人の利用者による、間の14版が非表示) | |||
18行: | 18行: | ||
# 5/21(火) '''久原''' MySQLのINSERT, SELECT | # 5/21(火) '''久原''' MySQLのINSERT, SELECT | ||
# 5/28(火) '''久原''' MySQLのLIMIT, WHERE, LIKE, DELETE, サーバ変数など、カスタマイズ。 | # 5/28(火) '''久原''' MySQLのLIMIT, WHERE, LIKE, DELETE, サーバ変数など、カスタマイズ。 | ||
− | # 6/4(火) ''' | + | # 6/4(火) '''久原''' 課題について |
# 6/11(火) '''永江''' | # 6/11(火) '''永江''' | ||
# 6/18(火) '''永江''' | # 6/18(火) '''永江''' | ||
25行: | 25行: | ||
# 7/9(火) '''永江''' | # 7/9(火) '''永江''' | ||
# 7/16(火) '''永江''' | # 7/16(火) '''永江''' | ||
− | # 7/23(火) | + | # 7/23(火) '''永江''' |
790行: | 790行: | ||
</pre> | </pre> | ||
'''while($row=mysql_fetch_array($res))'''は'''$res'''内に読み取るレコードがなくなるまでループを繰り返す。 | '''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解説 ==== | ==== SQL解説 ==== | ||
822行: | 826行: | ||
* 役割 データ入力フォーム,データベースへの書込み,データの表示 | * 役割 データ入力フォーム,データベースへの書込み,データの表示 | ||
* 上記のアンケートの例を1つのページにまとまたもの。 | * 上記のアンケートの例を1つのページにまとまたもの。 | ||
− | * '''$_SERVER['SCRIPT_NAME']''' | + | * '''$_SERVER['SCRIPT_NAME']'''は,'''サーバ変数'''の1つで、自分のファイル名を取得する。 この場合は、'''easy_bbs01.php'''になる。 |
* '''if'''文の条件判定の括弧内にある'''and'''は[http://php.benscom.com/manual/ja/language.operators.logical.php 論理演算子]の論理積。'''および'''を意味する。'''&&'''とも書く。 | * '''if'''文の条件判定の括弧内にある'''and'''は[http://php.benscom.com/manual/ja/language.operators.logical.php 論理演算子]の論理積。'''および'''を意味する。'''&&'''とも書く。 | ||
859行: | 863行: | ||
$comment = addslashes($comment); | $comment = addslashes($comment); | ||
} | } | ||
+ | // 現在日付、時刻の取得 | ||
$time00 = date("Y/m/d H:i:s"); | $time00 = date("Y/m/d H:i:s"); | ||
899行: | 904行: | ||
exit; | exit; | ||
} | } | ||
+ | ?> | ||
<h2>検索結果表示</h2> | <h2>検索結果表示</h2> | ||
1,239行: | 1,245行: | ||
<td> <?php echo nl2br($row["comment"]) ?></td> | <td> <?php echo nl2br($row["comment"]) ?></td> | ||
</tr> | </tr> | ||
− | <?php } ?> | + | <?php } ?> |
</table> | </table> | ||
<?php | <?php | ||
1,396行: | 1,402行: | ||
<pre> | <pre> | ||
gethostbyaddr($_SERVER['REMOTE_ADDR']); | gethostbyaddr($_SERVER['REMOTE_ADDR']); | ||
+ | </pre> | ||
+ | |||
+ | ユーザのIPアドレスを取得して、IPアドレスとhost名を取得する例。 | ||
+ | <pre> | ||
+ | <!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> | ||
</pre> | </pre> | ||
1,407行: | 1,544行: | ||
例題をそのまま使うのではなく、各自でカスタマイズしてください。 | 例題をそのまま使うのではなく、各自でカスタマイズしてください。 | ||
− | 各自の'''public_html''' | + | 各自の'''public_html'''の下の'''sysd'''という名前のフォルダの中に '''index.html''' を作り、課題のページをリンクしてください。 |
− | + | ||
アカウントが'''i1224000'''の学生の場合、URLは以下の通りです。 | アカウントが'''i1224000'''の学生の場合、URLは以下の通りです。 | ||
<pre> | <pre> | ||
− | http://blossom.media.t-kougei.ac.jp/~i1224000/sysd/ | + | http://blossom.media.t-kougei.ac.jp/~i1224000/sysd/index.html |
</pre> | </pre> | ||
− | [http://blossom.media.t-kougei.ac.jp/~i1224000/sysd/ | + | [http://blossom.media.t-kougei.ac.jp/~i1224000/sysd/index.html i1224000のindex.htmlの例] |
+ | *文字コードは、utf-8にしてください。 | ||
<pre> | <pre> | ||
1,431行: | 1,569行: | ||
</pre> | </pre> | ||
以下の一覧から課題のページが参照できることを確認すること。 | 以下の一覧から課題のページが参照できることを確認すること。 | ||
− | ;締め切りは、''' | + | ;締め切りは、'''2013/6/25(火)'''です。 |
+ | ===2013年度=== | ||
+ | [http://www.kuhalabo.net/~web/examination/sysd2013.html 2013年度の課題のページ] / | ||
===2012年度=== | ===2012年度=== |
2013年6月4日 (火) 02:55時点における最新版
目次 |
[編集] Information
- 成績評価
- 出席:出席管理システム(学生証持参)+PC教室ログイン状況+Minutes paper
- 課題:システムプログラミング
- 小テスト:小テストのハイスコア / 旧バージョンのハイスコア /
- サイボウズ(システムデザイン) / チュートリアルwww.media版
- HTMLの知識を持っていることを前提とします。
[編集] Schedule
- 2013年前期
- 4/16(火) 久原 データベースシステム概要
- 4/23(火) 久原 PHPサーバーサイドプログラミング
- 4/30(火) 久原 課題制作日
- 5/7(火) 久原 PHPのスクリプト, PHPサーバーサイドプログラミング
- 5/14(火) 久原 phpMyAdminによるデータベースの作成,SQLコマンド
- 5/21(火) 久原 MySQLのINSERT, SELECT
- 5/28(火) 久原 MySQLのLIMIT, WHERE, LIKE, DELETE, サーバ変数など、カスタマイズ。
- 6/4(火) 久原 課題について
- 6/11(火) 永江
- 6/18(火) 永江
- 6/25(火) 永江
- 7/2(火) 永江
- 7/9(火) 永江
- 7/16(火) 永江
- 7/23(火) 永江
- 2012年前期
- 4/17(火) 久原 データベースシステム概要
- 4/24(火) 久原 PHPサーバーサイドプログラミング
- 5/1(火) 久原 PHPのスクリプト, PHPサーバーサイドプログラミング
- 5/8(火) 久原 phpMyAdminによるデータベースの作成,SQLコマンド
- 5/15(火) 久原 MySQLのINSERT, SELECT
- 5/22(火) 久原 制作日
- 5/29(火) 久原 MySQLのLIMIT, WHERE, LIKE, DELETE, サーバ変数など、カスタマイズ。
- 6/5(火) 永江 jqueryの基礎
- 6/12(火) 永江 jquery form入力、日付処理
- 6/19(火) 永江 jqueryイベント処理
- 6/26(火) 永江 イベント処理の続き
- 7/3(火) 永江 jquery-ui
- 7/10(火) 永江 twitter api + json
- 7/17(火) 予備(課題制作・自習)日
- 7/31(火) 永江 twitter api + json + jquery + jquery-ui 課題制作・提出・講評
- 2011年前期
- 4/12(火) 久原 データベースシステム概要
- 4/19(火) 久原 PHPサーバーサイドプログラミング
- 4/26(火) 久原 PHPのスクリプト, PHPサーバーサイドプログラミング
- 5/10(火) 久原 phpMyAdminによるデータベースの作成,SQLコマンド
- 5/17(火) 久原 LIMIT, WHERE, LIKE, DELETE, サーバ変数$_SERVERなど、カスタマイズ。
- 5/24(火) 久原 DELETE,検索機能など。カスタマイズ。
- 5/31(火) 久原、森山 小テスト。課題の締め切りは、6/14(火)までです。
- 6/7(火) 永江 php おさらい
- 6/14(火) 永江 php + mysql 復習
- 6/21(火) 永江 php + xml
- 6/28(火) 永江
- 7/5(火) 永江
- 7/12(火) 永江 Twitter API 勉強会
- 7/19(火) 節電休講
- 7/26(火) 節電休講
- 2010年前期
- 4/12(月)授業の概要,アートとテクノロジー
- 今日の質問:カメラをどのように使っているか書いてください。
- 4/19(月)コンテンツと著作権
- 今日の質問:自分の好きなキャラクターを書いてください。
- 4/26(月)メディアの革命,創造のサイクルの実例
- 今日の質問:自分がよく利用しているネットのサービスついて説明してください。
- 5/10(月)著作物の自由とコピーレフト
- 今日の質問:自分が使うフリーのコンテンツについて説明してください。
- ここまでにHTMLは復習しておくこと。以下の週はPC実習
- 5/17(月)データベースシステム概要
- 今日の質問:Linuxのようなテキストでコマンドを打って操作するインターフェイスの利点を述べてください。
- 5/24(月)PHPサーバーサイドプログラミング
- 今日の質問:666とは?
- 5/31(月)phpMyAdminによるデータベースの作成, PHPサーバーサイドプログラミング
- 今日の質問:データベースとは?table, record, fieldの語を使って説明してください。
- 6/7(月)PHPサーバーサイドプログラミング
- 今日の質問:今日のSQLについて説明してください。
- 6/14(月)PHPのスクリプト,SQLコマンド
- 今日の質問:SELECTについて説明してください。
- 6/21(月)PHPのスクリプト,SQLコマンド
- 今日の質問:課題でどんなサイトを作りたいか?
- 6/28(月)LIMIT, WHERE, LIKE, DELETE, $_SERVERなど、カスタマイズ。検索機能など。
- 今日の質問:ホームページを作る時に使うソフトは?
- 7/5(月)カスタマイズ。DELETEなど。
- 7/12(月)カスタマイズ
- 7/17(土)(月曜振替日)自由演習日。
- 7/26(月)小テスト
- 2009年前期
- 4/13(月) 授業の概要,アートとテクノロジー
- 今日の質問:テクノロジーがアートのリテラシー(「読み」「書き」のどちらでも)に貢献した例をあげてください。
- 4/20(月) コンテンツと著作権
- 今日の質問:音楽コンテンツをどのように入手しているか書いてください。
- 4/27(月) メディアの革命,創造のサイクルの実例
- 今日の質問:自分の好きなキャラクターについて説明してください。
- 5/11(月) 著作物の自由とコピーレフト
- 今日の質問:ブログ、動画投稿サイト、SNSなどで自分が最も利用しているサービスついて説明してください。
- ここまでにHTMLは復習しておくこと。
- 5/18(月) データベースシステム概要,Linux/Apache/htaccessの設定(実習)
- 今日の質問:Linuxのようなテキストでコマンドを打って操作するインターフェイスの利点を述べてください。
- 5/25(月) PHPサーバーサイドプログラミング(実習)
- 今日の質問:やぶられにくいパスワードとは?
- 6/1(月) PHPサーバーサイドプログラミング(実習)
- 今日の質問:書き込み権限が必要になるファイルにはどんなものがある?
- 6/8(月) 休講
- 6/15(月) phpMyAdminによるデータベースの作成。サンプルHTML,PHPの動作確認
- 6/22(月) PHPのスクリプト,SQLコマンドの説明
- 今日の質問:SQLのSELECT文で何ができますか?
- 6/29(月) PHPのスクリプト,SQLコマンドの説明
- 7/6(月) LIMIT, WHERE, LIKE, DELETE, $_SERVERなど、カスタマイズ。検索機能など。
- 7/13(月) 予備
- 7/20(月) 祝日(オープンキャンパス)
- 7/27(月) 小テスト
- 2008年前期
- 4/14(月) 授業の概要,アートとテクノロジー
- 4/21(月) コンテンツと著作権,創造のサイクルの実例
- 4/28(月) メディアの革命
- 5/12(月) 著作物の自由とコピーレフト
- 5/19(月) データベースシステム概要(実習)
- 5/26(月) Linux/Apache/htaccessの設定(実習)
- 6/2(月) PHPサーバーサイドプログラミング(実習)
- 6/9(月) 休講
- 6/16(月) phpMyAdminによるデータベースの作成。サンプルHTML,PHPの動作確認
- 6/23(月) PHPのスクリプト,SQLコマンドの説明
- 6/30(月) PHPのスクリプト,SQLコマンドの説明
- 7/7(月) カスタマイズ
- 7/14(月) 小テスト
[編集] データベースシステム概要
- 簡単BBSによく使うブラウザを書いてみよう。
- WWWサーバとクライアント
- サーバのシェア調査(Webなど),クライアントのシェア調査(OS,ブラウザなど)
- CGIによるサーバサイドスクリプト例(電子掲示板):renKanon board
- PHPによるサーバサイドスクリプト例(アクセス解析):MIDI作品アクセス解析
- ASPによるサーバサイドスクリプト例(Webデータベース):Media Art 作品データベースシステム
- ColdFusionによるサーバサイドスクリプト例:COOKPAD
- インターネット上のデータベースを使ったアート
- データベース上の情報にアクセスしてFlashやWebスクリプトでヴィジュアライズした作品が多い。
- クラウドソーシング
- 不特定多数の人からなる素材で構成される作品。ネット時代の可能性を秘めた表現
- テクネ 映像の教室「クラウドソーシング」
- テクネ 3-3 クラウドソーシング
- ビッグデータ
[編集] サーバーサイドプログラミング実習Apache/Linux
- 実習のための準備
- サーバ情報
- WinSCPでサーバとローカルPCとの間でファイル転送する。
- WinSCPのサイト:自分のHDDにインストール
- teratermやPuTTYでサーバにログインし,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 | binary | octal |
---|---|---|
--- | 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からアンケートの内容をいつでも参照できる。
- phpMyAdminにログイン
- 左のカラムにある自分の学籍番号に基づいて作られたデータベースを選択
- 新しいテーブルを作成
- 「データベース i**24*** に新しいテーブルを作成する」の項目に下記の情報を入力
- テーブルの名前:data01 フィールド数:7
- テーブル名のスペルを間違えないように。たとえば、dataをdateと間違えるなど。
- テーブルの構造は以下の通り。各フィールドを入力し終えたら、[保存する]をクリック。
テーブル data01 | |||||||
---|---|---|---|---|---|---|---|
フィールド | 種別 | 長さ | 照合順序 | その他 | 説明 | ||
id | int | 11 | auto_increment | 自動的に割り振られるID | |||
date_time | datetime | 回答をとった日時 | |||||
namae | varchar | 50 | utf8_general_ci | 回答者の名前 | |||
age | int | 11 | 回答者の年齢 | ||||
gender | varchar | 5 | utf8_general_ci | 回答者の性別 | |||
prog | varchar | 2 | utf8_general_ci | 回答内容(プログラミングの経験) | |||
comment | text | utf8_general_ci | 補足の回答項目 |
- データベースにテーブルdata01が作成されていることを確認する。
[編集] 文字化け対処方法
phpmyadminで、テーブルの照合順序をutf8_general_ciにする。
- phpmyadminにログインする。
- data01などのテーブルを選択する。
- 「構造」タブを選択する。
- 「照合順序」をが「latin1_swedish_ci」になっているカラムを「utf8_general_ci」に変更する。
- 鉛筆マークの「変更」ボタンをクリックすると変更できます。
[編集] アンケートをとるページ
[編集] update_table01.html
- 文字コードはutf-8で保存する。
- HTMLのフォームでデータを入力し,PHPスクリプトへ渡す。
- ローカルPCのエディタで作成して、ソースファイルを作成して、WinSCPでサーバにアップロードする。
- アップロードする場所は、/home/user09_***/public_html/以下のディレクトリ
- 本授業用にフォルダ(たとえばsysd)を作っておくとよい。
- sysdというフォルダに保存した場合は,http://blossom.media.t-kougei.ac.jp/~user10_000/sysd/update_table01.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スクリプト解説
- 変数は$で始まる文字列
- POSTとGETの変数渡し
- $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
- 文字コードはutf-8で保存する。
- データベースからデータを読み取り,表示する。
- sysdというフォルダに保存した場合は,http://blossom.media.t-kougei.ac.jp/~i1224000/sysd/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 | ||||
---|---|---|---|---|
フィールド | 種別 | 長さ | 照合順序 | その他 |
id | int | 11 | auto_increment | |
date_time | datetime | |||
namae | varchar | 50 | utf8_general_ci | |
comment | text | 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 条件式;
たとえば、idが50であるレコードを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>
- 以下の例は、「簡単BBS」で、レコード選択して削除するPHPスクリプトの例。ファイル名「easy_bbs03.php」
- サンプルURL : http://blossom.media.t-kougei.ac.jp/~kuha/sysd/easy_bbs03.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>簡単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
- 文字コードは、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年度
[編集] 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課題
[編集] 小テスト
- 場所はいつものPC演習室です。
- 持ち込みは不可です。
- 机の上には一切,何も置かないで下さい。
- 座席は隣は1つ空けて座ってください。
- 試験中に他のホームページを開くことは,不正行為と見なします。
--Kuha 2007年4月16日 (月) 21:39 (JST)