PHPと PostgreSQL/MySQL で Web アプリケーションを!

はじめに、PostgreSQL と MySQL のインストール方法や PHP と Apache のインストール方法 をまとめてあります。自分にとって必要のあるところだけ参照してください。たとえば、PostgreSQL を使用しないなら、そのセットアップ方法や動作確認を無視してください。

PostgreSQL のセットアップ
MySQL のセットアップ
PHP と Apache のセットアップ
PostgreSQL と PHP の動作テスト
MySQL と PHP の動作テスト
おまけ

PostgreSQLのセットアップ (PostgreSQL 7.4.1に対応)

ソースを入手します。
http://www.postgresql.org/

作業は スーパーユーザー(root) で行ってください。

ソースを展開し、コンパイル、インストールします。一連の操作は、Redhat 9 を前提に記述しています。
ドキュメントには /usr/local/src 等にソースを展開してそのまま残ししておくような手順になっているので一応展開したソースは残しておきましょう。もし、古いバージョンの PostgerSQL を利用している場合、pg_dumpallの実行や postmasterプロセスを終了させてください。/usr/local/pgsql のバックアップもね!

PostgreSQL はデーターベース管理のための専用ユーザーが必要なので postgres というユーザーを作ります。 旧バージョンをインストールしてある場合、既に存在しているので必要ありません。データーベースの動作チェックでがあるので、いくつかユーザー(postgres) で作業します。

    # useradd postgres
    # passwd postgres
    New UNIX password: <postres ユーザーのパスワードを設定>
    Retype new UNIX password: <確認のために同じパスワードを入力>
    # cd /usr/local/src
    # gzip -dc postgresql-7.4.1.tar.gz | tar xf -
    # cd postgresql-7.4.1
    # su postgres
    postgres$ ./configure
    postgres$ make all (GNU make)
    .....
    All of PostgreSQL is successfully made. Ready to install.
    postgres$ make check
    postgres$ exit
    # make install

NLS(National Language Support) 対応なので、--enable-nls を指定するとメッセージの言語が選択できます。日本語は標準では対応していません。メッセージカタログ ja.po(src/bin/psql/ja.po) ファイルを作って src/bin/psql/nls.mk ファイルに登録して make すると日本語メッセージ対応になります。

ここで、Linux なら /etc/ld.so.conf に /usr/local/pgsql/lib を追加して /sbin/ldconfig コマンドを実行する。Solaris の場合、 LD_LIBRARY_PATH 環境変数に /usr/local/pgsql/lib を追加するか、crle コマンドで /var/ld/ld.config に追加してください。

    # edit /etc/ld.so.conf
    <add  /usr/local/pgsql/lib  >
    # /sbin/ldconfig

また、コマンドをフルパスで入力するのは大変なので PATH 環境変数に /usr/local/pgsql/bin を追加しておくと良いでしょう。

データ格納用のディレクトリを作成し、 所有権を postgres にしてデータベースを初期化します。この際、Solaris を使用している場合、共有メモリが不足する等の警告が出るときがあります。警告されたら、shminfo_shmmax のサイズを増やしてください。 データーベースの初期化から ユーザー(postgres) で作業してください。

    # mkdir /usr/local/pgsql/data
    # chown postgres:postgres /usr/local/pgsql/data
    # su - postgres
    postgres$ /usr/local/pgsql/bin/initdb --encoding=EUC_JP --no-locale \
    > -D /usr/local/pgsql/data
    .....
    Success. You can now start the database server using:

        /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
    or
        /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data start
          

TCP/IP経由のアクセスを可能にするために、postgresql.conf を編集します。

    postgres$ vi /usr/local/pgsql/data/postgresql.conf
 #tcpip_socket = false

tcpip_socket = true

サーバーを起動したら使用可能になります。

    postgres$ /usr/local/pgsql/bin/postmaster -S -D /usr/local/pgsql/data

PostgreSQL を使用できるユーザを登録します。(PostgreSQLを利用できる UNIXアカウントを登録する)作業は ユーザー(postgres) で行ってください。createuserコマンドを使用して登録しますが、PHP での利用が目的なので apache で利用するアカウントを登録しておきます。(デフォルトは nobody)

1番目の質問 作成するユーザのアカウント名を入力します。
2番目の質問 このユーザがデータベースを作れるかどうか決定します。
3番目の質問 このユーザが新たにユーザを登録できるかどうか決定します。

    postgres$ /usr/local/pgsql/bin/createuser
    Enter name of user to add: nobody
    Shall the new user be allowed to create databases? (y/n) y
    Shall the new user be allowed to create more new users? (y/n) n
    CREATE USER
    postgres$ 

