Database
データベース

注意事項

毎回の授業の最初に出席メールを提出せよ.

前回までの出席記録課題と提出状況 を確認せよ.

8 章 データベース

PHP はいろいろなデータベースをサポートしている. PHP からデータベースを利用するためにはそのデータベース固有の アクセス方法を使用する方法と PEAR DB のようなデータベースに依存しない ライブラリを用いる方法とがある.

8.1 PHP によるデータベースのアクセス

データベース固有のアクセス方法を使うと効率が良く,そのデータベースが 本来持っている全機能を利用できるが移植性が悪い. PEAR DB のような共通ライブラリから 1 クッションおいてアクセスすると 効率は少し落ちるが後からのデータベースの変更などに対応できる. この教科書では PEAR DB を使う方法を説明する.

8.2 リレーショナルデータベースと SQL

リレーショナルデータベース管理システムがデータを管理する. データは表形式で管理される.

リレーショナルデータベースへの問い合わせに使う言語が SQL(Structured Query Language).

SQL は大きく DML(Data Manipulation Language) と DDL(Deta Definition Language) に分けられる.

MySQL の操作法については MySQL日本語マニュアル を参照.

MySQL サーバ には複数のデータベースがあり, 一つのデータベースは複数のテーブルを含む. 一つのデータベースを指定し,その中の複数のテーブルにアクセスして 作業するのが一般的である.

すでに実験サーバに作成済みのデータベースを使って SQL 文による操作を 実演する.SQL文とは以下のようなものである
select * from books;
select * from authors;

教科書の p.212 の例について教卓パソコンからコマンドラインで実演する.

8.3 PEAR DB の基本

この実験サーバではすでに PEAR DB がインストールされている. 教科書 p.213 例 8-1 を bookauthor.php というファイル名で入力し確認せよ, 作成済みのテーブルの内容に アクセスし,表示が行われる.ただし,9 行目
$db = DB::connect(...)
の行は授業中の指示に従って書き換えよ.

require_once('DB.php'); で DB クラスを読み込んでいる. DB.php はインクルードパスと呼ばれるユーザが共通にアクセスできる ディレクトリにおかれている.(本サーバでは /usr/share/php)

データソース(DSN)名とは教科書 p.213 例 8-1 の
mysql://librarian:password@localhost/library
のことである.この例では使用するデータベースは mysql で, ユーザ名 librarian, パスワードを password として サーバ localhost の library というデータベースを使うことを指示している. ここで使用するデータベースが固定される.

DSN が決まれば DB::connect() を使ってデータベースに接続する. 例8-1 では 9 行目で DSN を引数として呼出し,結果をオブジェクトとして $db に返している.

DB::iserror() でエラーチェックを行う.エラーメッセージは getMessage() で取得できる

query メソッドでデータベースに SQL を送信する.例 8-1 では 20 行目. 8.2 節で紹介したような SQL 文を送信する.例 8-1 では books と authers の 2 つのテーブルのうち,autorid 欄が統一 IDであるとして 一つにまとめたものを得る SQL 文である.

例8-1 の 15-18行目 で データベースに与えたい SQL 文を 変数 $sql に格納し,20 行目の
$q = $db->query($sql);
で SQL 文をデータベースに送った結果をオブジェクト $q に格納している.

SQL 文の結果 $q に fetchRow や fetchInto メソッドを使用することで 行単位で保存することができる.

例題 8

教科書例8-1 bookauthor.php を参考に authors テーブルの全内容について authorid, name を表示するスクリプト allauthors.php を作れ.

ヒント:
クエリは
$sql ="SELECT authors.authorid,authors.name FROM authors ORDER BY authors.authorid ASC";
とすればよい.

出力のテーブル要素では表が2列(例8-1では3列)になるので 一つの tr 要素の中の td 要素が 3 個だったものを 2 個に変更する.

例題 9

例題 8 を参考に books テーブルの全内容について bookid, authorid, title, ISBN, pub_year を表示するスクリプト allbooks.php を作れ.

例題 10

これまで使用したデータベースの books テーブルに対し,教科書 p.212 の INSERT を実行する スクリプトを insertbook.php という名前で作れ.入力可能な項目名は authorid, title, ISBN, pub_year とする.

ヒント:
フォームを使用する.text 型の input 要素を 4 個 表示し,それぞれのパラメータ名を authorid, title, ISBN, pub_year に する. INSERT はデータの入力なのでデータベースの内容が変化する. このため POST メソッドを使用する. 自己参照型のスクリプトとして,上記 4 個どれかのパラメータが設定されていない ときは入力フェーズとし,すべてが設定されているときは処理フェーズとする.

処理フェーズでは $_POST から それぞれのパラメータの値を取り出し,変数 $authorid, $title, $isbn, $pub_year にコピーして クエリ文字列を以下のように設定する.
$sql = "INSERT INTO books (authorid, title, ISBN, pub_year) VALUES ($authorid, '$title', '$isbn', $pub_year)";
これを $q = $db->query($sql); として処理すればよい.

例題 11

authors テーブルに対し,例題 10 と同様に INSERT 処理を行う スクリプトを insertauthor.php という名前で作れ.入力可能な項目名は name のみとする.

第 9 回課題「数字当てゲーム 2」 を提出せよ.


Updated in June 29, 2011, index.html, Yamamoto Hiroshi