Webプログラミングの基礎
PHPの基礎(8)
(2011/07/06)
政策情報学部
渡辺恭人
riho-m@cuc.ac.jp
メーリングリスト:riho-m-rg11@cuc.ac.jp:
資料ページ: http://www.cuc.ac.jp/~riho-m/rg11/
前回の課題
2
POSTでデータが送信されているかを確認 送信されていれば、sosu_check()関数の引数に渡す 送信されてなければ、初期の表示用文字列を作って下へ sosu_check()関数 引数が素数かどうかを 判定する 入力を促す初期メッセージを表示 フォームで判定したい数を入力させる ボタンをクリックしたら、データを自分自身に送信 “start”:ボタンが押された かどうか “target”:入力されたデータ前回の課題:プログラム①
3
<?php if (isset($_POST["start"])) { $number = $_POST["target"]; sosu_check($number); $message = "続けて、素数かどうか調べたい数を入力してください。"; } else { $message = "素数かどうか調べたい数を入力してください。"; }前回の課題:プログラム②
4
function sosu_check($a){
$s = "は素数です<br />";
for ($i = 2; $i <= ($a - 1); $i++){ if ($a % $i == 0) { $s = "は、素数ではありません<br />"; break; } } print $a . $s; } ?>
前回の課題:プログラム③
5
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head>
<body>
<?php print $message;?> <br>
<form method="post">
<input type="text" name="target" value=""><br /> <br>
<input type="submit" name="start" value="調べる"> </form>
</body> </html>
アルゴリズムの改善
• 情報システムの復習
• エラトステネスのふるいの定義通りのアルゴ
リズム
– 判定したい数はnを判定するための計算回数は、
• n-2
• これを改良して、時間を短縮させたい
– 計算回数を少なくする
– 例えば、判定したい数を2で割った数以上の数で
割る必要はない
6
どこを変更するか
• 繰り返し(for文)のところ
– 半分より小さい数だけで判定したい数を割る
– ($a - 1) のところ
• さらに改善されるアルゴリズムもある
– 判定したい数の平方根より小さい数で、判定した
い数を割る
7
文字化けについて
• Webアプリケーションでよく起きるトラブル
– データの入出力・メール送信などの個所で起きる
– Webブラウザ、Webサーバ、PHP、データベースサ
ーバなどの間で文字コードが正しく設定されてい
ないときに起こりうる
• 文字化けの原因
– 文字にはコードが多数ある(日本語にも数種類)
• 使う文字コードを統一するのも一つの方法
– PHPでどのように設定されているかを確認する
• Phpinfo()の表示のうち、mbstringカテゴリ
8
文字コード
• JIS(ISO-2022JP)
– 電子メールでの日本語
の文字コード
• SJIS(Shift JIS)
– WindowsやMS-DOS等で
普及した日本語の文字
コード
• EUC( Extended UNIX
Code)
– UNIXシステムで普及
• UTF-8
– コンピュータ上で多言語
の文字を単一の文字コ
ードで取り扱うために
1980年代に提唱された
文字コードである
Unicodeの一つ
9
PHPでの設定方法
• 3つ
– php.iniを設定
• 一般ユーザにはできない
– .htaccessを設定
• 使えないレンタルサーバもある
– PHPのスクリプト内で設定
10
PHPスクリプトの中で設定する
11
<?php
mb_internal_encoding ("
UTF-8
");
mb_http_output("
UTF-8
");
ob_start("mb_output_handler");
header("Content-Type: text/html; charset=
UTF-8
");
print "日本語を出力する";
?>
EmEditorで保存するときに、文字コードをUTF-8に
.htaccessファイルで設定する
• .htaccessファイル
– WebサーバのApacheの設定やPHPの設定、ユー
ザの認証を設定する
– Windowsでは、ドット「.」で始まるファイル名はつく
れないので、ドットのないファイル名で作成し、
www2に転送してから変更する
• 次の1行をhtaccessというファイル名で作成す
る
– WinSCPで転送して、ファイル名を .htaccessに変更
12
文字コードの確認
• 以下のプログラムを入力・保存し、WinSCPで
www2に転送してください
• Internet Explorerで実行する
• default_charsetの欄を見る
13
<?php
phpinfo();
?>
コンピュータとじゃんけん
• 手順
– グーを0、チョキーを1、パーを2とする。
– 人間はキーボードから手を数値で入力→変数A
– コンピュータは出す手を考える(ランダム)→変数B
– AとBを比較して、どちらが勝ちかを判断
– 結果を表示
• どちらが勝ちか判断するところがカギ!(アルゴリズ
ム)
– 条件の作り方
• いかに処理を簡単にするか→プログラムの実行速度も速くなる14
15
じゃんけんの勝ち負け判定表
Aの値 Bの値 判定 0 (グー) 0 (グー) あいこ 0 (グー) 1 (チョキ) Aの勝ち 0 (グー) 2 (パー) Bの勝ち 1 (チョキ) 0 (グー) Bの勝ち 1 (チョキ) 1 (チョキ) あいこ 1 (チョキ) 2 (パー) Aの勝ち 2 (パー) 0 (グー) Aの勝ち 2 (パー) 1 (チョキ) Bの勝ち 2 (パー) 2 (パー) あいこ16
条件を簡単にする
• 表をよく見る
– AとBが等しければ「あいこ」
– Bが勝ちの場合
• Aが0 (グー) かつ Bが2 (パー)、または
• Aが1 (チョキ) かつ Bが0 (グー)、または
• Aが2 (パー) かつ Bが1 (チョキ)
– 上記以外のとき「Aが勝ち」
• 消去法みたいなもの
17
条件をもっと簡単にできる
• 慣れも必要
• Bが勝ちの場合を数式化
– Aが0 (グー) かつ Bが2 (パー)、または
– Aが1 (チョキ) かつ Bが0 (グー)、または
– Aが2 (パー) かつ Bが1 (チョキ)
– 並べ替えや、四則演算や剰余の組み合わせで成立しないか考
える
• B+1を3で割った余りがAになる
– 3行の条件が1行になった
PHPでWeb版じゃんけんを作る
• 実は、おみくじプログラムと変わらない。
• 前半PHP
– POSTで自分自身に送信されたデータ(人間が入力した手
)があれば
• コンピュータの手をランダムで決める • 勝ち負けを判定し、$messageに結果を代入– そうでなれければ、$messageに初期メッセージを代入
• 後半HTML
– ゲームタイトル等を表示
– Formのtextareaを使って、$messageを表示させる
– Formのラジオボタンで、グー、チョキ、パーを選ばせる
– ボタンを押すと、POSTで自分に送信
18
janken.php①
19
<?php if (isset($_POST["start"])) { $hand[] = "グー"; $hand[] = "チョキ"; $hand[] = "パー"; $myhand = rand(0, 2); $message = "あなたの手は" . $hand[$_POST["yourhand"]] . "ですね¥n"; $message .= "私の手は" . $hand[$myhand] . "です。¥n";janken.php ②
20
if ($_POST["yourhand"] == $myhand){
$message .= "あいこです¥n";
} elseif ($_POST["yourhand"] == ($myhand + 1) % 3){
$message .= "私の勝ちです¥n";
} else {
$message .= "あなたの勝ちです¥n";
}
} else {
$message = "ここに結果が表示されます";
}
?>
janken.php ③
21
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>じゃんけんプログラム</title>
</head> <body>
<h2>コンピュータとじゃんけん</h2>
janken.php ④
22
<form method="post">
<textarea name="result" rows="5" cols="40"><?php print $message;?></textarea> <br>
<input type="radio" name="yourhand" value="0">グー <input type="radio" name="yourhand" value="1">チョキ <input type="radio" name="yourhand" value="2">パー
<input type="submit" name="start" value="じゃんけんをする"> </form>
</body> </html>