講義用スタイル
印刷用スタイル

PHP 入門(DBアクセス編)

永続的データの取り扱い

サーバー側でアプリケーションを動かす必要性があるものの代表は、前述の通 りセッションを切っても保存され、必要な時に呼び出すことが可能な永続 的データ処理 です。たとえばネット通販にしてもネットバンキングにして も、顧客に関する情報はかならずサーバ側 になければならない(クラ イアントPCにあったのでは、通販会社が管理できない=必要なときに必要な処 理ができない)わけです。PHP はWeb アプリケーション作成を当初から念頭に おいて設計されているので、この永続的データ処理も比較的簡単にできるよう になっています。

永続的データの取り扱いについて、小規模な場合は普通のテキストファイルで もいいのですが、大規模なデータ(数万件?)の場合、ちょっと検索するだけ でもファイルを最初からずっとたどっていかなくてはならず、かなり処理時間 がかかってしまいます。あと、ファイルのロッ クの問題もあるので、多くの場合、 データベース管理システム (DataBase Management System, DBMS) という機構を利用します。

DBMS とは

DBMS とは、コンピュータのデータベースを構築するために必要なデータベー ス運用/管理のためのシステム、およびソフトウェアのことです。かつてはい ろいろな種類のモデルが提唱されましたが、近年では関係モデル (リレー ショナルデータモデル) を扱うリレーショナルデータベース管理シ ステム(RDBMS) が主流です。
オブジェクト指向プログラミング言語との親和性が高いオブジェク トデータベース 、データモデルにXML を採用したXMLデータ ベース なども開発されていますが、普及度は今一歩です。

近年では、いわゆる「ビッグデータ」処理の対応のため、SQL (後述) をサポートしないかわりに高速分散処理に対応した、 NoSQL と呼ばれるタイプのデータベースが急速に普及しています。これらの多くは、 単純な key-value型のデータ処理に特化することで、上述の機能を提供するも のです。また、 MapReduce をサポートする Hadoop のようなものもあります。

関係モデルの最大の功績は、アプリケーション データの 論理的構造 データの物理的構造 を三階層に分け(三階 層アーキテクチャ)、論理データ独立性 物理データ独立 性 を実現した点にあります。このことによりセキュリティ・完全性 等を保障していて、今日の普及につながっています。
データの論理的&物理的構造(階層) というのはわかりにくいかも しれませんが、例えばアプリケーション側から「○×のデータちょうだい」と いう問い合わせを DBMS にしたときに、そのデータが HDD にかかれているか、 CD-ROM か、あるいは紙に書いてあってそれを小人が読み取る(?!)か、とい うのは関係ない=要するに、問い合わせにこたえる形でデータを返せば具体的 に中身がどういう構成になっているかは関知しなくてすむ、ということです。 プロトコルの階層と同じような考え方です。

関係モデル

関係モデルとは、複数の対象(データ)の間の関係をデータ構造として持つモ デルのことです。直観的にはであらわされるもの、と 考えてもいいと思います。ですが、厳密には違う、ということも頭の片隅にお いておいてください。
というのは、関係モデルが考えられた頃、データ処理に携わる人たちの間では、 複数の対象の間の関係(あるいは関連)はリンクデータ構造で表現されなけれ ばならないと考える人が多かったのですが、これは誤解であり、それを避ける ために、あえて関係モデルという名前を選んだようです。
端的にいうと、関係よりも表の方が抽象化のレベルが低い です。つ まり表は、配列と同様に位置による呼出し が可能だという印象を与 えますが、n項関係ではそうではなく、また表の情報内容が行の順番と無 関係 であるという点についても、表は誤解を招きやすいと思われます。 差異をまとめると以下のようになります。 こうして挙げてみただけでも、関係と表の間には微妙な違いがあることがわか ります。つまり、関係よりも表の方が定義が緩やかな(=抽象水準が低い) 概念となります。とはいえ、組≒行 属性≒列 、と 思ってもらえれば(正確とはいえないのは前述の通り、ですが)さほど間違い ではないでしょう。ちなみに、「組」や「属性」 は関係モデルで使 用される公式用語です。

SQL 入門

