Webデザイン2

Web デザイン 2
PHP による Web プログラミング
担当 坂部
2008 年前期
目次
1.
1.1
1.2
2.
はじめに
1
Web アプリケーションとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Web アプリケーションの例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1
実習環境の整備
2.1
2.2
XAMPP のダウンロードとインストール . . . . . . . . . . . . . . . . . . . . . . .
XAMPP の動作確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
2
3
2.3
ファイルの保存場所
5
3.1
3.2
3.3
ファイル作成時の注意 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プログラムの始まりと終わり . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
7
7
7
3.4
3.5
3.6
3.7
出力 . . . . . . . . .
HTML 要素の出力 .
コメント . . . . . . .
文字列 . . . . . . . .
3.7.1 文字列の結合
変数 . . . . . . . . .
.
.
.
.
.
.
8
8
8
9
9
9
3.9 定数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.10 演習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
初めての PHP プログラム
3.
3.8
最初のプログラム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
フォームからの入力
4.
4.1
4.2
フォームからの入力とその出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . .
複数の入力の処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
11
13
4.3
演習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
日付と時間を使う
5.
5.1
5.2
5.2.1
干支の計算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
16
18
18
5.2.2
年齢計算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
日付と時間を使う . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
演習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
クッキーとセッション
6.
6.1
6.2
6.3
クッキーを使う . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
クッキーにデータを保存する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
クッキーを使ったアクセスカウンタ . . . . . . . . . . . . . . . . . . . . . . . . . .
i
20
20
21
22
6.4
6.5
セッションを使う . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
演習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ファイルの読み書き
7.
7.1
ファイル操作の手順
7.2
7.3
7.4
アクセスカウンタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
フォーム入力をファイルに保存する . . . . . . . . . . . . . . . . . . . . . . . . . .
演習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
データベースの利用
8.
8.1
MySQL の起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.2
8.3
8.4
8.5
8.6
データベースとテーブルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . .
データの挿入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PHP からデータベースへ接続 . . . . .
データベースへの書き込み . . . . . . .
郵便番号データベースの作成 . . . . . .
8.6.1 データベースとテーブルを作る
8.6.2 データの登録 . . . . . . . . . .
8.6.3
8.6.4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
接続テストプログラム . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
演習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ii
22
23
26
26
27
28
31
32
32
32
33
33
35
36
36
36
37
38
1. はじめに
この実習では Windows で XAMPP という Apache、MySQL、PHP などをまとめたパッケージ
を使い、Web アプリケーション構築 (プログラミング) を体験する。
1.1
Web アプリケーションとは
Web アプリケーションはクライアントの Web ブラウザから送信されたデータを素に Web サー
バ上で動作するプログラムで処理し、その実行結果を Web サーバを経由してクライアントへ送り
返す。サーバではデータベースを使い、処理対象のデータを保持することも多い。クライアントと
サーバでデータの流れを図に示す。
図 1.1: Web アプリケーションのサーバ
プログラミング言語としては PHP や Ruby などのスクリプト言語や Java などが使用される。
1.2
Web アプリケーションの例
我々は様々な Web アプリケーションをすでに利用している。その一例を示す。
1. Yahoo!や Google などサーチエンジン
2. Amazon などのショッピングサイト
3. Weblog や掲示板
4. Google マップなどの地図
1
2. 実習環境の整備
Web サーバの Apache、スクリプト言語の PHP、データベースの MySQL を簡単に Windows に
インストールできるパッケージ XAMPP を使って実習していく。
2.1
XAMPP のダウンロードとインストール
XAMPP のホームページ (http://www.apachefriends.org/jp/xampp.html) からファイルをダウ
ンロードする。下図のリンクをクリックし、Windows 用のインストールファイルを各自の PC に
ダウンロードする。
図 2.1: XAMPP のダウンロードリンク
ダウンロードしたファイル (xampp-win32-1.6.6a-installer.exe) をダブルクリックし、インストー
ルを開始する。
図 2.2: インストーラ
通常のアプリケーションのインストールとほぼ同様にウィザードの指示に従って操作すればよい。
1. 使用言語の選択では Japanese を選択
2. インストール先は変更せず、そのまま (C:\XAMPP)
3. システムオプションもそのまま
2
2.2. XAMPP の動作確認
2. 実習環境の整備
インストール完了後、Xampp コントロールパネルの起動を要求されたらはい (Y) のボタンをク
リック。図のコントロールパネルが起動する。インストール直後は Apache や MySQL は動作して
いない。
図 2.3: XAMPP コントロールパネル
コントロールパネルで各プログラムを起動・停止させる。コントロールパネルはタスクトレイあ
るいはデスクトップ上のアイコンから起動できる。
図 2.4: XAMPP コントロールパネル起動アイコン
2.2
XAMPP の動作確認
XAMPP コントロールパネルで Apache を起動させる。Apache の開始ボタンを押し、起動とい
う表示とボタン名が停止に変わっていることを確認する。
3
2.2. XAMPP の動作確認
2. 実習環境の整備
図 2.5: XAMPP コントロールパネルで Apache を起動
図 2.6: Apache 起動成功時のコントロールパネル
もし、起動の表示がすぐに消えてしまったら、IIS など Apache 以外の Web サーバがすでに起動
していると考えられるのでそれを停止する。必要があれば、サービスを停止しておく。
Apache が正しく起動したら Web ブラウザを起動し、自分自身 (http://localhost/) へアクセス
し、図の表示が現れることを確認する。
図 2.7: XAMPP の動作確認
表示されたページに日本語というリンクがあるのでこれをクリックする。
4
2.3. ファイルの保存場所
2. 実習環境の整備
図 2.8: XAMPP の動作確認
次に、phpinfo() というリンクを探し、これをクリックする。PHP の動作、バージョンを確認
できる。
図 2.9: PHP の動作確認
以上で XAMPP の動作を確認できた。Apache はこの実習の時だけ起動すればよいので面倒だが
実習の都度起動させること。
2.3
ファイルの保存場所
XAMPP の Apache が参照するファイルは XAMPP をインストールしたフォルダ内の htdocs と
設定されている。自分の作るファイルはこのフォルダか、実習用のフォルダを作りそこに保存しな
ければならない。
例えば、htdocs 内にフォルダ sakabe を作った場合、そこをブラウザで参照するときの URL は
http://localhost/sakabe/となり、ブラウザでアクセスするとファイルの一覧が表示される。実行
させたいファイルへのリンクをクリックすれば実行結果が表示される。
プログラムの動作確認は必ずサーバ経由でファイルにアクセスすること。保存したファイルをダ
ブルクリックしてもプログラムは動作しないので注意する。
5
2.3. ファイルの保存場所
2. 実習環境の整備
図 2.10: ユーザフォルダの一覧表示
6
3. 初めての PHP プログラム
3.1
ファイル作成時の注意
PHP のファイル作成時の注意点を示す。
1. 拡張子は php にする
2. ファイル名は半角英数字のみを使う
3. 文字コードは EUC、改行コードは LF にする (シフト JIS を使わない)
メモ帳でもファイルを作れるが、文字コードの変換などができないので NoEditor や PHPeditor
などを使う方がよい。
3.2
最初のプログラム
Hello PHP!!という文を表示するプログラムを示す。HTML と PHP のプログラムが混在してい
るのが特徴である。
リスト 1: Hello PHP!!を表示する (HelloPHP1.php)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>Hello PHP!!</title>
</head>
<body>
<?php
print "Hello PHP!!";
?>
</body>
</html>
このファイルをサーバ経由でアクスするとブラウザには Hello PHP!!と表示される。ブラウザの
ソースを表示する機能を使うと PHP のプログラムの部分はサーバ側で処理され、すべて HTML
に変換されていることが確認できる。
3.3
プログラムの始まりと終わり
PHP のプログラムの始まりと終わりは <?php と?> で示す。Web サーバはこの始まりと終わ
りの間に記されているのは PHP のプログラムとして処理される。
7
3.4. 出力
3.4
3. 初めての PHP プログラム
出力
文字列や変数値や文字列を出力する時はこの例で使っている print 文あるいは echo 文を使う。
¶
³
print 変数あるいは文字列
echo 変数あるいは文字列
µ
´
図 3.1: print,echo 文の書式
3.5
HTML 要素の出力
PHP の出力は HTML としてクライアントに送信されるのでブラウザ上で改行したいときは BR
要素を文字列に含めればよい。使用例を示す。
リスト 2: BR 要素の使用例 (HelloPHP2.php)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>Hello PHP!!</title>
</head>
<body>
<?php
/* BR 要素の使用例 */
print "Hello PHP!!";
// 改行されない
print "Hello PHP!!";
// 改行されない
print "<br>";
// 改行される
print "Hello PHP!!<br>"; // 改行される
print "Hello PHP!!";
// 改行されない
?>
</body>
</html>
このように文字列に HTML 要素や CSS を文字列に含めれば、PHP の出力を通常の HTML と
同じように扱える。
3.6
コメント
PHP のプログラムにコメントを挿入するときは次のいずれをを使う。
//コメントの文 短いコメントの入力に使う
/*コメントの文*/ 複数行のコメント入力に使う
コメントはプログラムとして認識されず、HTML としても出力されないがプログラムの内容を
理解する手助けになる。
8
3.7. 文字列
3.7
3. 初めての PHP プログラム
文字列
文字列とは文字が 2 文字以上連なったもののことで、”(ダブルコーテーション) や’(シングルコー
テーション) で囲んで定義する。
3.7.1
文字列の結合
複数の文字列を結合したいときには.(ピリオド) という演算子を使う。文字列と変数値も結合で
きる (リスト 3 を参照)。
3.8
変数
PHP も他の言語と同じようにプログラム中で扱うデータを変数に一時的に記憶できる。C や Java
のような言語と異なり、記憶できるデータの制限は非常に緩やかでどんな種類のデータでも記憶さ
せられる。
変数名は$で始めるという規則があり、変数をすぐに区別できる。宣言無く使用できるので便利
だが、名前の管理をしっかりする必要がある。
Hello PHP!!という文字列を変数に代入し、表示し、更に数値を記憶させ、表示するプログラム
の例を示す。
リスト 3: 変数の使用例 (HelloPHP3.php)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>Hello PHP!!</title>
</head>
<body>
<h1>変数の使用例</h1>
<?php
/* 変数の使用例 */
$msg = "Hello PHP!!"; // 文字列を変数に代入
print $msg;
// 変数の内容を出力
print "<hr>";
/* 種類の違うデータも記憶できる */
$msg = 3.14159;
print "円周率は" . $msg . "です。"; // 文字列の結合
print "<hr><h2>定数の利用</h2>";
/* 円周率πは定数として定義されている。 */
print "円周率は" . M_PI . "です。";
?>
</body>
</html>
9
3.9. 定数
3.9
3. 初めての PHP プログラム
定数
定数はその名の通り、ある値に付けた名前でその値を変数のように変更できないものである。円
周率πは PHP 自身で M PI として定義されている。利用者が定義することもできる。例えば、自
分の名前を NAME という定数として定義するときは次のように記す。
リスト 4: 定数の定義
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<?php
define(’NAME’,’ 坂部和久’);
print NAME;
?>
3.10
演習
1. XAMPP をインストールしたフォルダ内にあるフォルダ htdocs に php というフォルダを作
りなさい。
2. それぞれの例題をテキストエディタを使い入力し、先ほど作ったフォルダ php に保存し、
サーバ経由でアクセスして正しく表示されることを確認する。アクセスする URL は http://
localhost/php/である。
3. プログラム中の; などが抜けた場合にどんなメッセージが表示されるかを確認し、その意味
を調べよ。
4. 次のように表示される PHP のプログラムを作りなさい。ドラえもんの身長体重のデータは
変数に記憶させ、BMI は計算で求めること。なお、ファイル名は ex01.php とする。
図 3.2: 演習の出力
10
4. フォームからの入力
4.1
フォームからの入力とその出力
Web ページから PHP で処理するデータを入力するには HTML のフォームを使う。FORM 要素
の action 属性に処理用の PHP のファイルを指定 (省略した場合はそのファイル) し、method 属性
にはデータ送信の方法 POST か GET を指定する。フォームからのデータを受け取る PHP のプロ
グラムではスーパーグローバル変数$ POST あるいは$ GET を使う。次のリストはフォームから
入力した名前を PHP のプログラムで受け取り、表示するプログラムです。
リスト 5: フォームによる入力 (input.php)
<html>
<head>
<title>フォーム情報を取得する</title>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
</head>
<body>
<h1>フォームから PHP へデータを送る</h1>
<p>名前を入力し、送信ボタンを押してください。</p>
<form method="POST" action="output.php">
お名前:<input type="text" name="name" size="20" maxlength="30"/>
<input type="submit" value="送信"/>
</form>
</body>
</html>
リスト 6: フォームからのデータの出力 (output.php)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>フォーム情報を取得する</title>
</head>
<body>
<h1>フォームから受け取ったデータの表示</h1>
<p>こんにちは、
<?php
print($_POST[’name’]);
?>
さん!</p>
<hr>
<a href="input.html">戻る</a>
</body>
</html>
11
4.1. フォームからの入力とその出力
4. フォームからの入力
PHP のプログラムではフォームの name 属性の値を使ってスーパーグローバル変数$ POST か
ら送信されたデータを受け取る。そのまま表示してもいいし、他の変数へ代入しても良い。
図 4.1: 値の受け渡
リスト 7: フォームからのデータの受け取り方
$_POST[’ フォームの name 属性の値’]
上記二つのプログラムは次のリストのように一つにまとめることもできる。PHP のプログラム
と HTML が入り組んでしまい、読みづらくなってしまうのが欠点である。
リスト 8: 入出力を一つのファイルにする (inout.php)
<html>
<head>
<title>フォーム情報を取得する</title>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
</head>
<body>
<?php
if(empty($_POST[’submit’])){
?>
<h1>フォームから PHP へデータを送る</h1>
<p>名前を入力し、送信ボタンを押してください。</p>
<form method="POST">
お名前:<input type="text" name="name" size="20" maxlength="30"/>
<input type="submit" name="submit" value="送信"/>
</form>
<?php
} else {
?>
<h1>フォームから受け取ったデータの表示</h1>
<p>こんにちは、<?php print($_POST[’name’]); ?>さん!</p>
12
4.2. 複数の入力の処理
4. フォームからの入力
<hr>
<a href="">戻る</a>
<?php
}
?>
</body>
</html>
一つのファイルにまとめた場合、フォームから送信されたかどうかを empty() 関数と if 文でチェッ
クし、未送信の場合はフォームを表示し、送信した場合は受け取ったデータを表示する。
リスト 9: 送信データがあったかのチェック
if(empty($_POST[’submit’]){
未送信時の処理
} else {
送信時の処理
}
...
<input type="submit" name="submit" value="送信"/>
4.2
複数の入力の処理
次のリストは簡単なアンケートで複数の入力を受け取り、表示するプログラムです。
リスト 10: アンケート (questionnaire.html)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>アンケート</title>
</head>
<body bgcolor="white">
<h1>アンケート</h1>
<p>コンピュータ等に関するアンケートです。
<form action="question.php" method="POST">
性別&nbsp;
<input type="radio" name="sex" value="男性">男性
<input type="radio" name="sex" value="女性">女性<br>
年齢&nbsp;
<select name="age">
<option value="0">0~9
<option value="10">10~19
<option value="20">20~29
<option value="30">30~39
<option value="40">40~49
<option value="50">50~59
<option value="60">60~69
<option value="70">70~79
<option value="80">80~89
</select>才<br>
13
4.3. 演習
4. フォームからの入力
パソコンの経験年数&nbsp;
<select name="keiken">
<option value="経験 1 年未満">1 年未満
<option value="経験 1∼5 年">1 年以上、5 年未満
<option value="経験 5∼10 年">5 年以上、10 年未満
<option value="経験 10 年以上">10 年以上
</select><br>
<input type="submit" value="送信">&nbsp;<input type="reset">
</form>
</body>
</html>
リスト 11: アンケート結果を表示する (question.php)
<html>
<head>
<meta http-equiv="Content-type" content="text/hrml; charset=EUC-JP">
</head>
<body>
<h1>ご協力ありがとうございます。</h1>
<?php
printf(’ 性別:%s<br>’,$_POST[’sex’]);
printf(’ 年齢:%2d<br>’ , $_POST[’age’]);
printf(’ 好きな食べ物:%s<br>’, $_POST[’tabemono’]);
?>
<hr>
<h2>$_POST の内容をすべて出力</h2>
<?php
foreach($_POST as $k=>$v) print("$k : $v<br>");
?>
</body>
</html>
• printf 分は表示の書式を指定できる。%s は文字列として。%2d は二桁の整数として変数や
式の値を出力することを意味する。
• foreach 文は配列の中身をすべて取り出し、処理するときに使う関数。
4.3
演習
1. 例題のファイルを入力し、動作させなさい。
2. 例題を参考に、氏名、年齢、身長と体重を入力し、標準体重と BMI を計算・表示するプログ
ラムを作りなさい。入力用のファイルは ex02 学籍番号.html、PHP のファイルは ex02 学籍
番号.php と言う名前にしなさい。
3. 例題を参考に、自動車の燃費を計算するプログラムを作りなさい。入力するのは走行距離
(km) と消費燃料 (l) の 2 つで、出力は燃費 (燃料 1 リットルあたりの走行距離) の 1 つであ
る。ファイル名は ex03 学籍番号.html と ex03 学籍番号.php にする。
14
4.3. 演習
4. フォームからの入力
なお、標準体重、BMI、燃費は次の式で計算する。
標準体重 = 22 × 身長 (m) × 身長 (m)
BM I =
(4.1)
体重 (kg)
身長 (m) × 身長 (m)
(4.2)
走行距離 (km)
消費燃料 (l)
(4.3)
燃費 =
図 4.2: BMI 計算の表示例
※完成したファイルは指定されたサーバの Web ページからアップロードして提出しなさい。
15
5. 日付と時間を使う
5.1
日付と時間を使う
PHP で日付や時間を扱うには date() 1 、time()、mktime() 関数などを使う。
date() 関数は現在、あるいは指定したタイムスタンプの日時を指定した書式に変換する機能を
持っている。
リスト 12: date() 関数の書式
date(書式の文字列,[タイムスタンプ])
表 5.1: date 関数の書式指定文字
文字
意味
d
二桁の数字で日
w
曜日の数値 (0∼6)
z
年間の通算日
m
数字で月
L
閏年か
Y
4 桁の西暦年
y
2 桁の西暦年
h
12 時間制の時間
H
24 時間制の時間
i
分
s
秒
タイムスタンプは 1970 年 1 月 1 日から経過した秒数のことで、time() 関数を使うと現在のタイ
ムスタンプを取得できる。
mktime() 関数は日時を指定し、その日時のタイムスタンプが得られる。
次のリストは date()、time()、mktime() 関数の利用例である。
リスト 13: 日付と時間の操作例 (datetest.php)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
1 http://jp2.php.net/manual/ja/function.date.php
16
5.1. 日付と時間を使う
5. 日付と時間を使う
<title>日付と時間</title>
</head>
<body>
<h1>日付と時間</h1>
<h2>date() 関数の例</h2>
<p>今日は
<?php
print(date("Y/m/d"));
?>
です。</p>
<h2>タイムスタンプ</h2>
<p>現在のタイムスタンプは
<?php
print(time());
?>
です。</p>
<p>1999 年 12 月 31 日のタイムスタンプは
<?php
print(mktime(0,0,0,12,31,1999));
?>
です。</p>
<h2>年齢計算</h2>
<p>1988 年 5 月 24 日生まれの人は
<?php
// 今のタイムスタンプと指定した日にちのタイムスタンプの差を求める
$t = time() - mktime(0,0,0,5,24,1988);
// タイムスタンプの差から 1970 を引けば年齢になる
print(date("Y",$t) - 1970 );
?>
才です。</p>
<h2>何曜日</h2>
<p>今年の元旦は
<?php
// 曜日を配列に格納
$weekday = array("日", "月", "火", "水", "木", "金", "土");
// 今年の元旦のタイムスタンプを取得
$gantan = mktime(0, 0, 0, 1, 1, 2008);
// タイムスタンプの曜日の数値で曜日の配列から文字を取得
print($weekday[date("w", $gantan)]);
?>
曜日でした。</p>
<h2>何日経過したか</h2>
<p>今年は
<?php
print(date("z"));
?>
日終わりました。</p>
</body>
</html>
配列は複数のデータをまとめて記憶する場所のことで一つ一つの場所は番号で指定します。
17
5.2. 演習
5. 日付と時間を使う
図 5.1: 配列のイメージ
5.2
演習
5.2.1
干支の計算
フォームから入力した年の干支を計算する次のプログラムの空欄【1】∼【13】埋め、動作させ
なさい。
リスト 14: 干支の計算 (eto.php)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>干支を求める</title>
</head>
<body>
<?php
// 送信ボタンを押したときのみ処理する
if(isset($_POST[【1】])){
// 送信された年数を取得
$year = $_POST[【2】];
// 干支の名前を配列に格納
$eto = array("子", "丑", "寅",【3】,【4】,【5】,【6】,【7】,【8】,【9】,【10】, 【11】);
// 干支を計算
$Y = ($year +【12】) % 12;
}
?>
<h1>干支計算機</h1>
<p>干支を調べたい西暦年を入力してください。</p>
<form method="POST">
<input type="text" size="4" name="Y">年
<input type="submit" name="submit" value="干支計算">
<hr>
<!-- 計算結果を表示 -->
<input type="text" size="4" value="<?php echo $year?>">年は
<input type="text" size="2" value="<?php echo $eto[【13】]?>">年です。
</form>
<hr>
<a href="index.html">戻る</a>
</body>
</html>
isset() は empty() の逆の動作をする関数です。
18
5.2. 演習
5.2.2
5. 日付と時間を使う
年齢計算
次のリストはフォームから年月日を入力すると年齢、生まれてから経過した日数、生まれた曜日
を出力するプログラムです。空欄【1】∼【10】を埋め、動作させなさい。
リスト 15: birthday.php)
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=EUC-JP">
<title>日付の演習ー年齢計算</title>
</head>
<body>
<h1 style="background:#cccccc;">年齢計算など</h1>
<p>生年月日を西暦年で入力してください。</p>
<form method="post">
西暦
<input type="text" name="Y" size="5" maxlength="4" />年
<input type="text" name="M" size="2" maxlength="3" />月
<input type="text" name="D" size="2" maxlength="3" />日生まれ
<input type="submit" name="submit" value="送信" />
</form>
<hr />
<?php
if(isset($_POST[【1】])){
// 正しい日付かを調べる
if(checkdate($_POST[【2】],$_POST[【3】],$_POST[【4】])){
// 曜日を配列に格納
$weekday =【5】;
// 現在のタイムスタンプと指定した日にちのタイムスタンプの差を求める
$umare = 【6】;
$Ysa = time() - 【7】;
print("年齢:");
print(【8】);
print("歳");
printf("(生まれて%5d 日経過)", $Ysa / 【9】);
print("<br>");
print(【10】 . "曜日生まれ");
} else {
print("入力された日付が間違っています。入力し直してください。");
}
}
?>
</body>
</html>
19
6. クッキーとセッション
HTTP による Web へのアクセスはコネクションレス型の接続といい、クライアントとサーバと
の接続はページの切り換えや更新ごとに毎回切断される。接続が毎回切断されるので複数回のアク
セスで同じデータを使い続けることができないことになる。これを回避し、連続したアクセス間で
データを保ち続けるためにクッキーやセッションという技術を使う。オンラインショップなどでは
これらの技術を使い、複数回のアクセス間でデータを保持し続けている。
クッキーとセッションはデータをクライアント側に置くかサーバ側に置くが異なる。クッキーの
場合は通信で使用されるデータのすべてをクライアント側に、セッションはセッション ID という
通信の識別データのみをクライアント側に保存し、他のデータはサーバ側に保存している。
クッキーの情報を保存する場所はブラウザの設定により異なる。
6.1
クッキーを使う
PHP でクッキーを使うときは setcookie() 関数を使う。setcookie() 関数を記述する場所はファイ
ルの先頭で HTML タグよりも前でなければならない。
この関数の引数にはクッキーの名前とその値、有効時間などを指定する。クッキー名のみを指定
すると保存されているクッキーの情報が削除される。
リスト 16: setcookie() 関数の書式
setcookie(クッキー名, クッキーの値, 有効期限);
有効期限は秒単位で指定し、省略した場合はブラウザを開いている間が有効期間となる。
リスト 17 は 10 秒間有効なクッキーを設定し、利用したプログラムである。
リスト 17: クッキーの利用例 (cookie test.php)
<?php
// クッキーに現在日時を設定し、有効期限を 10 秒にする
setcookie("testcookie", date(’Y/m/d H:i:s’), time() + 10);
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>クッキーのテスト</title>
</head>
<body>
<h1>クッキーのテスト</h1>
<p>ホームページを訪問済みかどうかをクッキーを使って判定します。</p>
<p>現在、10 秒間有効なクッキーを設定しており、ページを開くか、更新して 10 秒以内はクッキーが有効で
す。</p>
<p style="color : red; font-size : 14pt; background : #00FFFF;">
20
6.2. クッキーにデータを保存する
6. クッキーとセッション
<?php
if(empty($_COOKIE[’testcookie’])) {
print(’<p style="color : red; font-size : 14pt; background : #00FFFF;">’);
print("初めまして!<br>");
print("現在時間は" . date("Y/m/d H:i:s") . "です。");
}else{
print(’<p style="color : blue; font-size : 14pt; background : #FF00FF;">’);
print("訪問済みです。<br>");
print("前回の訪問時間は「" . $_COOKIE[’testcookie’] . "」でした。");
}
?>
</p>
<hr>
<a href="cookie_test.php">再表示</a>
</body>
</html>
6.2
クッキーにデータを保存する
フォームから入力されたデータをクッキー保存する例をリスト 18 とリスト 19 に示す。
フォームから送信されたデータはスーパグローバル変数$ POST に保存されているので、その値
を setcookie() 関数に与えれば送信されたデータをクッキーに保存できる。
リスト 18: クッキーへの書き込み (cookie input.php)
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=EUC-JP">
<title>クッキーでデータを記録する</title>
</head>
<body>
<h1>クッキーでデータを記録する</h1>
<p>メールアドレスを入力し、送信してください。</p>
<form method="post" action="cookie_rec.php">
E-Mail アドレス:
<input type="text" name="email" value="<?php print($_COOKIE[’email’]); ?>">
<input type="submit" value="送信">
</form>
</body>
</html>
リスト 19: クッキーへの書き込み (cookie rec.php)
<?php
// クッキー名 email で$_POST[’email’] のデータを 10 秒だけ保持
setcookie("email", $_POST[’email’], time() + 10);
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=EUC-JP">
<title>クッキーでデータを記録する</title>
</head>
21
6.3. クッキーを使ったアクセスカウンタ
6. クッキーとセッション
<body>
クッキー"email"を保存しました。<br>
10 秒だけ有効です。
<hr>
<a href="cookie_input.php">もどる</a>
</body>
</html>
6.3
クッキーを使ったアクセスカウンタ
ホームページへのアクセス数を数える仕組みをアクセスカウンタといい、通常はサーバにアクセ
ス数を保存しているが、クッキーを使えば自分自身のアクセス数をカウントできる。実現例をリス
ト 20 に示す。
リスト 20: クッキーを使ったアクセスカウンタ (cookie counter.php)
<?php
setcookie("counter", ++$_COOKIE[’counter’], time()+10);
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>クッキーでアクセスカウンター</title>
</head>
<body>
<h1>クッキーを使ったカウンター</h1>
<p>あなたは
<?php
print $_COOKIE[’counter’];
?>
回目の訪問です。</p>
<p>有効時間は 10 秒です。</p>
</body>
</html>
6.4
セッションを使う
クッキーでは$ COOKIE に値を代入できないが、セッションを使えば変数値を変更できる。セッ
ションを使うには session start() でセッションを開始し、スーパーグローバル変数$ SESSION を
使い、値を保存・参照する。セッションを終了し、破棄するには sesseion destroy() 関数を使う。
次のリストは乱数で作った数値を別なページで参照するプログラムである。
リスト 21: セッションで値を保存 (session test1.php)
<?php session_start() ?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=EUC-JP">
<title>セッションを使い、値を保存</title>
</head>
22
6.5. 演習
6. クッキーとセッション
<body>
<h1>セッションを使い、値を複数ページで利用する</h1>
<?php
mt_srand(microtime() * 1000000);
$_SESSION[’no’] = mt_rand(1,100);
$_SESSION[’name’] = "Sakabe";
?>
<p>セッションで保存する値</p>
<?php
echo "no=" . $_SESSION[’no’] . "<br>";
echo "name=" . $_SESSION[’name’] . "<br>";
?>
<hr>
<a href="session_test2.php">次のページへ</a>
</body>
</html>
リスト 22: セッションで他のページで保存した値を参照 (session test2.php)
<?php session_start() ?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=EUC-JP">
<title>セッションを使い、複数ページでデータを受け渡す</title>
</head>
<body>
<h1>セッションを使い変数を複数ページで利用する</h1>
<?php
echo "no=" . $_SESSION[’no’] . "<br>";
echo "name=" . $_SESSION[’name’] . "<br>";
session_destroy();
?>
<hr>
<a href="session_test1.php">もどる</a>
</body>
</html>
6.5
演習
フォームから入力した氏名などの情報をクッキーで保存・表示、保存されているクッキーを削除
する次のプログラムリストの空欄に適切な文を当てはめ、動作させなさい。
リスト 23: データ入力 (ex cookie input.php)
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=EUC-JP">
<title>クッキーでデータを記録する</title>
</head>
<body>
<h1>クッキーでデータを記録する</h1>
<p>以下の項目を入力し、送信してください。</p>
<form method="post" action="ex_cookie_rec.php">
23
6.5. 演習
6. クッキーとセッション
氏名:<input type="text" name="name" value="<?php echo $_COOKIE[【1】]?>"><br>
年齢:<input type="text" name="age" value="<?php echo $_COOKIE[【2】]?>"><br>
住所:<input type="text" name="addr" value="<?php echo $_COOKIE[【3】]?>"><br>
E-Mail:<input type="text" name="email" value="<?php echo $_COOKIE[【4】]?>">
<br>
<input type="submit" value="送信">
</form>
</body>
</html>
リスト 24: クッキーに保存 (ex cookie rec.php)
<?php
setcookie("name", 【1】);
setcookie("age", 【2】);
setcookie("addr", 【3】);
setcookie("email", 【4】);
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=EUC-JP">
<title>クッキーでデータを記録する</title>
</head>
<body>
送信されたデータを保存しました。<br>
<?php
foreach(【5】 as $k => $v){
print("$k = $v<br>");
}
?>
<hr>
<a href="ex_cookie_input.php">もどる</a>
<a href="ex_cookie_del.php">クッキーを削除する</a>
</body>
</html>
リスト 25: クッキーを削除 (ex cookie del.php)
<?php
// クッキーの削除
【1】("name");
【1】("age");
【1】("addr");
【1】("email");
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=EUC-JP">
<title>クッキー削除しました</title>
</head>
<body>
クッキー削除しました<br>
<?php
foreach(【2】 as $k => $v){
24
6.5. 演習
6. クッキーとセッション
print("$k = $v<br>");
}
?>
<hr>
<a href="ex_cookie_input.php">もどる</a>
</body>
</html>
セッションを使った和当てゲームを完成せよ。
リスト 26: セッションを使った和当てゲーム (ex session.php)
<?php 【1】?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=EUC-JP">
<title>数あてゲーム</title>
</head>
<body>
<h1 style="background:#cccccc;">数あてゲーム</h1>
<form method="post" action="ex_session.php">
1∼100までの数を入力してください:
<input type="text" name="answer" size="5" maxlength="3" />
<input type="submit" value="回答" />
</form>
<hr />
<?php
// 答えの数を用意する
if(is_null($_SESSION[’answer’])){
mt_srand(microtime() * 1000000);
$_SESSION[’answer’] = mt_rand(1,100);
$_SESSION[’game_cnt’] = 0;
}
// 値が送られたら
if(【2】[’answer’] != ""){
$_SESSION[【3】]++; //解答回数を増やす
// 正解の時
if($_SESSION[【4】] == $_POST[【4】]){
print("おめでとうございます!<br>" . $_SESSION[【3】] . "回で正解しました!");
session_destroy();
} else{
// 不正解の時
if($_SESSION[’answer’] > 【5】[’answer’]){
print("もう少し大きいです。");
} else {
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
25
7. ファイルの読み書き
プログラムで扱うデータはファイルかデータベースへ保存しないと実行が終了すると無くなって
しまう。今回は PHP でテキストファイルを読み書きする方法を確かめる。
7.1
ファイル操作の手順
テキストファイルを操作する手順は次の通り。
1. ファイルを開く
2. ファイルをロックする
3. ファイルからデータを読み込む
4. 読み込んだデータを処理する
5. 処理したデータを表示する
6. ファイルへデータを書き込む
7. ファイルのロックを解除
8. ファイルを閉じる
同一ファイルへの複数の同時アクセスに対応するために同時に一人しかファイルへ書き込みがで
きないようにするロックという機能を使う。
PHP ではテキストファイル処理用に次の関数を使う。
ファイルハンドラ=fopen(ファイル名, モード) ファイルを指定したモード (表 7.1 参照) で開き、
ファイル操作の窓口 (ハンドラ) を用意する
fclose(ファイルハンドラ) ファイルハンドラで指定したファイルを閉じる
fguts(ファイルハンドラ、書き込むデータ) ファイルハンドラでしてしたファイルへデータを書き
込む
fwrite(ファイルハンドラ、書き込むデータ) ファイルハンドラで指定したファイルへデータを書
き込む
fgetcsv(ファイルハンドラ, 読み込むデータ量) ファイルハンドラで指定した CSV 形式ファイル1 か
ら一行ずつ指定したバイト数分のデータを読み込む
1 カンマでデータを区切っているファイルのこと
26
7.2. アクセスカウンタ
7. ファイルの読み書き
flock(ファイルハンドラ、ロックの種類) ファイルハンドラで指定したファイルを指定した方法 (表
7.2 参照) でロックする。
表 7.1: fopen 関数のモード
モード
意 味
読み込みモードで開く。ファイルポインタを先頭に置く。
r
r+
読み込み書き込みモードで開く。ファイルポインタを先頭に置く。
w
書き込みモードで開く。ファイルポインタを先頭に置き、サイズを 0 に。
w+
読み込み・書き込みモードで開く。ファイルポインタを先頭に置き、サイズを 0
に。存在しないときは新規作成。
a
書き込みモードで開き、ファイルポインタを末尾に置き、存在しないときは作成
する。
a+
読み込み・書き込みモードで開き、ファイルポインタを末尾に置き、存在しない
ときは新規作成。
b
バイナリモードで開く。Windows のみ。
表 7.2: ロックの種類
動作
種類
7.2
LOCK SH
共有ロック
LOCK EX
排他的ロック
LOCK UN
ロックの解除
LOCK NB
プロセスをブロックしたくない場合に設定
アクセスカウンタ
ファイルへの読み書きの例としてアクセスカウンタを示す。アクセスカウンタはページへのアク
セス回数をファイルに記録しておき、アクセスされるたびにそのデータを 1 増やして保存する物で
ある。
にアクセスカウンタの例を示す。
リスト 27: アクセスカウンタ (counter.php)
<html>
<head>
<meta http-equic="Content-Type" content="text/html; charset=EUC-JP">
<title>アクセスカウンター</title>
</head>
<body>
<h1>アクセスカウンター</h1>
<?php
$fp = fopen("counter.dat", "r+");
// ファイルを開く
if(flock($fp, LOCK_EX)){
// ファイルがロックできればデータを書き込む
27
7.3. フォーム入力をファイルに保存する
$count = (int)fgets($fp);
$count++;
fseek($fp, 0);
fputs($fp, $count);
flock($fp, LOCK_UN);
fclose($fp);
$count = sprintf("%05d", $count);
echo $count;
} else {
printf("ロック中 \n");
}
?>
<hr>
</body>
</html>
//
//
//
//
//
//
//
7. ファイルの読み書き
ファイルからカウンタデータを読み込む
カウンタを 1 増やす
ファイルポインタをファイルの先頭に移動
ファイルへカウンタデータを書き込む
ファイルのロックを解除
ファイルを閉じる
カウントデータを 5 桁の整数にし、表示する
// ロックできないときの表示
カウンタデータを保存するファイル counter.dat には 0 の一文字を保存しておく。
リスト 28: counter.dat の内容
0
7.3
フォーム入力をファイルに保存する
性別、年齢層、好きな食べ物を HTML フォームから入力し、それを CSV 形式のファイルに書
き込む。書き込まれたデータを表示するプログラムの例を以下に示す。
リスト 29 は処理対象のデータファイルの内容の例です。このファイルはデータを”で囲み、カン
マで区切っています。ファイルの一行が一件分のデータを保存しています。
リスト 29: データファイルの内容 (sample.csv)
"0","1","みかん"
"1","2","うどん"
"1","0","カレー"
"1","4","牛丼"
"1","4","刺身"
"1","3","唐揚げ"
"2","2","イチゴショートケーキ"
"1","6","梅干し"
"1","4","焼き肉"
"1","4","回転寿司"
"1","3","唐揚げ"
"1","5","うどん"
リスト 30 では HTML フォームを使ってデータを入力します。これまで通り、フォームには name
属性値と送信するデータを value 属性で指定しておきます。
リスト 30: 入力フォームを表示する (file write test.html)
28
7.3. フォーム入力をファイルに保存する
7. ファイルの読み書き
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>アンケート:好きな食べ物</title>
</head>
<body>
<h1 style="background:#cccccc">アンケート:好きな食べ物</h1>
<p>アンケートにご協力ください。</p>
<form action="file_write.php" method="POST">
<table border="0">
<tr>
<td>性別:</td>
<td>
<input type="radio" name="sex" value="1">男&nbsp;
<input type="radio" name="sex" value="2" >女
</td>
</tr>
<tr>
<td>年齢:</td>
<td>
<select name="age">
<option value="0">0∼9</option>
<option value="1">10∼19</option>
<option value="2">20∼29</option>
<option value="3">30∼39</option>
<option value="4">40∼49</option>
<option value="5">50∼59</option>
<option value="6">60∼69</option>
<option value="7">70∼79</option>
<option value="8">80∼</option>
</select>歳代</td>
</tr>
<tr>
<td>好きな食べ物は?</td>
<td><input type="text" name="tabemono" size="20" ></td>
</tr>
</table>
<input type="submit" value="送信">
</form>
<hr>
<a href="file_read_test.php">これまでの結果を見る</a>
</body>
</html>
リスト 31 は HTML フォームから送信されたデータを受け取り、ファイルに書き込むプログラ
ムです。フォームからの送信データを CSV 形式に整え、ファイルに書き込みます。
リスト 31: フォーム入力をファイルに書き込む (file write.php)
<?php
$file = fopen("sample.csv", "a");
// ファイルを追記モードで開く
flock($file, LOCK_EX);
// ファイルを排他的ロックする
// フォームから入力されたデータを順に結合し、まとめる
$line = ’"’;
// "を保存
$line .= $_POST[’sex’] . ’","’;
// 性別と","を追加保存
$line .= $_POST[’age’] . ’","’;
// 年齢と","を追加保存
$line .= $_POST[’tabemono’] . "\"\n";
// 好きな食べ物と", 改行コードを追加保存
29
7.3. フォーム入力をファイルに保存する
fputs($file, $line);
//
flock($file, LOCK_UN);
//
fclose($file);
//
header("Location: file_write_test.html");//
?>
7. ファイルの読み書き
まとめた文字列をファイルに書き込む
ロックの解除
ファイルを閉じる
書き込み用のファイルに戻る
リスト 32 はデータファイルを読み取り、表示するプログラムです。データファイルのデータを
表示して分かり易い形式にし、表示すると共にデータを集計します。
リスト 32: データファイルを読み取り、表示する (file read test.php)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>アンケート結果の表示</title>
</head>
<body>
<h1 style="background:#cccccc">アンケート結果の表示</h1>
<p>ファイルを読み込んだ順に表示</p>
<table border="1" cellspacing="0" cellpadding="4">
<colgroup>
<col style="width:4em;text-align:center;"></col>
<col style="width:8em;text-align:center;"></col>
<col></col>
</colgroup>
<thead>
<tr>
<th>性 別</th><th>年齢層</th><th>好きな食べ物</th>
</tr>
</thead>
<tbody>
<?php
// ファイルを読み込み専用モードで開く
$file = fopen("sample.csv","r");
// ファイルを最後まで一行ずつ読み込み、表示用にデータを加工する。
while($row = fgetcsv($file, 1024, ",")){
// 性別の判定
if($row[0] == 1){
$sex = "男";
}else{
$sex = "女";
}
// 年齢層の判定
switch($row[1]){
case 0 : $age = " 0∼ 9 歳";break;
case 1 : $age = "10∼19 歳";break;
case 2 : $age = "20∼29 歳";break;
case 3 : $age = "30∼39 歳";break;
case 4 : $age = "40∼49 歳";break;
case 5 : $age = "50∼59 歳";break;
case 6 : $age = "60∼69 歳";break;
case 7 : $age = "70∼79 歳";break;
case 8 : $age = "80∼歳";break;
}
// 読み込んだデータを出力
?>
<tr>
30
7.4. 演習
7. ファイルの読み書き
<td><?php print($sex) ?></td>
<td><?php print($age) ?></td>
<td><?php print($row[2]) ?></td>
</tr>
<?php
// 読み込んだデータを書き込まれているデータをキーにして集計。
$res[$age]++;
$res[$sex]++;
$res[$row[2]]++;
}
?>
</tbody>
</table>
<hr>
<h2>集計結果の表示</h2>
<?php
// 配列をキーでソートし、順に表示する。
ksort($res,SORT_LOCALE_STRING);
foreach($res as $k => $v){
print("$k = $v<br>");
}
?>
<hr>
<a href="file_write_test.html">戻る</a>
</body>
</html>
※すべてのファイルの文字コードを統一しておかないと文字化けが発生します。
7.4
演習
例題のプログラムを参考に、次の項目を入力させる HTML フォーム、アクセス数、現在時間を
表示する PHP プログラムを含むファイル (qinput.php)、入力されたデータを CSV 形式のデータ
ファイルに保存する PHP プログラム (qwrite.php)、CSV 形式のデータを読み取り表示する PHP
プログラム (qdisplay.php) を作成する。CSV データファイル名は qdata.csv、アクセス数保存ファ
イル名は qcount.dat とする。
入力する項目は次の通り。
1. 性別 (ラジオボタンで選択)
2. 年齢 (プルダウンメニューで選択)
3. 今、一番大事な物 (テキスト入力)
4. 今、一番手に入れたい物 (テキスト入力)
もし、これ以外に追加したい項目があれば追加してください。
データファイルの形式は次のようになる。
リスト 33: データファイルの形式
"性別","年齢","大事な物","手に入れたい物"
実行例は http://php.k-sakabe.com/qinput.php で確認できる。
31
8. データベースの利用
今回は PHP とデータベースを接続し、SQL 文を使ってデータベースを操作する。
8.1
MySQL の起動
この実習でインストールした環境には MySQL というデータベースが入っている。現在起動して
いないはずなので XAMPP コントロールパネルを使って起動する。Apache も起動しておく。
MySQL を起動できたらブラウザで http://localhost/phpmyadmin/を開く。図 8.1 のような表
示になれば動作している。
図 8.1: phpMyAdmin
8.2
データベースとテーブルの作成
phpMyAdmin が表示されたら次の手順でデータベース、テーブルを作成します。
1. http://localhost/phpmyadmin/のページ内のデータベースのリンクをクリックする。
2. データベース名を入力し、照合順序を選択し、実行するボタンを押す。これでデータベース
が作成される。
3. 新しいテーブル作成フォームにテーブル名とフィール度数を入力し、実行するボタンを押す。
4. フィールド定義のフォームに各フィールドの定義を入力し、保存するボタンを押す。
32
8.3. データの挿入
8. データベースの利用
今回は本のデータベースを作る。データベース名を books、テーブル名を book、照合順序を
utf8 general ci とする。テーブル定義は表 8.1 の通り。
表 8.1: 本のテーブル定義
型
長さ
制約
列名
8.3
id
INT
PRIMARY KEY
title
VARCHAR
price
INT
16
データの挿入
データベース、テーブルの定義が完了したらテーブル book に表 8.2 のデータを挿入する。phpMyAdmin でデータベース books のテーブル book を選択していれば挿入というリンクがあるので
これをクリックし、表 8.2 のデータを入力していけばよい。
表 8.2: 本のデータ
title
id
price
111
PHP ポケットリファレンス
2499
112
マスタリング TCP/IP 入門編
2310
113
やさしい Java 第 3 版
2730
114
はじめよう!コンピュータネットワーク
2625
201
日本の野鳥
3150
データを挿入できたら表示のリンクをクリックするとテーブルのデータが表示されるので確認
する。
8.4
PHP からデータベースへ接続
ここまでで作成したデータベースへアクセスし、すべてのデータを表示するプログラムをリスト
34 に示す。
(注意) データベースの文字コードに UTF-8 を使用しているので PHP のファイルの文字コード
も UTF-8 にすること。
データベースへの接続は次の手順で実施する。
1. データベースサーバに接続する
2. データベースの選択
3. SQL 文を作り、クエリの実行
4. クエリの結果を出力
33
8.4. PHP からデータベースへ接続
8. データベースの利用
5. データベースサーバを切断する
使用する関数は次の通り。
mysql connect(host,user,pass) 指定したホストのサーバにユーザ名とパスワードで接続し、
サーバへのハンドラを得る。
mysql close(データベースハンドラ) サーバとの接続を閉じる
mysql select db(データベース名, データベースハンドラ) 接続したサーバ内のデータベースを
選択する
mysql query(SQL 文) クエリの実行
mysql fetch assoc(クエリ結果) クエリ結果を連想配列に格納する
リスト 34: データベース接続プログラム (dbtest.php)
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>データベース接続プログラム</title>
</head>
<body>
<h1>検索結果</h1>
<?php
// データベースサーバへの接続
$db = mysql_connect("localhost","root","") or exit("エラー:ユーザ名が間違っている。");
// データベースの選択
mysql_select_db("books",$db) or exit("データベースを選択できない。");
// データベースの文字コード指定
mysql_query("set names utf8");
// SQL 文の作成
$sql = "select * from book";
// SQL 文によるクエリの実行
$res = mysql_query($sql, $db) or exit("エラー:クエリが失敗");
// クエリの結果から全データを表示
?>
<table border="1" cellspacing="0" cellpadding="4">
<thead>
<tr>
<th>No</th><th>id</th><th>title</th><th>price</th>
</tr>
</thead>
<tbody>
<?php
for($i = 1; $row = mysql_fetch_assoc($res);$i++){
echo "<tr><td>$i</td><td>";
echo $row[’id’]
. "</td><td>";
echo $row[’title’] . "</td><td>";
echo $row[’price’] . "</td></tr>\n";
}
mysql_close($db);
?>
</tbody>
</table>
34
8.5. データベースへの書き込み
39:
40:
41:
42:
43:
44:
8. データベースの利用
<hr>
実行した SQL 文:<?php echo $sql;?>
<hr>
<a href="dbwrite_test.php">本を追加する</a>
</body>
</html>
8.5
データベースへの書き込み
リスト 35: フォーム入力をデータベースへ書き込む (dbwrite test.php)
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>データベースへ書き込み</title>
</head>
<body>
<h1>データベースへの書き込みテスト</h1>
<?php
if(empty($_POST[’submit’])){
?>
<form method="POST">
ID:<input type="text" name="id"><br>
書名:<input type="text" name="title"><br>
価格:<input type="text" name="price"><br>
<input type="submit" name="submit">
</form>
<?php
}else{
// データベースサーバへの接続
$db = mysql_connect("localhost","root","") or exit("エラー:ユーザ名が間違っている。");
// データベースの選択
mysql_select_db("books",$db) or exit("データベースを選択できない。");
// データベースの文字コード指定
mysql_query("set names utf8");
// SQL 文の作成
$sql = "insert into book values(" .$_POST[’id’] . ",’";
$sql .= $_POST[’title’] . "’," . $_POST[’price’] . ")";
print $sql . " を実行しました。";
// SQL 文によるクエリの実行
$res = mysql_query($sql, $db) or exit("エラー:クエリが失敗");
// クエリの結果から全データを表示
mysql_close($db);
}
?>
<hr>
<a href="dbtest.php">テーブルの表示</a>
</body>
</html>
35
8.6. 郵便番号データベースの作成
8.6
8. データベースの利用
郵便番号データベースの作成
郵便番号から住所と住所から郵便番号を検索するシステムを作る。
8.6.1
データベースとテーブルを作る
phpMyAdmin を使いデータベースとテーブルを作る。データベース名は zipdb、照合順序は
utf8 general ci とする。テーブル名を zipbook とし、その構造は表 8.3 の通り。
表 8.3: 郵便番号のテーブル
フィールド
型
長さ
8.6.2
zip
INT
kenKana
VARCHAR
20
shiKana
VARCHAR
20
tyoKana
VARCHAR
20
ken
VARCHAR
20
shi
VARCHAR
20
tyo
VARCHAR
20
データの登録
指定されたアドレス1 から郵便番号データファイルをダウンロードし、C ドライブに展開する。
zipdata.csv という 13MB 程度のファイルができあがる。ファイルが展開されたら phpMyAdmin
でデータベース zipbooks を開き、SQL のリンクから次の SQL 文を入力し、CSV ファイルのデー
タを登録する。
¶
³
load data infile ’c:/zipdata.csv’ into table zipbook
fields terminated by ’,’ enclosed by ’"’
µ
´
図 8.2: CSV ファイルからのデータの入力
SQL 文がエラー無く終了すると「挿入した行数: 122493 (クエリの実行時間 0.7545 秒)」といっ
たメッセージが表示される。したことを確認し、表示のリンクをクリックし、登録されたデータの
一部を確認する。
1 http://php.k-sakabe.com/zipdatacsv.zip
36
8.6. 郵便番号データベースの作成
8.6.3
8. データベースの利用
接続テストプログラム
郵便番号 192-0914 と市名が八王子の住所を検索するプログラムを示す。
リスト 36: 郵便番号データベース接続プログラム (zipdbtest.php)
1: <html>
2: <head>
3: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4: <title>郵便番号データベース接続テストプログラム</title>
5: </head>
6: <body>
7: <h1>郵便番号データベース接続テスト</h1>
8: <h2>郵便番号 192-0914 の検索</h2>
9: <?php
10: // データベースサーバへの接続
11: $db = mysql_connect("localhost","root","") or exit("エラー:ユーザ名が間違っている。");
12: // データベースの選択
13: mysql_select_db("zipdb",$db) or exit("データベースを選択できない。");
14: // データベースの文字コード指定
15: mysql_query("set names utf8");
16: // SQL 文の作成
17: $zip = "192-0914";
18: $sql = "select * from zipbook where zip=";
19: $sql .= substr($zip, 0, 3) . substr($zip, 4, 4);
20: // SQL 文によるクエリの実行
21: $res = mysql_query($sql, $db) or exit("エラー:$sql が失敗");
22: // クエリの結果から全データを表示
23: echo $sql . "を実行 \n<br>\n";
24: $nums = mysql_num_rows($res);
25: print("<p style=\"background:#00ffff;padding:2px\;font-size:12px\">件数は" . $nums . "
です。</p>");
26: ?>
27: <table border="1" cellspacing="0" cellpadding="4">
28: <thead>
29: <tr>
30:
<th>郵便番号</th><th>県名</th><th>市名</th><th>町名</th>
31: </tr>
32: </thead>
33: <tbody>
34: <?php
35:
for($i = 1; $row = mysql_fetch_assoc($res);$i++){
36:
echo "<tr><td>";
37:
echo $row[’zip’] . "</td><td>";
38:
echo $row[’ken’] . "</td><td>";
39:
echo $row[’shi’] . "</td><td>";
40:
echo $row[’tyo’] . "</td></tr>";
41:
}
42: ?>
43: </tbody>
44: </table>
45:
46: <h2>八王子市を検索</h2>
47: <?php
48: // SQL 文の作成
49: $shi = "八王子市";
50: $sql = "select * from zipbook where shi=\"$shi\"";
51: // SQL 文によるクエリの実行
37
8.6. 郵便番号データベースの作成
8. データベースの利用
52: $res = mysql_query($sql, $db) or exit("エラー:$sql が失敗");
53: // クエリの結果から全データを表示
54: echo $sql . "を実行 \n<br>\n";
55: $nums = mysql_num_rows($res);
56: print("<p style=\"background:#00ffff;padding:2px\;font-size:12px\">件数は" . $nums . "
です。</p>");
57: ?>
58: <table border="1" cellspacing="0" cellpadding="4">
59: <thead>
60: <tr>
61:
<th>郵便番号</th><th>県名</th><th>市名</th><th>町名</th>
62: </tr>
63: </thead>
64: <tbody>
65: <?php
66:
for($i = 1; $row = mysql_fetch_assoc($res);$i++){
67:
echo "<tr><td>";
68:
echo $row[’zip’] . "</td><td>";
69:
echo $row[’ken’] . "</td><td>";
70:
echo $row[’shi’] . "</td><td>";
71:
echo $row[’tyo’] . "</td></tr>";
72:
}
73:
74: mysql_close($db);
75: ?>
76: </tbody>
77: </table>
78: </body>
79: </html>
データベースに登録されている郵便番号は 1920914 という形式なので郵便番号の文字列を最初
の 3 文字と残り 4 文字に substr() 関数を使って分割している。
8.6.4
演習
例題プログラムを正しく動作させ、これまでの例題などを参考に下記の検索ができるプログラ
ムを作りなさい。なお、完成例は http://php.k-sakabe.com/zipsearch.html を参照する。HTML
フォームはこのファイルのものを使うと良い。プログラムはリスト 35 と同様に構造となる。
1. 郵便番号を 194-0914 の形式で入力し、その郵便番号の住所を検索し、表示する。(zipsearch1.php)
2. 都道府県名、市区町村名、町域名のいずれかに検索したい住所の一部を入力するとその文字を
含むすべての郵便番号、住所を検索し、表示する。あいまい検索を利用する。(zipsearch2.php)
38