オブジェクト指向プログラミング言語との親和性が高いオブジェク トデータベース 、データモデルにXML を採用したXMLデータ ベース なども開発されていますが、普及度は今一歩です。関係モデルの最大の功績は、アプリケーション 、データの 論理的構造 、データの物理的構造 を三階層に分け(三階 層アーキテクチャ)、論理データ独立性 と物理データ独立 性 を実現した点にあります。このことによりセキュリティ・完全性 等を保障していて、今日の普及につながっています。近年では、いわゆる「ビッグデータ」処理の対応のため、SQL (後述) をサポートしないかわりに高速分散処理に対応した、 NoSQL と呼ばれるタイプのデータベースが急速に普及しています。これらの多くは、 単純な key-value型のデータ処理に特化することで、上述の機能を提供するも のです。また、 MapReduce をサポートする Hadoop のようなものもあります。
データの論理的&物理的構造(階層) というのはわかりにくいかも しれませんが、例えばアプリケーション側から「○×のデータちょうだい」と いう問い合わせを DBMS にしたときに、そのデータが HDD にかかれているか、 CD-ROM か、あるいは紙に書いてあってそれを小人が読み取る(?!)か、とい うのは関係ない=要するに、問い合わせにこたえる形でデータを返せば具体的 に中身がどういう構成になっているかは関知しなくてすむ、ということです。 プロトコルの階層と同じような考え方です。
というのは、関係モデルが考えられた頃、データ処理に携わる人たちの間では、 複数の対象の間の関係(あるいは関連)はリンクデータ構造で表現されなけれ ばならないと考える人が多かったのですが、これは誤解であり、それを避ける ために、あえて関係モデルという名前を選んだようです。端的にいうと、関係よりも表の方が抽象化のレベルが低い です。つ まり表は、配列と同様に位置による呼出し が可能だという印象を与 えますが、n項関係ではそうではなく、また表の情報内容が行の順番と無 関係 であるという点についても、表は誤解を招きやすいと思われます。 差異をまとめると以下のようになります。
MS SQL Server, Oracle のようなネットワークごしのアクセスを PHP で実現す るものとしては MySQL やPostgreSQL というものがありま すが、それらとは異なり、sqlite は (MS Access のように?) ファイルとして データベースを持ち、利用(管理)が容易になっているものです。ここでは比較的簡単に利用できる sqlite を用いて簡単な具体例を以下に あげながら PHP でのデータベース連携についてみていきます。
※重要※以下のスクリプトにより、2エントリーのデータベース が作成されます。
例年は受講生全員に以下の php スクリプトを実際に動かしてもらっ ているのですが、4月のリプレースで sqlite 関連のモジュールが外され ているようです。リクエストはしているのですが間に合ってないので、以 下の演習はpuffin で前田が提示することにかえます。各自の演習は「余 力のある人」の課題とします。ちなみに、
puffin と、
liweb
の設定です。後者は PDO, pdo_sqlite が無いことがわかります。 (2022.11.06)
PHPやSQLとは直接関係ありませんが、ここででこのドキュメントの文字コードは UTF-8 であることをヘッド部で宣言してい ることにも再度注意しておいてください。もちろん、ファイルを保存する時に 文字コードを UTF-8 にしておくことも忘れないでください。
class Dbase extends SQLite3 { function __construct() { $this->open('data/test.sdb'); } }でデータベースを扱うためのオブジェクト(クラス)を宣言しています。 "extends SQLite3" と書いておくことで 継承 する、すなわち SQLite3 オブジェクトの持つ機能を使いまわせるようになることで容易にクラ スを再定義できます。JavaScript 同様、オブジェクトという部品を組み立てて プログラミングを行なうというスタイルを取ります、ということなのですが詳 細は略します。
ここでは data ディレクトリの中にある test.sdb というファイルを デー タベースファイル(倉庫?) とすることにして、オブジェクトを生成す ると同時にファイルをオープンすることにしています。なので
$db = new Dbase() or die('データベースが作れません。');によってデータベースをオープンします。もしその時点で存在しなければ、新 規作成されます。これ以降は、$db という変数ででデータベースを指定するこ とになります。また、設定不良等でデータベースがオープンできなければエラー が返ってくるので、その時には 'or' 以降が実行され die (死ぬ=自らプ ロセスを終了する) します。
この .... or die; というのは perl,php では常套句 (.... を実行せよ。さも なくば終了せよ。)ですので、是非慣れてください。とはいえ、そもそも何故そうなるかということなのですが;"or" は論理演算子、 すなわちどちらかが真であれば真、ということで、"or" の左右の式(関数呼び 出し)を評価します。でも、もし左側の式が真であれば or 全体が真、という ことは右側の式は評価するまでもない(ので実行・処理しない)ことになりま す。逆にいうと、左側の式が偽、つまり失敗したときのみ右の式を評価(処理) する、ということです。ひらたく言うと、
A or B;はif (A が失敗) B を実行;ということです。...と解説していますが、試してみると die に制御が渡る前(オブジェクトの 生成時)にエラーが出てしまうようです。本来はエラーの 例外を捕 捉 する必要があるのですが、ここでは詳細は略します。
$db->exec("create table adlist(name text, phone text, email text);");という関数呼び出しでデータベースにアクセスできます。その結果は2次元配 列(表)として返ってきます。
"create table adlist(name text, phone text, email text);";というSQL文で、adlist という名前のテーブル(表、だけど厳密には「関係」) を作ります。name text で name という属性は text つまり文字列であると 宣言しています。phone, email も同様です。以上の過程で SQL はあくまでも 文字列 として用意しておいて、その文字列を exec に渡すこ とで SQL を発行(実行) している、ということを再確認しておいてくだ さい。
"insert into adlist values('maechan','0723321224','maechan@hannan-u.ac.jp');"で、上で作った adlist に values で指定された値で insert (挿入) します。この場合、パラメータの順にしたがって、name 属性 に'maechan'が、phone に' 0723321224'が、email に'maechan@hannan-u.ac.jp' という値があてはめられます。
".$val." | "; } print "
上のスクリプトをread.phpという名前で保存してブラウザでアクセスしてください。
"select * from adlist;"で、データベースの内容が select = 選択され、結果として引き出さ れ ます。"*" は正規表現でのワイルドカードとよばれるで、詳細は略し ますがここでは任意の属性にマッチ=全部の属性、ととらえてください。つま り、adlist の全内容が引き出され $result に代入されるわけです。ここで条 件を絞ったりできるのですが、それは後述します。
連想記憶 とは、データの並びなのですが、配列のように 番号で要素を指定するのではなく、キーワードで要素を指定できる ものです、たとえば処理は以下のようになります。{ a["name"] => "maechan", a["phone"]=> "0723321224", a["email"]=> "maechan@hannan-u.ac.jp" }のようなイメージです。
".$val." | "; } print "
上のスクリプトをdele.phpという名前で保存してブラウザでアクセスしてください。
$p = $_POST["input1"];で form から POST メソッドで渡された input1 という名前のついているパラ メータが取り出せる、というのは前述です。
"delete from adlist where name = '$p';";がデータの削除のSQL文です。ここで
delete from adlistで adlist からデータを削除するといってますが、 このままでは全データが削除されてしまうので、
where name = '$p'で 条件を絞って います。この where は select でも条件をつけ るときに使えます。この場合は POST された名前と一致するデータエントリを 削除する、ということになります。if-else で分岐しているのは、input1 にデー タが入ってるか否かで処理を分けている(データがなければSQL を発行する必 要はない)ということです。