SQL とは Structured Query Language(構造化問合せ言語) のこと で、データベースの定義や操作などを実現するためのデータベース言語の一つ です。元々は IBMで研究開発されたものですが、リレーショナルデータ ベースに対応したデータベース言語として ISO 及び JIS において規格化され ており、現在ではリレーショナル型データベースの事実上の標準として位置づ けられています。

SQL を実装した商用リレーショナル型データベースが普及し、これが規格化さ れたのは,SQL が機能的で使いやすかったからです。本来データベースを管理 しているのは RDBMS ですが、RDBMS 自体はユーザからの指示に従って管理を 行ないます。このとき、ユーザはデータベース言語を使用して RDBMS を制御 し、データベースを管理します。このデータベース言語が SQL であり、 その制御機能は以下の 3つに分類されます。

SQL 文で使える命令にはいろいろな種類があるのですが、当面は以下のものを覚えておけば よいでしょう(使用例は後述)。

PHP と sqlite

sqlite とは、php 環境に標準で含まれている RDBMS です。
MS SQL Server, Oracle のようなネットワークごしのアクセスを PHP で実現す るものとしては MySQL PostgreSQL というものがありま すが、それらとは異なり、sqlite は (MS Access のように?) ファイルとして データベースを持ち、利用(管理)が容易になっているものです。
ここでは比較的簡単に利用できる sqlite を用いて簡単な具体例を以下に あげながら PHP でのデータベース連携についてみていきます。

テーブルの作成と、データの挿入

※重要※
例年は受講生全員に以下の php スクリプトを実際に動かしてもらっ ているのですが、4月のリプレースで sqlite 関連のモジュールが外され ているようです。リクエストはしているのですが間に合ってないので、以 下の演習はpuffin で前田が提示することにかえます。各自の演習は「余 力のある人」の課題とします。ちなみに、
    puffin と、
    liweb
の設定です。後者は PDO, pdo_sqlite が無いことがわかります。 (2022.11.06)
以下のスクリプトにより、2エントリーのデータベース が作成されます。 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <?php class Dbase extends SQLite3 { function __construct() { $this->open('data/test.sdb'); } } $db = new Dbase() or die('データベースが作れません。'); $db->exec("create table adlist(name text, phone text, email text);"); $db->exec("insert into adlist values('maechan','0723321224','maechan@hannan-u.ac.jp');"); $db->exec("insert into adlist values('maeda2','0723362633','maechan@ieee.org');"); print "作成されました。"; ?> </body></html> public_html 内に init.php という名前で 保存してください。 データベース指定を最初から 'data/test.sdb'にしておきました。

データの表示

以下のスクリプトにより、上で作成されたデータベースのデータが表示されま す。 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <?php class Dbase extends SQLite3 { function __construct() { $this->open('data/test.sdb'); } } $db = new Dbase(); $result = $db->query('SELECT * FROM adlist'); print "<table border=1>\n"; while ($no = $result->fetchArray(SQLITE3_ASSOC)) { print "<tr>"; foreach ($no as $key => $val) { print "<td>".$val."</td>"; } print "</tr>\n"; } print "</table>\n"; ?> </body></html>
上のスクリプトを
read.php
という名前で保存してブラウザでアクセスしてください。

データの削除

データの削除については以下のスクリプトで実現できます。 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <?php class Dbase extends SQLite3 { function __construct() { $this->open('data/test.sdb'); } } $db = new Dbase(); $p = $_POST["input1"]; if ($p != "") { print "<h1>Result of DELETE $p</h1>\n"; $result = $db->query("delete from adlist where name = '$p';"); } else { print "<h1>Table of Contents</h1>\n"; } $result = $db->query('SELECT * FROM adlist'); print "<table border=1>\n"; while ($no = $result->fetchArray(SQLITE3_ASSOC)) { print "<tr>"; foreach ($no as $key => $val) { print "<td>".$val."</td>"; } print "</tr>\n"; } print "</table>\n"; ?> <form action="dele.php" method="POST"> 名前:<input type="text" name="input1"> <input type="submit" value="削除"> </form> </body></html>
上のスクリプトを
dele.php
という名前で保存してブラウザでアクセスしてください。

おわりに

以上、簡単に php と SQL (と sqlite) について説明しました。詳細は別の資 料にゆずります。いずれにせよ、データベース処理はサーバ処理の根本なので、 頑張って理解を深めてください。
前田としゆき maechan@hannan-u.ac.jp

講義用スタイル
印刷用スタイル