=> [[山内の授業のページ]]

アクセス数 &counter();  このページの最終更新 &lastmod();

***プロジェクト 山内担当分   [#pd94b245]

タイトル: PHP言語を用いて、サービス提供型のホームページを作る

概要:
例えば情報検索やオンラインショッピングのサイトなど、サーバーが何らかの計算や処理の結果を送り出すようなホームページサイトがあります。サーバーがユーザからの入力を受け取って計算処理をし、結果を表示するようなホームページサイトを企画し、構築します。~
新しいサービスのサイト、役に立つサイトなど、工夫を凝らしてください。

>>> 2013-06-23 ≪こんなまとめサイトがあった≫ [[【自分でも作れる!】プログラミング初心者が作ったWebサービス8選:http://matome.naver.jp/odai/2137179803100174701]]


実施方法:~
2年生と3年生の合同プロジェクトとして運営します。&color(red){学年の違う仲間と混成チームを組んで、協力・助け合って};1つの作品を仕上げて下さい。いろいろと不都合も起こるかもしれませんが、是非みんなで協力して有意義な時間にしましょう。~
第1回に4名(2年が2名+3年が2名)ずつのグループに分けます。~

全7回は次のように使う予定です。
|   |2年のグループ3&br;3年のグループ2|2年のグループ4&br;3年のグループ1||
|第1回|4/08 |6/03 |プロジェクトの概要説明、基本知識の学習(1)|
|第2回|4/15 |6/10 |基本知識の学習(2)|
|第3回|4/22 |6/17 |基本知識の学習(3)、サイトデザイン|
|第4回|5/06 |6/24 |サイトデザインまとめと発表、製作(1)|
|第5回|5/13 |7/01 |製作(2)|
|第6回|5/20 |7/08 |製作(3)|
|第7回|5/27 |7/15 |プロジェクト発表|

基本知識のための資料 (最終更新 2016-04-06)
-一括ダウンロードする場合:  &ref(all.pdf,,資料3回分の一括ダウンロード);

回別ファイル(上記と同じものを回に分けたファイル)
-&ref(第1回.pdf,,第1回目); (第1章サービス提供型ホームページ、第2章ホームページとHTMLタグ、第3章フォームによる入力)
-&ref(第2回.pdf,,第2回目); (第4章PHP言語、第5章フォームとPHPプログラム、第6章データベースの基礎知識)
-&ref(第3回.pdf,,第3回目); (第7章MySQLを使ってみる、第8章PHPからMySQLを呼び出す)

その他
-&ref(山内の授業のページ/14春/プロジェクト/proj_summary.pdf,,初回授業で使ったパワポ);
-&ref(山内の授業のページ/16春/プロジェクト/proj_summary.pdf,,初回授業で使ったパワポ);

**おまけの資料 [#gac0d520]
***セッション管理 [#c12bece0]
-セッション管理をする
--セッションの考え方: Web (http) は、異なる画面の間で≪同じユーザが見ているか≫という情報を持たない。それを持たせるためには、PHPではsessionという機能を使う。~
[[セッション管理の解説:http://www.scollabo.com/banban/php/php_14.html]]、 [[セッションの解説:http://kamakura.cool.ne.jp/oppama/oswa/phpsession.html]]、 [[セッションの解説:http://c-brains.jp/blog/wsg/08/05/22-193020.php]]
--どんな時にセッションが欲しいか: あるページで入力した内容と、次にとんだページで入力した内容が、関連するものであるとき。たとえば、欲しい商品を入力するページを「送信」し、それによって支払い金額を計算して次のページに表示するとき、それに対して「OK」という入力をさせるとすると、違うページで入力することになる。
--認証とセッション: ユーザ認証をした時、認証をしたページと次の(それ以降の)ページとの間で、上記の≪同じユーザが見ているとは限らない≫の状況が起こるので、後ろのページが認証されていないことになる。なので、セッションを使って同じユーザであるようにしなければならない。
--[[PHPマニュアルのセッションの項:http://jp.php.net/session]]
-ユーザの認証をする。
--FORMによってユーザにIDとパスワードを入力(ログイン)させ、サーバー側で持っているパスワードと一致するかどうかを調べればよい。データベースを使うのが簡単だろう。IDとパスワードを保持するテーブルを作っておけばよい。
--テーブルへの登録は、それなりに考えた方法で行う必要があるだろう。たとえば、ヾ浜者IDでログインしたユーザのみID+パスワード登録を許す、▲罅璽極椰佑ログインしたときだけパスワードの変更を許す、といった組み合わせが考えられる。
-認証とセッションを組み合わせる
--認証した結果をセッション内のすべてのページに適用する(つまり、最初に正しくログインしないと、以降のページにアクセスできない。以降のページに直接URLを書いてアクセスしても、見せない)ためには、各ページのPHPの先頭でセッションを確認し、正しくなければ打ち切る、という仕組みを入れる必要がある。
--例(データベースを使ってユーザ認証、ただしMySQLではなくPostgresSQLを使っている):[[第3回:PHP応用 6.セッション管理:http://www.stackasterisk.jp/tech/php/php03_06.jsp]]

-非常に単純化したサンプルプログラムを作った ⇒ [[山内のセッションサンプル>山内の授業のページ/10春/プロジェクト/セッションサンプル]]
--本当はもっときちんと作らないとセキュリティが穴だらけだが、原理だけを理解するためのごく単純化したサンプル。

-付言: ややこしいので、PHPではライブラリが提供されている。PHPLIBや、PEARのSESSIONを使うことができるが、pegasusの環境では用意していない。

***ファイルをアップロードする [#tec03c72]
写真などをアップロードする方法には、いくつかありえる。
-普通(マニュアル等に書いてある方法で、一時フォルダにアップロードした写真などのファイルをPHPのおいてあるフォルダに移し、それに対するアクセス<img src="...">を書く方法(このプロジェクトの環境では書き込み許可がなくて使えない)。~
[[PHPマニュアル:http://jp.php.net/features.file-upload]]~
[[PHP入門講座アップロード:http://w1.nirai.ne.jp/freeze/main/file09.html]]
-このプロジェクトの環境で使える方法。写真データをデータベース中に書き込む(blob形式で書く)~
表示する側で、データベースから読み出しながら表示するためには、ちょっとした仕掛けが必要になる。~
[[山内のサンプル>山内の授業のページ/08春/プロジェクト/アップロード]]
--考え方は、<img src="ファイル名">とするようなファイル名が使えないので、このファイル名の側もPHPのプログラムにしてしまう。そのためのプログラムが、サンプル中のshow.phpである。要するにデータベースから読み出して端末に書き出すだけだが、先頭にヘッダーをつける必要がある。~
なお、show.phpの引数として、画像データベースのキー(この例ではtitle)を、次のようにして渡す。 show.php?title=ホゲホゲ


***PHPに引数を渡す [#a2160824]
HTMLページのURLの後ろに"?"を付けて、引数を書くことができる。~
たとえば、http://********.php?name=alphaとかhttp://*******.php?param=hogehogeとか。
このURLによって起動されるページ(phpプログラム)から、alphaなりhogehogeなりを読み出すことができる。具体的には、システムで定義される変数_GET["name"]にalphaが入っていたり、_GET["param"]にhogehogeが入っていたりするので([[PHPマニュアルのここ参照:http://www.php.net/manual/ja/reserved.variables.get.php]])
、それを読み出せばよい。~
~
これを使って、こんなことができる。
    ファイル screen1.php
 <?php
   print('<html> <body>');
   for ($i=0; $i<4; $i++) {
     print('<a href="screen2.php?num=' . $i . '">button' . $i . '</a></br>');
   }
   print(' </body> </html>');
 ?>
~
    ファイル screen2.php (クリックで飛ぶ先)
 <?php
   print('<html><body>');
   print('This is Screen ' . $_GET["num"]);
   print('</body></html>');
 ?>
~
#ref(山内の授業のページ/10春/プロジェクト/parameter1.JPG,right,around,wrap);
screen1を実行すると、右の画面が得られる。選択肢としてループで4つの選択肢button0〜3を書いている。~
~
この中から、たとえばbutton2をクリックすると、URL "screen2.php?num=2" をアクセスしようとする。これは、ファイルscreen2.phpを起動すると同時に、引数としてキーワードnumの引数の値2を与えている。~
~
呼び出されたscreen2.phpで、$_GET["num"] によって引数を抽出すると、値2が読めるので、画面に This is Screen 2 のように表示できる。
#ref(山内の授業のページ/10春/プロジェクト/parameter2.JPG,right,around,wrap);

***ページ間のデータの受け渡しの便法 (2013-05-24) [#t309400d]
HTTP/HTMLでは、異なるページの間では変数を参照することができない。だから、あるページで使ったデータをほかのページでも使いたいときは、データベースに書き込むなどする必要がある。

それほど大げさでないとき、ちょっとデータを渡したい、というときに使える便法がいくつか作られている。その1つに、HIDDEN属性を持ったINPUTフィールドがある。(このほかの方法は自分で探してほしい。)

たとえば、[[「このページ」:http://www.htmq.com/html/input_hidden.shtml]]にHIDDENの説明がある。

具体的には次のようにすればできる。まず、次のような myhidden.html があるとしよう。
 <HTML>
 <HEAD><TITLE>Hallo</TITLE></HEAD>
 <BODY>
 <FORM action="myhidden.php" method="post">
  <input type="text" name="xyz" value="hallo">
  <input type="hidden" name="wxy" value="3.1416">
  <input type="submit" name="submit" value="SEND">
 </FORM>
 </BODY>
 </HTML>
5行目の <input type="text" name="xyz" value="hallo"> は普通のテキスト入力行だが、~
6行目の <input type="hidden" name="wxy" value="3.1416"> は type="hidden" としてある、HIDDEN入力である。

これは、画面には表示されないが、入力の行としては存在しており、submitボタンで送信したとき name="wxy" でアクセスすることができる。また、値を value="3.1416" という文字列に初期設定している。

このページの submit ボタンによって起動されるプログラム myhidden.php を次のようにしておく。
 <?php
   $str = $_POST["xyz"];
   print($str . "<br>");
   $hiddenstring = $_POST["wxy"];
   print("Hidden string is " . $hiddenstring . "<br>");
 ?>
ここでは、2行目の POST["xyz"] では通常のテキスト入力を名前"xyz"で受け取っているが、~
4行目の POST["wxy"] でHIDDEN入力を名前"wxy"で受け取っている。"wxy"は表示したときに初期値 value="3.1416" に初期化しているので、受け取る値は "3.1416" である。

このようにすると、前の画面 myhidden.html から、次の画面 myhidden.php へ、3.1416というデータを渡すことができる。

一般には、渡す値は定数ではなくて変数なので、前の画面 myhidden.html のようにHTMLファイルではなくて、むしろ PHPファイル(プログラム)として、print文で1行ずつプリントして画面を作ることになるだろう。たとえば、
 <?php
  $pi = "3.1416";
  print('<HEAD><TITLE>Hallo</TITLE></HEAD>');
  print('<BODY>');
  print('<FORM action="myhidden.php" method="post">');
  print('  <input type="text" name="xyz" value="hallo">');
  print('  <input type="hidden" name="wxy" value="' . $pi . '">');
  print('  <input type="submit" name="submit" value="SEND">');
  print('</FORM>');
  print('</BODY>');
  print('</HTML>');
 ?>
のようにすることになるだろう。変数 $pi の値を受け渡していることになる。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS