MySQL, PHP (1)
MySQL, PHP - 概念と基本設定

出席調査

出席確認として学生証を教室後ろの入り口近くの出席用PCのリーダにタッチせよ. 出席していない回の実験レポートは提出を認めず,0点として計算されるので 注意すること.

初期設定

システム設定→ ネットワーク→ 有線→ オプション→ IPv4設定で,「方式」を「自動」にして授業ページを読める状態にせよ.

講義

「IT革命」と呼ばれる変化により,掲示板,物品の購入, 銀行振り込み,さらには公的手続きなどあらゆることが 自宅のPCから遠隔操作により完了するようになってきている.

これらに共通して,

という操作が必要になる.ユーザからは見えない部分であるが, 多くの場合,このような機能はデータベースを利用して実装されている. 独自のデータ保存構造を構築するよりも実績のあるデータベースを 利用することで,

などのメリットがある.

本授業では データベースとして広く普及している MySQL を利用し, それを操作するインターフェースとして PHP を利用する 実習を行う.

MySQLでは 1 つのサーバー内に複数のデータベースを, 1つのデータベース内に複数のテーブルをもつ. サーバーに直接接続し,データベースを作成し, テーブルを作成してから PHP などを使って 作成したテーブルを利用する使い方が一般的である.

テーブルはレコードと呼ばれる行の集合になっている. 1 レコードに書ける項目はテーブルごとに決まっている. この個別の項目をフィールドと呼ぶ.

PHP参考リンク

PHPの日本語マニュアル

mysqli 関数のマニュアル

実習

実習0 前提条件の設定

今回の実習の前提条件となる物理的な接続を行う. 今回は各自が自分の PC 上でサーバを構築し,実習を行う

実習0.1 物理的接続とIPアドレス等の設定

各PCを机から出ている実習室LANケーブルに直接接続する.

教卓に向かって左から 1 号機とし, 各班の 1 から 4 号機のIPアドレスは以下の通りとする.サブネットマスクは /16, すなわち 255.255.0.0 とする.

表 12.1 IPアドレス

1号機 2号機 3号機 4号機
1 班 172.17.2.1 172.17.2.8 172.17.2.15 172.17.2.22
2 班 172.17.2.29 172.17.2.36 172.17.2.43 172.17.2.50
3 班 172.17.2.2 172.17.2.9 172.17.2.16 172.17.2.23
4 班 172.17.2.30 172.17.2.37 172.17.2.44 172.17.2.51
5 班 172.17.2.3 172.17.2.10 172.17.2.17 172.17.2.24
6 班 172.17.2.31 172.17.2.38 172.17.2.45 172.17.2.52
7 班 172.17.2.4 172.17.2.11 172.17.2.18 172.17.2.25
8 班 172.17.2.32 172.17.2.39 172.17.2.46 172.17.2.53
9 班 172.17.2.5 172.17.2.12 172.17.2.19 172.17.2.26
10 班 172.17.2.33 172.17.2.40 172.17.2.47 172.17.2.54
11 班 172.17.2.6 172.17.2.13 172.17.2.20 172.17.2.27
12 班 172.17.2.34 172.17.2.41 172.17.2.48 172.17.2.55
13 班 172.17.2.7 172.17.2.14 172.17.2.21 172.17.2.28
14 班 172.17.2.35 172.17.2.42 172.17.2.49 172.17.2.56

いずれもデフォルトルートは 172.17.254.254, DNS サーバも 172.17.254.254 とする.

設定を行い,班員の間の ping の確認, ウェブページへのアクセスの確認を行い,設定が正しいことを確認せよ.

実習 0.2

いくつかのソフトウェアをインストールするので, 最初にパッケージ情報の更新を行うため,下記のコマンドを実行せよ.

user1@pc001:~$ sudo apt-get update

データベースとして MySQL をインストールする.以下のコマンドで インストールせよ.

user1@pc001:~$ sudo apt-get install mysql-server

インストール中に「MySQL の "root" ユーザに対する新しいパスワード」 を要求されるので授業で指示されるパスワードを入力せよ. Tab キーで項目間を移動し,<了解>を選択せよ.

実習 1 コマンドラインからのMySQL

実習 1.1 MySQL の起動と終了

ターミナルを起動し,インストールした mysql サーバに接続する. 下記コマンドを実行せよ.

user1@pc001:~$ mysql -u root -p

ユーザー root のパスワードを聞かれる状態になるのでインストール時に 入力したパスワードを入力せよ.

最初の行に接続したmysglサーバ(今回は自分のPCで動作しているサーバ) のバージョンが確認できる.2014 年 12 月の時点では version 5.5 となっている.

最後の行に

mysql>

と表示されているのが mysql によるプロンプトである. ここにコマンドを入力して操作する.quit と入力すると mysql サーバとの接続が切断される.実行してみよ.

実習 1.2 データベース,テーブル,ユーザーの作成

実習 1.1 で一旦終了した mysql サーバへの接続をもう一度 行え.(mysql -u root p)

プロンプトに対し,

mysql> SHOW DATABASES;

と入力せよ.最後のセミコロンを忘れないように注意せよ. また,この教材では SQL 文の予約語を 慣例に従って大文字で記述するが,大文字小文字は区別されないので 小文字で入力しても良い.

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

上記のような結果が返ってきて再びプロンプトが表示されるはずである. デフォルトで上記 3 つのデータベースが構成されている. ここでは実験用に exp という名前のデータベースを作成する. 以下のコマンドを入力せよ.

mysql> CREATE DATABASE exp;

Query OK というメッセージが出力されてデータベースが作成される. 実際に作成されたことを SHOW DATABASES; で確認せよ.

次にこの exp データベースを使う,ということを指示するため, 以下のコマンドを入力せよ.

mysql> use exp

SHOW TABLES; を実行せよ (最後にセミコロンを付けるのを忘れないように注意) この段階ではテーブルが無いので Empty set と出力される はずである.

各レコードが studentid (学生証番号)フィールドと name(名前) フィールドからなる name テーブルと 各レコードが studentid フィールドと report(レポート名) フィールドからなる report テーブルを作成する. 以下のSQL文を入力せよ.入力の終わりを示すセミコロンを入力 するまで自由に改行できる.セミコロンを入力して初めて入力完了と 判断され,処理される.

下記コードの複数業をそのままコピーすると不要な "->" まで コピーされるので注意せよ.

mysql> CREATE TABLE `student` (
    -> `studentid` char(8) default NULL,
    -> `sname` char(100) default NULL
    -> );
mysql> CREATE TABLE `report` (
    -> `studentid` char(8) default NULL,
    -> `rname` char(100) default NULL
    -> );

ここまで行った後に SHOW TABLES; を実行せよ report と student というテーブルが 表示されるはずである.

ここまでの作業は root と呼ばれる管理者権限を持つユーザで 行った.root は新たなテーブルを作る,消す,といった強力な権限を持つため, 管理者だけが使うべきユーザである. 以下のSQL文で exp データベース内のテーブルを参照, 変更などの権限だけをもつ一般のユーザ expuser を作れ.

mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON exp.* TO 'expuser'@'localhost' IDENTIFIED BY 'パスワード';

mysql サーバと同じホスト(localhost)からログインする expuser というユーザに SELECT, INSERT, UPDATE, DELETE を許可するという意味である.

一旦 quit コマンドで接続を切り,

user1@pc001:~$ mysql -u expuser -p

でログインせよ.パスワードは先の GRANT 文で指定したものを 入力せよ.

ログインが成功したら

mysql> use exp

を入力し,使用するデータベースとして exp を指定する. SHOW TABLES; コマンドを実行すると report と student テーブルが表示される.

実習 1.3 テーブルの操作

実習 1.2 の最後の状態,すなわちユーザー expuser で接続して データベース exp を選択した状態から実習を始める.

student テーブルにどんなフィールドが設定されているか確認する. SHOW FIELDS FROM student; 文を実行し,確認せよ.

まず,student テーブルにレコードを挿入する. データベースへの命令文をクエリと呼ぶ. 例えば studentid フィールドが '0BJT0000', sname フィールドが 'Yamamoto Hiroshi' であるレコードを挿入する クエリは以下のものである.

mysql> INSERT INTO student VALUE ('0BJT0000','Yamamoto Hiroshi');

上記を実行せよ.

以下の SELECT クエリで student テーブルに登録された 全レコードが表示される.実行せよ.

mysql> SELECT * FROM student;

上記の INSERT クエリを参考に班メンバー全員の学生証番号と名前のレコードを student テーブルに挿入せよ.ただし,全角文字は使わず, 半角英数文字のみを使え. 学生証番号のアルファベットは大文字,名前はローマ字表記で で入力せよ.

全員の登録が終わったら SELECT * FROM student; クエリで 確認を行え.

レコードの消去を行うクエリは DELETE である. 最初に挿入した "Yamamoto Hiroshi" のレコードを 消去するには例えば以下のようなクエリを入力すればよい. 実行せよ.

mysql> DELETE FROM student WHERE sname='Yamamoto Hiroshi';

SELECT * FROM student; クエリで消去できたことを 確認せよ.

次に report テーブルへの登録を行う. 班員全員に対し, 一人あたり 2 個のレポートのレコードを挿入する. 例えば 0BJT0002 という班員について studentid フィールドが 0BJT0002, rname フィールドを DNS のレコードと studentid フィールドが同じ学生証番号, rname フィールドを MySQL である 2つのレコードを挿入するならば 以下の 2 つのインサートを行う.

mysql> INSERT INTO report VALUE ('0BJT0002','DNS');
mysql> INSERT INTO report VALUE ('0BJT0002','MySQL');

これを全班員の分だけ繰り返し,最後に SELECT * FROM report; で確認せよ. レポート名は自由に決めよ.別の班員なら同じレポート名があってもよい.

以下のように student, report の 2 つのテーブルの情報を結合して 表示することが可能である.実行して確認せよ.

mysql> SELECT student.studentid, student.sname, report.rname FROM student, report WHERE student.studentid = report.studentid;

実習 2 PHP からの利用

コマンドラインで直接 MySQL サーバに接続するのではなく, ウェブサーバ上に用意した PHP スクリプトから MySQL サーバに接続し,利用する実習を行う. MySQL サーバは多くの場合この形態で利用されている.

実習 2.1 インストール

sudo apt-get install apache2 を実行し,apache2 がインストールされていことを確認する. 未インストールの場合や最新バージョンでなかった場合は 指示に従ってインストール,アップデートを行う.

ブラウザを開き,アドレス欄に自分のホストのIPアドレスを入力して トップページが開くことを確認せよ.

IP アドレスだけを指定された場合,ドキュメントルートにある index.html が表示される. インストール時のドキュメントルートは /var/www/html である.

まず PHP バージョン 5 をインストールする.以下のコマンドでインストールせよ.

user1@pc001:~$ sudo apt-get install php5

これでウェブサーバが PHP スクリプトを扱えるようになる. ターミナルでドキュメントルートである /var/www/html へ 移動し,以下の内容のファイルを hello.php というファイル名で 作成せよ(要管理者権限)

<html>
 <head>
  <title>program1</title>
 </head>
 <body>
  <p>
<?php
echo 'hello, world';
?>
  </p>
 </body>
</html>

図12.1 hello.php

ブラウザを開き,アドレス欄に自分のホストのIPアドレスの後に続けて /hello.php と入力せよ.上記スクリプトが動作し,画面に hello, world と表示される.

  1. ユーザがクライアント上のウェブブラウザから 入力を入れる
  2. クライアントのウェブブラウザはHTTPのプロトコルで サーバに送る
  3. サーバは入力に従ってサーバ上でプログラムを動作させ, 結果をクライアントへ HTTP で送る
  4. クライアントのウェブブラウザが結果の HTTP 応答を 受け取る
  5. HTTP に従って整形してユーザに出力として表示する

という処理をサーバサイドスクリプトという. PHP と 前回実習した perl による CGI はどちらもサーバサイドスクリプトを 記述できるが大きな違いは,

PHP
全体は HTML ソースファイルで,その中でプログラムを呼び出して動作させる
CGI
全体はプログラムで,プログラムが HTML ソースファイルを出力する

という点で逆の構造になっていることである.PHP は HTML を 拡張した形になっているため HTML との親和性が高く,広く普及している.

hello, world が表示されているウィンドウ上で右クリックから 「ページのソースを表示」でソースを表示し, hello.php のスクリプトと比較せよ.

<?php

?>

で囲まれた部分のプログラムが処理されて,プログラムが出力したもの (hello, world) に差し替えられたものが html ソースになっていることがわかる. echo は文字列を出力する構文である.

実習 2.2 PHP からMySQLへ接続

PHP で MySQL で利用するために以下のインストールを行え