postmaster サーバーは、OS 起動時に起動されるように設定しておく。ロックファイル(/tmp/.s.PGSQL.*)がうまく消えていない時の処理も必要かも...


MySQL のセットアップ(mysql-4.1.12 に対応)

ソースを入手します。
http://dev.mysql.com/

業は スーパーユーザー(root) で行ってください。

    # useradd -m mysql
    # passwd mysql
    New UNIX password: <mysql ユーザーのパスワードを設定>
    Retype new UNIX password: <確認のために同じパスワードを入力>
    # gzip -dc mysql-4.1.12.tar.gz | tar xf -
    # cd mysql-4.1.12
    # ./configure --prefix=/usr/local/mysql --with-mysqld-user=mysql \
    > --with-charset=binary --with-extra-charsets=all
    # make
    # make install

 ※ --with-extra-charsets について
complex - 日本語文字をはじめとする、2バイト(以上)のキャラクタセットを組み込む
all - MySQL がサポートする全てのキャラクタセットを組み込む

● データベースの初期化と起動

    # /usr/local/mysql/bin/mysql_install_db --user=mysql
    # chown -R mysql:mysql /usr/local/mysql/var
    # /usr/local/mysql/bin/mysqld_safe --user=mysql &

 ※ 起動時に、キャラクタセットを指定するには ./mysqld --default-character-set=sjis ... と実行します。

● 動作確認

    # /usr/local/mysql/bin/mysqladmin version
    /usr/local/mysql/bin/mysqladmin  Ver 8.41 Distrib 4.1.12, ....
    ...
 
    Server version          4.1.12-log
    Protocol version        10
    Connection              Localhost via UNIX socket
    UNIX socket             /tmp/mysql.sock
    Uptime:                 12 min 45 sec
 
    Threads: 1  Questions: 12  Slow queries: 0  Opens: 12  Flush tables: 1 ...
    # /usr/local/mysql/bin/mysqlshow
    +-----------+
    | Databases |
    +-----------+
    | mysql     |
    | test      |
    +-----------+
    # /usr/local/mysql/bin/mysqlshow mysql
    Database: mysql
    +---------------------------+
    |          Tables           |
    +---------------------------+
    | columns_priv              |
    | db                        |
    | func                      |
    ...
    | time_zone_transition      |
    | time_zone_transition_type |
    | user                      |
    +---------------------------+
    # /usr/local/mysql/bin/mysql -e "select host,db,user from db" mysql
    +------+---------+------+
    | host | db      | user |
    +------+---------+------+
    | %    | test    |      |
    | %    | test\_% |      |
    +------+---------+------+

● 終了方法

    # /usr/local/mysql/bin/mysqladmin shutdown

mysqld_safe は、OS 起動時に起動されるように設定しておく。/usr/local/mysql/share/mysql/mysql.server スクリプトを利用すると良い。また、ソースに含まれるコンフィグレーションファイル (support-files/my-xxxx.cnf) で環境にあったものを /etc/my.cnf としてコピーしておくことで、/etc/my.cnf ファイルの編集でデータベースを最適化できます。huge > large > medium > small の順で規模を選択できます。大規模データベースに合わせたコンフィグレーションファイルの場合、大容量のメモリが必要です。

MySQL のバージョン 4.1から認証プロトコルが変わりました。そのため 4.0ベースのクライアントライブラリ(libmysqlclient)を利用して作られた Perl DBI や PHP などで利用するためには、OLD_PASSWORD()関数によってパスワードを作成するか、設定ファイルである my.cnf[mysqld] 以下に old-passwords を追加してパスワードを作成する必要があります。4.1ベースのクライアントライブラリを利用して作られた Perl DBI や PHP などからのみアクセスされる場合はこれらは必要ありません。

mysqldump コマンドを利用する場合、必ず --default-character-set= によって出力する文字コードを指定すると安全です。また、4.1以上の MySQLを利用するアプリケーションの場合、"SET NAMES キャラクターセット名" という SQL 文(コマンド)を発行しておくことで漢字コードの変換ミスを防ぐことができます。

キャラクターセットmy.cnf で行う方法:

MySQL 4.1 MySQL 4.1.15 以降
[mysqld]
default-character-set=キャラクターセット名
 
[client]
default-character-set=キャラクターセット名
 
[mysql]
default-character-set=キャラクターセット名
 
[mysqldump] 
default-character-set=キャラクターセット名
[mysqld]
default-character-set=キャラクターセット名
skip-character-set-client-handshake
          

調整するとよいパラメータ:

パラメータ 意味 増やすことで得る効果
key_buffer 検索に使われるインデックスをバッファに保存する際のメモリサイズ パフォーマンスが向上
max_allowed_packet 入力データ保持のための最大バッファサイズ 大きな入力データを扱える
max_connections 認められる同時接続可能なクライアントの数 接続できるクライアント数
table_cache データのキャッシュサイズ ディスクのI/Oが減りパフォーマンスが向上
sort_buffer ソートをおこなう際に使用するバッファサイズ ORDER BYやGROUP BYをクエリーに用いた場合のパフォーマンスが向上
record_buffer スキャンする各テーブルにこのサイズのバッファを割り当てる インデックスを含まないクエリーの実行速度が上がる
join_buffer 完全結合(インデックスを使用しない結合)に使用されるバッファのサイズ 大量のjoin の発行に対応(結合を速くする最良の方法はインデックスの追加です)

MySQL が必要とするメモリサイズの計算(実メモリ+スワップ)
key_buffer + ( sort_buffer + record_buffer ) * max_connections = 必要とするメモリサイズ

OS によっては、メモリ回りのチューニングをすると良いもの(必要なもの)があります。

OS 設定
Solaris
共有メモリ shmmax の調整(デフォルトは 1MB:/etc/system)
set shmsys:shminfo_shmmax=1073741824(1GB)
FreeBSD
ひとつのプロセスが割り当てられるメモリ maxdsiz の調整(デフォルトは 512MB:/boot/loader.conf.local)
kern.maxdsiz="2147483648"(2GB)

PHP 4 + Apache2 のセットアップ

ソースを入手します。
http://httpd.apache.org/download.cgi
http://www.php.net/downloads.php

作業は スーパーユーザー(root) で行ってください。

ソースを展開し、コンパイル、インストールします。 Linux の場合、パッケージに含まれる Apache はDSO(Dynamic Shared Object)対応なのでそのまま利用しても構いません。その場合、Apache 2 のインストールは無視してください。

Apache 2 のソースを展開して configure を実行

    # cd /usr/local/src
    # gzip -dc httpd-2.0.48.tar.gz | tar xf -
    # cd httpd-2.0.48
    # ./configure --enable-so
    # make
    # make install
    # cd ..

Apache の設定ファイルである /usr/local/apache2/conf/httpd.conf をチェックします。既に HTTP サーバーが起動している場合、それを停止するか、新しくインストールした Apache の ポートを変更する。特に Listen, User, Group, ServerName といったディレクティブはチェックしてください。

    # edit /usr/local/apache2/conf/httpd.conf

また、デフォルトの charset が ISO-8859-1 なので自分の作った各ページに charset をきちんと書いていないと文字化けすることがあります。日本語がメインのサイトならば、以下の設定にすると良い。

# DefaultLanguage nl
# デフォルト言語を ja にする
DefaultLanguage ja
 
#LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ltz ca es sv tw
# リストのオーダーを ja を先頭にする
LanguagePriority ja en da nl et fr de el it kr no pl pt pt-br ltz ca es sv tw
 
# AddDefaultCharset ISO-8859-1 コメントアウト
# AddDefaultCharset EUC-JP   または、ISO-2022-JP, EUC-JP, shift_jis に設定

PHP のソースの展開とコンパイル(DSOを作成する)

    # gzip -dc php-4.3.4.tar.gz | tar xf -
    # cd php-4.3.4
    # ./configure --with-pgsql=/usr/local/pgsql --with-mysql=/usr/local/mysql \
    > --with-apxs2=/usr/local/apache2/bin/apxs --enable-track-vars \
    > --enable-mbstring --enable-mbregex --enable-zend-multibyte
    # make
    # make install

ここでは、PostgreSQL ( --with-pgsql=<PostgreSQLのインストール場所> ) と MySQL ( --with-mysql=<MySQL のインストール場所>) の両方を使えるようにしています。どちらか一方のデータベースしか使用しないのであれば、使用するデータベースのコマンドラインオプションのみ指定してください。ちなみに、Oracle の場合、--with-oci8=<Oracle のインストール場所> --enable-sigchild を指定します。

PHP の初期化ファイルの設定と Apache 2 の初期化ファイルの設定(AddType の .php のコメントをはずす。php4_moduleの LoadModuleは、上記のインストールで自動的に追記されています。)

    # cp php.ini-recommended /usr/local/lib/php.ini
    # edit /usr/local/lib/php.ini
include_path = ".:/usr/local/lib/php"
 ...
output_handler = mb_output_handler
display_errors = On
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = SJIS
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none;
mbstring.func_overload = 0
mbstring.script_encoding = auto

register_globals は、EGPCS(Environment, GET, POST, Cookie, Server)変数をグローバル 変数として登録するかどうかを指定します。デフォルトで Off になっています。いくつか、On にしないと動作しないアプリケーションがあるようですが、セキュリティーに考慮して On にしてください(セキュリティーといっても、変数を初期化せずに利用しているケースで問題があるようで、きちんと対処すれば問題無い?ようです...そんなプログラミングって、プログラミングの基本が出来てない気がするけれど...)。とはいっても、自分でプログラミングする場合、register_globals=Off にしてスーパーグローバル変数である $_ENV, $_GET, $_POST, $_COOKIE, $_SERVERを利用することをお勧めします(track_vars:PHP 4.0.3 以降常に Onvariables_ordergpc_order をチェック)。

    # edit /usr/local/apache2/conf/httpd.conf
# for PHP4
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

Apache 2 を起動したら使用可能になります。

    # /usr/local/apache2/bin/apachectl start

PostgreSQL と PHP の動作テスト

まず、PostgreSQL 単体でデータベースをテストしてその内容を PHP を使って表示してみましょう。
createuser で登録されたユーザーで操作を行います。(ここでは、pguser で PATH に /usr/local/pgsql/bin が登録されている)

データベースを作成し、作成したデータベースに接続します。

    pguser$ createdb emaillist
    CREATE DATABASE
    pguser$ psql emaillist
    Welcome to psql, the PostgreSQL interactive terminal.
  
    Type:  \copyright for distribution terms
           \h for help with SQL commands
           \? for help on internal slash commands
           \g or terminate with semicolon to execute query
           \q to quit
   
    emaillist=# 

