サーバサイドプログラミング PHP
プログラム言語 PHP(Hypertext Preprocesser) は、HTML文書(Webページ)をプログラムで自動生成するための言語です。
Webサーバ側でPHPスクリプトは処理され、実行結果としてHTML文書が生成されます。生成されたHTMLがブラウザに用事されます。
・JavaScriptは、スクリプトはHTMLに埋め込まれます。ブラウザでスクリプトを読み込み、実行し、実行結果が表示されます。
→クライアントサイドプログラミング
・PHPは、サーバサイドプログラミングです。
参考資料:
・XAMPPコントロールで Apache Webサーバを起動しておく。
・VS Code で htdocs の学籍番号フォルダを開く。
・フォルダ php1 を作成する。
例1)
フォームでサーバにメッセージを送信し、PHPでメッセージを処理・加工してブラウザに送り返して表示する。
ファイル名 index.php を作成(拡張子 .php に注意)
HTMLによるデータ送信用フォーム。送信データは、 index.php で処理される。
<!DOCTYPE html><html><head><meta charset="utf-8"><title>PHPフォーム</title></head><body><h1>送信・受信兼用ページ</h1><p>送信ボタンを押して、テキストボックスに入力したメッセージをサーバへ送る。</p><form action = "index.php" method = "post"><input type = "text" name ="data" size="80" value="このメッセージを書き換えてみよう!"><br><br><input type = "submit" value ="送信"></form></body></html>実行確認URLの例) http://localhost/3116777/php1/
テキスト処理用の php スクリプトを組み込む。送信データは 変数 $data に格納され、<?=$dada?> のコードでHTMLに組み込まれ表示されている。
<?php// メッセージが送信されてきているかチェックif ($_SERVER['REQUEST_METHOD'] == 'POST') { //メッセージがあるかチェック if(isset($_POST['data'])) { $data = $_POST['data'];?><p>メッセージ: <?=$data?> を受信した</p><?php }}?>繰り返し処理: 指定した回数、メッセージを繰り返し表示(改行なし)。 echo は PHP の表示コマンド。
<p>リピート</p><?phpforeach(range(0,20) as $i) { echo $data;}?><br>文字列を1文字ずつ分解し、各文字に記号を付け加えて表示する。
・ preg_split は PHP の正規表現パターンを使用した文字列分解コマンド。 "//u" は先頭と文末を含む全ての文字の切れ目を示すパターン。
<p>♡化</p><?phpforeach(preg_split("//u", $data) as $c) { echo $c . "♡";}?><br>文字列を1文字ずつ分解し、各文字に 改行タグ <br> を付け加えて表示する。
<p>縦書き化</p><?phpforeach(preg_split("//u", $data) as $c) { echo $c . "<br>";}?><br>メッセージの先頭から1文字ずつ文字を取り出し、 左 中央 右 の3箇所に配置する。表示位置をずらしていく。
・mb_substr で、文字列 $data の$i 番目から1文字取り出している。
・str_repeat は、間を埋める空白文字を文字数を調整しながら生成している。
<p>☆化</p><pre><?php$len = mb_strlen($data);foreach(range(0,$len/2-1) as $i) { echo str_repeat(" ",$i); echo mb_substr($data,$i,1); echo str_repeat(" ",$len/2-1-$i); echo mb_substr($data,$i,1); echo str_repeat(" ",$len/2-1-$i); echo mb_substr($data,$i,1); echo str_repeat(" ",$i); echo "<br>";}echo $data . "<br>";foreach(range($len/2-1,0) as $i) { echo str_repeat(" ",$i); echo mb_substr($data,$len-$i,1); echo str_repeat(" ",$len/2-1-$i); echo mb_substr($data,$len-$i,1); echo str_repeat(" ",$len/2-1-$i); echo mb_substr($data,$len-$i,1); echo str_repeat(" ",$i); echo "<br>";}?></pre><br>実験:
フォームにタグを埋め込んで、送信してみる。
<font size=+5>おおきくなった!</font>XSS攻撃
<script>alert("びっくりした?")</script>※Chrome は POPUP Blocker が機能して、攻撃を防ぐ模様。
※例題には、セキュリティホールあり。スクリプトを悪用した攻撃について調べ、自衛のため勉強しておこう。
PHPによるセッション管理の例)
ブラウザで表示するページを切り替えても、セッションを継続して、ページ間のプログラムで情報を共有する。
・フォルダ php2 を作成する。
作業例)
例2)
・正しいキーワードを入力しないと、次のページに進ませないPHPスクリプト
・次のページのURLをブラウザで直接指定して表示させようとしても、PHPスクリプトで正しいキーワードが入力済みかチェックして適切に処理する。
ファイル名 index.php を作成(拡張子 .php に注意)
・キーワード入力用ページ
<!DOCTYPE html><html><head><meta charset="utf-8"><title>PHPセッション</title></head><body><h1>セッションスタート</h1><p>キーワードを入力して送信ボタンを押す。</p><form action = "index.php" method = "post"><input type = "text" name ="data" size="40" value="あいうえお"><br><br><input type = "submit" value ="送信"></form><?php// メッセージが送信されてきているかチェックif ($_SERVER['REQUEST_METHOD'] == 'POST') { //メッセージがあるかチェック if(isset($_POST['data'])) { $data = $_POST['data']; session_start(); // セッションの開始を通知。 if(isset($_SESSION['count'])){ $count = $_SESSION["count"]; // セッション変数 count の読み込み }else{ $count = 0; } $count++; // 送信回数を1増加 $_SESSION["count"] = $count; // セッション変数 count を更新?><p>キーワード: <?=$data?> を受信した</p><p>送信回数: <?=$count?> 回</p><?php } //キーワードチェック if($data == "あかさたな") { echo "キーワード確認OK<br>"; $_SESSION["stage1"]=1; // ステージ1を1にする echo '<a href="index2.php">ステージ2へ</a>'; } else { echo "正しいキーワードを送信してください。<br>"; $_SESSION["stage1"]=0; // ステージ1を0にする }}?></body></html>ファイル名 index2.php を作成(ファイル名 に注意)
・キーワード入力ページその2 2つめのキーワードを入力します。
<!DOCTYPE html><html><head><meta charset="utf-8"><title>PHPセッション</title></head><body><?phpsession_start();// ステージ1でキーワードが正しく入力されていない場合if($_SESSION['stage1']==0) { echo "ステージ1に戻ってください<br>"; echo '<a href="index.php">ステージ1へ</a>'; return; //ステージ2の表示を中断してプログラム実行修了}?><h1>ステージ2</h1><p>キーワードを入力して送信ボタンを押す。</p><form action = "index2.php" method = "post"><input type = "text" name ="data" size="40" value="あいうえお"><br><br><input type = "submit" value ="送信"></form><?php// メッセージが送信されてきているかチェックif ($_SERVER['REQUEST_METHOD'] == 'POST') { //メッセージがあるかチェック if(isset($_POST['data'])) { $data = $_POST['data']; if(isset($_SESSION['count'])){ $count = $_SESSION["count"]; // セッション変数 count の読み込み }else{ $count = 0; } $count++; // 送信回数を1増加 $_SESSION["count"] = $count; // セッション変数 count を更新?><p>キーワード: <?=$data?> を受信した</p><p>送信回数: <?=$count?> 回</p><p>ステージ1: <?=$_SESSION["stage1"]?> 点</p><?php } //キーワードチェック if($data == "あかさたな") { echo "キーワード確認OK<br>"; $_SESSION["stage2"]=1; // ステージ2を1にする echo '<a href="index3.php">ステージ3へ</a>'; } else { echo "正しいキーワードを送信してください。<br>"; $_SESSION["stage2"]=0; // ステージ2を0にする }}?></body></html>1ページ目のアドレス http://localhost/3116777/php2/index.php
2ページ目のアドレス http://localhost/3116777/php2/index2.php
1ページ目でキーワードを正しく入力できていない場合、2ページ目の内容が表示されないことを確認する。(1ページ目から2ページ目に進んだ場合と比較)
サインアウト用ページ(セッション終了)を用意していないので、ブラウザを閉じないと、キーワード入力に成功された状態は維持される。
※ 3ページ目のファイルは作成していないので、3ページ目に進むリンクをクリックしてもエラーになる。
・演習1のテキスト処理のプログラムを、修正して、テキスト処理の結果を変えてみる。
・演習2の表示される文章を変更して、クイズ用のページに変更してみる。
・(チャレンジ) 演習2で、3ページ目を作成する。2ページ目のスクリプトをコピーして調整して利用する。
提出先 WebClass
方法 php1 と php2 を含む学籍番号フォルダを zip にまとめて、アップロードする。
来週は、iPad/iPhoneのアプリを使用予定 FILTERS をインストールしておいてください。
iOS アプリ のカメラアプリ + OpenGL GS シェーダー言語 「FILTERS」で学ぶ GLSL
WebAPI と SQL の導入は今回は見送り。
参考資料: PHPとデータベース