user1@pc001:~$ sudo apt-get install php5-mysql

下記コマンドで apache2 の再起動を行え

user1@pc001:~$ sudo service apache2 restart;

次のプログラムをドキュメントルート(/var/www/html)直下に pr02.php というファイル名で作成せよ.

<html>
 <head>
   <title>program2</title>
 </head>
 <body>
  <p>
<?php
$mysqli = new mysqli('localhost','expuser','パスワード','exp');
if ($mysqli->connect_errno){
  echo 'Cannot connet';
  exit();
}
echo 'Connected';
$mysqli->close();
?>
  </p>
 </body>
</html>

図12.2 pr02.php

上記プログラムはオブジェクト指向のスタイルで書かれている. new mysqli でデータベースに接続し,いろいろなデータにアクセスする 起点となるID のようなものを $mysql に返す(オブジェクト).

mysqli 関数は

  1. サーバのホスト
  2. MySQLのユーザ名
  3. パスワード
  4. 使用するデータベース

を引数としてMySQL サーバに接続する関数である. 結果のいろいろな情報は戻り値が格納された $mysql を 起点に検索できる.例えば,接続に失敗すると $mysql->connect_errno に偽の値が入るので,これを エラーチェックに利用している.

pr02.php のパスワードの部分を間違ったものに変更して実行してみよ. また,そのときのエラーログを観察せよ.

実習 2.3 PHP からのクエリ発行と表示

PHP から MySQL を呼び出す作業は プログラムで "SELECT * FROM student" のようなクエリ文を作成し,用意された関数を使って 接続したデータベースに投入する,ということになる. PHPからMySQLを利用する典型的な手順は,

  1. new mysql でデータベースに接続する(テーブルの選択まで行える). このとき,以降の参照の起点となるオブジェクトを受け取る (この実習では $mysqli )
  2. クエリ行を作成する
  3. $mysql オブジェクトに query メソッドで 上記クエリ行を投入する.結果をなんらかのオブジェクトに返す. (以下の例では $result)
  4. 結果が返されているオブジェクトを解析して出力を作成する.

理解が難しいのは最後の手順で,以下の例ではクエリの 結果が格納されているオブジェクト $result に対して fech_assoc() メソッドを実行している.これは一回に 1 行(レコード) づつ結果が返される.このとき,項目名の文字列を添え字とした連想記憶 として返される.fech_assoc() は返すレコードが無くなると偽を返すので それを while の終了条件としている.

実習 2.3.1 student テーブルの表示

これらのことを使用して,student テーブルの全要素 (SELECT * FROM student クエリと同一) を表の形に整形して出力するプログラムが下記のものである. pr03.php として実行せよ.

<html>
 <head>
  <title>program3</title>
 </head>
 <body>
  <p>
list of name
  </p>
<?php
$mysqli = new mysqli('localhost','expuser','パスワード','exp');
if ($mysqli->connect_errno){
  echo 'Cannot connet';
  exit();
}
$q = 'SELECT * FROM student';
$result = $mysqli->query($q);
?>
  <table border="1" summary="studentname">
   <tr>
    <th>student ID</th><th>name</th>
   </tr>
<?php
while ($row = $result->fetch_assoc()){
  $id = $row['studentid'];
  $name = $row['sname'];
?>
   <tr><td><?php echo $id ?></td><td><?php echo $name ?></td></tr>
<?php
}
?>
  </table>
<?php
$mysqli->close();
?>
 </body>
</html>

図12.3 pr03.php

HTML の部分と論理構造の部分が混じっているので読みにくくなっている. 特に table 要素の内容を出力する while ループの部分では ループの中に普通の HTML が挿入されており,ループに制御されて tr 要素がコードの数だけ繰り返し出力されることに注意せよ.

実習 2.3.2 report テーブルの表示

図12.3 を参考に report テーブルの全内容を表示するプログラム, pr04.php を作成せよ.

実習 2.3.3 student テーブルと report テーブルの結合

実習 1 の最後に,コマンドラインから student テーブルと report テーブルの内容を使い, studentid が同じものを結びつけて表示するクエリを行った. 同様のことを php で行うプログラム pr05.php を作成せよ.

課題

第 11 回課題「MySQL,PHP基本」 を提出せよ.


Updated in December 20, 2014, index.html, Yamamoto Hiroshi