ここからは、 PostgreSQL をインタラクティブに操作できます。emaillist=# がプロンプトになります。簡単なテーブルを作ったりデータを入力したりしてみましょう。

    emaillist=# create table ELIST (
    emaillist(#   NAME     varchar(40) not null,
    emaillist(#   EMAIL    varchar(80));
    CREATE
    emaillist=#
    emaillist=#
    emaillist=# insert into ELIST values (
    emaillist(#   '加藤 裕子',
    emaillist(#   'y-kato@example.com');
    INSERT 16559 1
    emaillist=#
    emaillist=# insert into ELIST values (
    emaillist(#   '佐藤 肇',
    emaillist(#   'h-sato@example.com');
    INSERT 16560 1
    emaillist=#
    emaillist=# insert into ELIST values (
    emaillist(#   '鈴木 一郎',
    emaillist(#   'i-suzuki@example.com');
    INSERT 16561 1
    emaillist=#

    emaillist=# select * from ELIST;
       name    |        email
    -----------+---------------------
     加藤 裕子 | y-kato@example.com
     佐藤 肇   | h-sato@example.com
     鈴木 一郎 | i-suzuki@example.com
    (3 rows)
 
    emaillist=#
    emaillist=# delete from ELIST where EMAIL = 'i-suzuki@example.com';
    DELETE 1
    emaillist=# select NAME from ELIST;
       name
    -----------
     加藤 裕子
     佐藤 肇
    (2 rows)
 
    emaillist=# \q
    pguser$ 
    pguser$ vacuumdb emaillist
    VACUUM
    pguser$ 

ここで簡単な操作一覧とコマンド一覧を載せておきます。詳細はマニュアルを読んでください。

● 操作一覧

テーブルの作成 create テーブル名 (フィールド1, フィールド2, ...);
データの追加 insert into テーブル名 values (データ1, データ2, ...);
データの表示 select * from テーブル名;
select フィールド1, フィールド2, ... from テーブル名;
データの変更 update テーブル名 set フィールド=データ, フィールド=データ, ... where フィールド=データ;
データの削除 delete from テーブル名 where フィールド=データ;
テーブルの削除 drop table テーブル名;

● コマンド一覧

\? ヘルプを表示
\q psql を終了
\g SQL 文を実行。SQL 文の最後に、セミコロン「;」を書くと、 その SQL 文が実行されるが、セミコロンを書かずに、最後に 「\g」と書いても、同じように実行される。
\i 他のファイルに書かれている内容を取り込む。 一連の SQL 文を、事前にファイルに記述しておき、 「\i ファイル名」とすることにより、一度に SQL 文を実行することができる。
\d データベースの内容を表示
\e 直前に発行した SQL 文をエディタで編集。 環境変数 EDITOR に設定されているエディタが起動される。編集を終了後、 SQL 文が実行される。
\h SQL 文のコマンドの簡単なヘルプを表示

ここで作ったデータを PHP を利用してブラウザで表示してみます。その際に、Apache は nobody で操作を行うのでアクセス権をあたえます。

データベースに接続します。

    pguser$ psql emaillist
    Welcome to psql, the PostgreSQL interactive terminal.
  
    Type:  \copyright for distribution terms
           \h for help with SQL commands
           \? for help on internal slash commands
           \g or terminate with semicolon to execute query
           \q to quit
   
    emaillist=# grant select on ELIST to nobody;
    GRANT
    emaillist=# \q
    pguser$ 

後は、PHP のページを作ってブラウザーで表示する。以下のサンプルプログラムは、基本的な流れを理解できるようにエラー処理など行っていません。

<html>
<head><title>PHP and PostgreSQL</title></head>
<body>
<center>
<h2>E-Mail List</h2>
<table border=2>
<tr><th>name</th><th>email</th></tr>
<?php
    $con = pg_connect("", "", "", "", "emaillist");
    $rtn = pg_exec($con, "select * from ELIST");
    $num = pg_numrows($rtn);
    for($i=0; $i<$num; $i++){
        $name  = pg_result($rtn, $i, 0);
        $email = pg_result($rtn, $i, 1);
        print("<tr><td>$name</td><td>$email</td></tr>");
    }
    pg_close($con);
?>
</table>
</center>
</body>
</html>

上記のようなページを test.php という名前で /usr/local/apache/htdocs ディレクトリーに作成し http://<servername>/test.php をアクセスすると以下のようなページが表示されます。

Browser

 

● PostgreSQL 用の関数

PHP には、PostgreSQL 用の関数が用意されています。 この関数を使うことで、PHP で PostgreSQL に接続しデータベース内のデータにアクセスすることが出来ます。その関数は、pg_ で始まっています。 その中でも良く使いそうなものだけ紹介します。

pg_connect() 接続ID = pg_connect("host=localhost dbname=emaillist ...");
接続ID = pg_connect("ホスト", "ポート", "オプション", "tty", "データベース名");

PostgreSQL に接続するための関数。リターン値として 接続ID を返します。引数の記述方法を2種類書いてありますが、後者の方は昔の記述方法です。Apache と PostgreSQL が同一マシン上で動いている場合、 データベース名だけを指定するだけで接続できます。
pg_exec() 結果ID = pg_exec(接続ID, SQL文);
SQL 文を実行するための関数。この関数が返した値が結果IDとして以降の関数で利用されます。SQL 文の実行が失敗した場合、FALSE が返ります。
pg_result() pg_result(結果ID, 行番号, フィールド名/列番号);
pg_Exec() 関数で select 文を実行した際、その結果から実際の値を取り出すための関数。 行番号とフィールド名(列番号でも可)を指定し、実際の値を取り出します。 行番号、列番号ともに 0 から始まります。
pg_numfields() pg_numfields(結果ID);
pg_Exec() 関数で select 文を実行した際のフィールド(columns)数が返ります。
pg_numrows() pg_numrows(結果ID);
pg_Exec() 関数で select 文を実行した際のレコード(rows)の件数が返ります。
pg_close() pg_close(接続ID);
PostgreSQL との接続を切断する。
pg_errormessage() pg_errormessage(接続ID);
最後に起きたエラーのエラーメッセージを取得する。

MySQL と PHP の動作テスト

まず、MySQL 単体でデータベースをテストしてその内容を PHP のサンプルを作成してみましょう。

● データベースにアクセス可能なユーザーの登録方法(/usr/local/mysql/bin を PATH 環境変数に追加してください)

操作 コマンド
ユーザの作成 grant 権限 on db_name.table_name to user_name@host_name identified by 'password';
ユーザの作成 insert into db_name.table_name values('host_name', 'user_name', PASSWORD('password'), ...);
flush privileges;
権限の剥奪 revoke 権限 on db_name.table_name from user_name@host_name;
ユーザの削除 delete from db_name.table_name where user='user_name';
    # mysql mysql
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 13 to server version: 4.1.12-log
 
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
    mysql> GRANT ALL PRIVILEGES ON *.* TO nobody@localhost IDENTIFIED BY 'passwd'
        -> WITH GRANT OPTION;
    Query OK, 0 row affected (0.00 sec)
 
    mysql> GRANT ALL PRIVILEGES ON *.* TO nobody@"%" IDENTIFIED BY 'passwd'
        -> WITH GRANT OPTION;
    Query OK, 0 row affected (0.00 sec)
 
    mysql> quit
    Bye
    #
・どこからでもサーバーに接続できる完全なスーパーユーザー superadmを作成
GRANT ALL PRIVILEGES ON *.* TO superadm@localhost IDENTIFIED BY 'passwd' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO superadm@"%" IDENTIFIED BY 'passwd' WITH GRANT OPTION;
 
・localhostからパスワードなしで接続でき、reload, process のみ許されるユーザー adminを作成
GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
 
・localhostからのみ接続できるユーザー guestを作成
GRANT USAGE ON *.* TO guest@localhost IDENTIFIED BY 'passwd';
 
・パスワードの設定/変更方法
SET PASSWORD FOR guest@localhost = PASSWORD('newpasswd');

● データベースを作成しデータを入力してみよう

mysqladminコマンド 説明
create dbname 新しいデータベース(dbname)を作成
drop dbname データベース(dbname)を削除
reload 権限テーブルの再読み込み
shutdown サーバのシャットダウン
操作 コマンド
新しいテーブルの作成 create table table_name (field type option);
テーブルの削除 drop table table_name;
テーブルのロック lock table table_name [read|write];
テーブルのロック解除 unlock table table_name;
テーブル名の変更 alter table old_table_name rename to new_table_name;
フィールドの追加 alter table table_name add field type option;
フィールドの削除 alter table table_name drop field;
フィールドの変更 alter table table_name change old_field new_field type [option];
プライマリ・キーの設定 alter table table_name add primary key(field);
プライマリ・キーの削除 alter table table_name drop primary key(field);
レコードの追加 insert into table_name ...
レコードの置換 replace into table_name ...
レコードの更新 update table_name ...
レコードの削除 delete from table_name ...
    # mysqladmin create maillist
    Database "maillist" created.
    # mysql maillist
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 13 to server version: 4.1.12-log
 
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
    mysql> create table ELIST (
        -> NAME   CHAR(255),
        -> EMAIL  TEXT);
    Query OK, 0 rows affected (0.01 sec)
 
    mysql> insert into ELIST (NAME, EMAIL)
        -> values ('加藤 裕子', 'y-kato@example.com');
    Query OK, 1 row affected (0.00 sec)
 
    mysql> insert into ELIST (NAME, EMAIL)
        -> values ('佐藤 肇', 'h-sato@example.com');
    Query OK, 1 row affected (0.00 sec)
 
    mysql> quit
    Bye
    # mysqladmin reload

● PHP でブラウザに表示してみよう

PHP 4.3 を作成する際に、 --with-mysql コマンドラインオプションを使用して MySQL のパスを指定してください。以下のサンプルプログラムは、基本的な流れを理解できるようにエラー処理など行っていません。

<html>
<head><title>PHP and MySQL</title></head>
<body>
<center>
<h2>E-Mail List</h2>
<table border=2>
<tr><th>name</th><th>email</th></tr>
<?php
    $con = mysql_connect("localhost", "nobody", "passwd");
    $rtn = mysql_db_query("maillist", "select * from ELIST", $con);
    $num = mysql_num_rows($rtn);
    for($i=0; $i<$num; $i++){
        $name  = mysql_result($rtn, $i, 0);
        $email = mysql_result($rtn, $i, 1);
        print("<tr><td>$name</td><td>$email</td></tr>");
    }
    mysql_close($con);
?>
</table>
</center>
</body>
</html>

● MySQL 用の関数

良く使いそうなものだけ紹介します。

関数 説明
mysql_connect MySQLサーバへの接続を開く
mysql_pconnect MySQLサーバへの持続的な接続を開く
mysql_select_db MySQLデータベースを選択
mysql_db_query MySQLクエリーを送信
mysql_query SQLクエリーをMySQLに送信
mysql_result 結果データを得る
mysql_fetch_object 結果の行をオブジェクトとして取得
mysql_fetch_array 連想配列、添字配列、またはその両方として結果の行を取得
mysql_free_result 結果を保持しているメモリ領域を解放
mysql_close MySQLサーバへの接続を閉じる

● ちょっとユーザー管理

MySQL をインストールした際に、デフォルトでいくつかユーザーが作成されています。その中に、root および、利用できる範囲は限定されている無名のユーザーが登録されています。もしそれらのユーザーを削除したり、ユーザーのパスワードの設定や削除をしたいなら以下のように操作します。(使用しているサーバーのホスト名が foobar とします。)

    # mysql mysql
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 13 to server version: 4.1.12-log
 
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
    mysql> select host,user,password from user;
    +-----------+----------+------------------+
    | host      | user     | password         |
    +-----------+----------+------------------+
    | localhost | root     |                  |
    | foobar    | root     |                  |
    | localhost |          |                  |
    | foobar    |          |                  |
    +-----------+----------+------------------+
    4 rows in set (0.00 sec)
 
    mysql> delete from user where user="";
    Query OK, 2 rows affected (0.00 sec)
 
    mysql> select host,user,password from user;
    +-----------+----------+------------------+
    | host      | user     | password         |
    +-----------+----------+------------------+
    | localhost | root     |                  |
    | foobar    | root     |                  |
    +-----------+----------+------------------+
    2 rows in set (0.00 sec)
 
    mysql> set password for root@localhost=password('newpassword');
    Query OK, 0 rows affected (0.00 sec)
 
    mysql> select host,user,password from user;
    +-----------+----------+------------------+
    | host      | user     | password         |
    +-----------+----------+------------------+
    | localhost | root     | 3a9eb1070a0130ca |
    | foobar    | root     |                  |
    +-----------+----------+------------------+
    2 rows in set (0.00 sec)
 
    mysql> quit
    # mysql mysql
    ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO)
    # mysql mysql -u root -p
    Enter password: <newpassword>
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 13 to server version: 4.1.12-log
 
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
    mysql> set password for root@localhost=password('');
    Query OK, 0 rows affected (0.00 sec)
 
    mysql> quit
    #

おまけ

PHP による データベースの管理

PHP と PostgreSQL, MySQL を利用しているなら、データベースの管理をブラウザを利用して行えるツールがあります。PostgreSQL 用に phpPgAdmin があり MySQL 用に phpMyAdmin があります。これらを利用することで、ブラウザを利用できるところならどこででもデータベースの管理が行えるため非常に便利です(セキュリティーには十分考慮する必要があります)。

REAR DB

PHP でデータベースにアクセスする際に それぞれのデータベース用のアクセス関数を利用していると、データベースが変更になったときにプログラムを大きく変更しなくてはなりません。そこで PHP 4 には、PEAR DB というクラスライブラリーが用意されています。 このクラスは、PHPから統一されたインターフェースでいろいろなデータベースにアクセス出来るように設計されています。基本的なものだけ説明します。

DB::connect() $db = DB::connect($dsn)
$dsnで指定された接続情報を元にデータベースへ接続。
接続情報のフォーマット: 多くの記述フォーマットがあるので最も使うと思われるフォーマット
database_type://username:password@hostname/db_name
database_type データベースのタイプ("pgsql"、"mysql"など)
username データベースへアクセスするユーザー名
password ユーザーのパスワード
hostname 接続したいデータベースが稼動しているホスト名(ポート番号を指定する場合は":"コロンで区切る。ローカルホストの場合は"localhost"と指定。
db_name データベース名
$db->query(); $result = $db->query()
SQL 文を実行するための関数。
$result->free() $result->free()
query()によって確保されたメモリ領域を開放。
$db->disconnect() $db->disconnect()
データベースの接続を切る。
DB::isError() 指定された変数がエラークラスであるか判定
DB::errorMessage() エラーコードに対応するエラーメッセージ文字列を返す

PEAR DB を使って、PostgreSQL で定義したデータベースのデータにアクセスしてみましょう。以下のサンプルプログラムは、基本的な流れを理解できるようにエラー処理など行っていません。

<html>
<head><title>PHP and PostgreSQL</title></head>
<body>
<center>
<h2>E-Mail List</h2>
<table border=2>
<tr><th>name</th><th>email</th></tr>
<?php
    // Pead DBクラスライブラリの読み込み
    ini_set("include_path","/usr/local/lib/php");
    require_once('DB.php');
 
    // 接続情報
    $dsn = "pgsql://nobody:@localhost/emaillist";
 
    // データベースへ接続
    $db  = DB::connect($dsn);
    $sql = "select * from ELIST";
    $result = $db->query($sql);
    while ($row =  $result->fetchRow(DB_FETCHMODE_ORDERED)) {
        print("<tr><td>$row[0]</td><td>$row[1]</td></tr>");
    }
 
    // 確保したResultSet領域の開放
    $result->free();
 
    // データベースとの接続を切る
    $db->disconnect();
?>
</table>
</center>
</body>
</html>

このように記述しておくと、もしデータベースシステムが PostgreSQL から MySQL に変わっても接続情報(DSN)を変更するだけで対応できます。

ここで使用している PEAR DB 以外にも、PEAR では多くの PHP用のパッケージを提供しています。PEAR DB をよりよくした MDB というものなどもあります(こちらの方が PEAR DB よりも便利です)。ここで提供されているパッケージを利用するには、PHP のパッケージをインストールした際に提供された pear コマンドを使用します。

    # pear install MDB
    downloading MDB-X.X.tar ...
    Starting to download MDB-X.X.tar
    .........................................................
    .........................................................
    .........................done: 1,234,000 bytes
    install ok: MDB X.X
    #

自動的に PHP のクラスライブラリのパスにパッケージをインストールしてくれます(たとえば、/usr/local/lib/php など)。php.iniinclude_path の設定で、クラスのあるパスをきちんと設定できていない場合は設定してください。PHP で、はじめに require_once を使って MDB.php をロードすることでパッケージの利用が可能になります。

余談ですが、pear コマンドはデフォルトで stable パッケージのみ対象となるためベータ版のパッケージをインストールできません。それを変更するには設定を変更する必要があります。パッケージの種類は、stable, beta, alpha, devel, snapshot があります。

    # pear config-set preferred_state beta
    config-set succeeded
    #
<html>
<head><title>PHP and PostgreSQL</title></head>
<body>
<center>
<h2>E-Mail List</h2>
<table border=2>
<tr><th>name</th><th>email</th></tr>
<?php
    // Pead DBクラスライブラリの読み込み
    ini_set("include_path","/usr/local/lib/php");
    require_once('MDB.php');
 
    // 接続情報
    $dsn = "pgsql://nobody:@localhost/emaillist";
 
    // データベースへ接続
    $db  = MDB::connect($dsn);
    $sql = "select * from ELIST";
    $result = $db->query($sql);
    while($row = $db->fetchInto($result, MDB_FETCHMODE_ORDERED)) {
        print("<tr><td>$row[0]</td><td>$row[1]</td></tr>");
    }
 
    // 確保したResultSet領域の開放
    $db->freeResult($result);
 
    // データベースとの接続を切る
    $db->disconnect();
?>
</table>
</center>
</body>
</html>

create table文も連想配列によってテーブルを記述することで作成可能。以下のサンプルプログラムは、基本的な流れを理解できるようにエラー処理など行っていません。

<html>
<head><title>PHP and PostgreSQL</title></head>
<body>
<center>
<h2>E-Mail List</h2>
<table border=2>
<tr><th>name</th><th>email</th></tr>
<?php
    ini_set("include_path","/usr/local/lib/php");
    require_once('MDB.php');
 
    $dsn = "pgsql://nobody:@localhost/emaillist";
    $db  = MDB::connect($dsn);
 
    $fields = array(
        'name' => array(
            'type'      => 'text',
            'length'    => 40
        ),
        'email' => array(
            'type'      => 'text',
            'length'    => 80
        )
    );
 
    $db->createTable("mlist", $fields);
 
    $sql = "insert into mlist (name, email) values ('鈴木 一郎','i-suzuki@example.com')";
    $result = $db->query($sql);
 
    $sql = "insert into mlist (name, email) values ('小林 恵子','k-kobayashi@example.com')";
    $result = $db->query($sql);
 
    $sql = "select * from mlist";
    $result = $db->query($sql);
 
    while ( $row =  $db->fetchInto($result, MDB_FETCHMODE_ASSOC)) {
        print("<tr><td>$row[name]</td><td>$row[email]</td></tr>");
    }
    $db->freeResult($result);
 
    $db->dropTable("mlist");
    $db->disconnect();
?>
</table>
</center>
</body>
</html>