データベース:サーバにデータを保存しよう

データベースへ接続する
PHPでデータベースを操作するためには、まずPHPのプログラムからデータベース(広義でDBMSのこと)に接続します。接続に必要な情報は、「DBMS名」「ホスト名」「ユーザーアカウント名」「パスワード」「データベース名」などです。これらの情報は、Webシステムを設置する環境(客先のサーバに設置するのか、クラウドシステムを使うのかなど)によって異なります。そのような「環境に応じて編集する必要がある情報」は、「定義ファイル」として1つのファイルにまとめておくと便利です。システム構築先の環境を変更する場合(例えばサーバの移動や、データベースの交換など)は、その定義ファイルのみを書き換えれば済むようにしておくのです。
config.php(定義ファイル)の例
define("DBMS_TYPE" , "mysql"); // DBMS名 define("DBMS_HOST" , "localhost"); // ホスト名 define("DBMS_USER_NAME" , "myuser"); // ユーザーアカウント名 define("DBMS_USER_PASS" , "123456"); // パスワード define("DBMS_DB_NAME" , "mysystem"); // データベース名 // データベース接続用文字列 define("DBMS_CONNECT_DSN", DBMS_TYPE . "://" . DBMS_USER_NAME . ":" . DBMS_USER_PASS . "@" . DBMS_HOST . "/" . DBMS_DB_NAME);
defineを用いて、定数を定義します。「定数」は「変数」と異なり、一度定義したら変更できません。また、先頭に「$」は不要です。
db_test.php
require_once("config.php") require_once("DB.php"); $db = DB::connect(DB_CONNECT_DSN); if (DB::isError($db)) { exit("接続エラー: " . $db->getMessage()); } else { echo "接続成功!"; }
db_test.phpの最初の2行は、PHPファイルから別のPHPファイルを読み込むための処理です。config.phpでは先に定義しておいた情報を、DB.phpではPEAR DBのライブラリを読み込んでいます。
require_once以外にも同じような用途の関数がありますので、使い分けられるようにしましょう。
別のPHPファイルを読み込む関数の違い
関数 | 同じファイルを読み込み済みの場合 | ファイルを読み込めなかった場合 |
---|---|---|
require | 何度でも読み込む | Fatal Errorを発生し、処理を中断する |
include | 何度でも読み込む | Warningを発生し、処理は中断しない |
require_once | 二度目以降は読み込まない | Fatal Errorを発生し、処理を中断する |
include_once | 二度目以降は読み込まない | Warningを発生し、処理は中断しない |
「このファイルを読み込まなければそれ以降の処理が実行できない」という場合は、require系を使い、Fatal Errorで処理が中断する方が望ましいでしょう。また何度も同じメッセージを表示したい場合などはrequireやinclude、ライブラリのように一度読み込めば十分なものについてはrequire_once、include_onceを使用するとよいでしょう。大規模な開発になってくると、気が付かないところで同じファイルをすでに読み込んでいる場合もありますので、_once系の関数がよく使われます。
エラーにはFatal ErrorやWarning以外にも種類があり、以下のマニュアルで確認できます。あるレベルのエラーが起きたときに、エラーメッセージを画面に表示するかどうか、ログファイルに記述するかどうかは、php.iniの設定で決めておくことができます。
PHP: 定義済み定数 - Manual
http://php.net/manual/ja/errorfunc.constants.php
続いて3行目ですが、すでにPEAR DBを読み込んでいるので、DBモジュールの機能を使用しています。「DB::connect」を使い、データベースに接続します。config.phpで定義した定数を元の表現に戻すと、db_test.phpの3行目は以下のようになります。
$db = DB::connect("mysql://myuser:123456@lodalhost/mysystem");
接続した結果を変数「$db」に代入し、次の4行目でデータベース接続処理のエラー判定をしています。エラーの場合は「exit」関数が実行されます。これは文字列を出力し、PHPの処理を中断する関数です。
「exit」関数
http://php.net/manual/ja/function.exit.php
$dbにはオブジェクト型のデータが代入されています。オブジェクト型の変数は、数値や文字列、配列以外にも関数を内部に持つことができます。たとえば「$db->getMessage()」と書くことで、$dbオブジェクト内部のgetMessageメソッド(関数のこと)を実行できます。このメソッドはエラーメッセージを返します。
この時点では、まだデータベースを用意していませんので、接続に失敗します。
DBMSを準備する
PHPからデータベースに接続するためには、以下の準備が必要です。これらの作業はWebシステムを本番サーバへ公開するとき、サーバを移行するときや、データベースを変更する際などに発生しますが、頻度は1回か、多くても数回です。
- DBMSのインストール
- データベースの作成(最低1つ)
- ユーザーアカウントの作成(最低1つ)
- テーブルの作成(1つ以上)
DBMSをインストールする
まずはお好きなDBMSをインストールしましょう。MySQLやPostgreSQLは無料ですし、商用利用もされています。SQLiteはPHPと一緒にすでにインストール済みの場合もあるので、勉強用には手軽でよいと思います。ここでは、DBMSのインストール方法の解説は省きます。
通常はセキュリティを考慮し、Webシステム1つにつき1つのデータベースと1つのユーザーアカウントを作成し、他のWebシステムとは共有しないようにします。そしてWebシステムからの接続に使用するユーザーアカウントには、データの読み書きのみの権限をあたえ、データベースやユーザーアカウント、テーブルなどを作成・削除できないようにしておくと安心です。事前準備であるデータベース、ユーザーアカウント、テーブルの作成は、もっと権限のある別のユーザーアカウント(rootユーザーなど)を使って行います。これらの処理は、デスクトップアプリで作業できるようにもなっています。たとえばWindowsの場合、MySQLであればMySQLAdmin、PostgreSQLであればpgAdminを使用できます。ただ、実際にWebシステムを公開する際には、Linuxベースのサーバを利用することが多いと思いますので、コマンドでも作業できるようになっておくと、後々役立ちます。
これ以降は、MySQLを例に解説を続けます。
DBMSへ接続する
コマンドラインなどから、以下のコマンドでDBMSにログインします。「root」は管理者権限のあるデフォルトのユーザーです。パスワードが必要な場合は最後に「-p」をつけます。
$ mysql -u root
接続が成功すると、以下のようにSQL文の入力待ち画面になります。
mysql>
データベースを作成する
SQLは大文字・小文字の区別をしませんが、ここでは分かりやすいように、SQLのコマンドに当たるものを大文字で書きます。小文字のところは、任意に書き換えることができます。
mysql> CREATE DATABASE mysystem DEFAULT CHARACTER SET utf8;
作成したデータベースは、以下のコマンドで確認することができます。
mysql> SHOW DATABASES;
ユーザーを作成する
現在rootユーザーで接続していますが、もしrootユーザーのパスワードを設定していなければ、ここで設定しておきましょう。rootユーザーを乗っ取られると、すべてのデータを盗まれてしまう危険があります。
mysql> SET PASSWORD FOR root@localhost=PASSWORD('password123');
次に新しいユーザーアカウントを作成し、作成したデータベースに対する権限を設定します。例では全権限(ALL PRIVILEGES)を与えていますが、ここは必要に応じて権限を少なくするとセキュリティが高まります。
mysql> CREATE USER myuser IDENTIFIED BY 'password456'; mysql> GRANT ALL PRIVILEGES ON mysystem.* TO myuser@localhost IDENTIFIED BY 'password456';
ここまでのコマンドは、DBMSによって違いがあります。
テーブルを作成する
先ほどの表の中のレシピテーブルを、もう一度見てみましょう。
テーブルの作成では、この表の枠になる部分を作成します。設定する情報は、以下の通りです。
- テーブルの名前
- 各カラム(列)の名前
- 各カラム(列)のデータ型(数値、文字列などを前もって決めておく必要がある)
- 任意でキーとなる列(その値さえわかれば、どの行のデータなのか分かる列のこと。複数列を組み合わせることもできる)の選択
mysql> CREATE TABLE recipes -> ( -> id INT(11), -> name VARCHAR(64), -> category_id INT(11), -> author_id INT(11), -> create_date DATETIME, -> update_date DATETIME, -> PRIMARY KEY (id) -> );
idはINT(数値)型、nameは64文字のVARCHAR(文字列)型などのように指定しています。データ型には他にも種類があります。フラグ値を入れるための「1文字型(CHAR)」は、よく使うかもしれません。またDBMSによっては「JSON型」「木構造型」などの特殊なものもあります。
ここまででデータベースの準備は終わりです。PHPのプログラムに戻りましょう。