x.pg09

PC07 PC14 PC35 PC37 の XAMPPが不調です。使用するPCを移動してください。

テーマ テキスト処理とプログラム

サーバサイドプログラミング PHP

プログラム言語 PHP(Hypertext Preprocesser) は、HTML文書(Webページ)をプログラムで自動生成するための言語です。

Webサーバ側でPHPスクリプトは処理され、実行結果としてHTML文書が生成されます。生成されたHTMLがブラウザに用事されます。

・JavaScriptは、スクリプトはHTMLに埋め込まれます。ブラウザでスクリプトを読み込み、実行し、実行結果が表示されます。

→クライアントサイドプログラミング

・PHPは、サーバサイドプログラミングです。

参考資料:

PHPについて

HTMLにPHPを埋め込む方法

演習1

・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>
<?php
foreach(range(0,20) as $i) {
    echo $data;
}
?>
<br>

文字列を1文字ずつ分解し、各文字に記号を付け加えて表示する。

・ preg_split は PHP の正規表現パターンを使用した文字列分解コマンド。 "//u" は先頭と文末を含む全ての文字の切れ目を示すパターン。

<p>♡化</p>
<?php
foreach(preg_split("//u", $data) as $c) {
    echo $c . "♡";
}
?>
<br>

文字列を1文字ずつ分解し、各文字に 改行タグ <br> を付け加えて表示する。

<p>縦書き化</p>
<?php
foreach(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 が機能して、攻撃を防ぐ模様。

※例題には、セキュリティホールあり。スクリプトを悪用した攻撃について調べ、自衛のため勉強しておこう。

演習2

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>
<?php
session_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とデータベース