PHP - DBを利用して Web アプリケーション
はじめに、PostgreSQL と MySQL のインストール方法や PHP と Apache のインストール方法 をまとめてあります。自分にとって必要のあるところだけ参照してください。たとえば、PostgreSQL を使用しないなら、そのセットアップ方法や動作確認を無視してください。
PostgreSQL のセットアップ | |
MySQL のセットアップ | |
PHP と Apache のセットアップ | |
PostgreSQL と PHP の動作テスト | |
MySQL と PHP の動作テスト | |
おまけ |
PostgreSQLのセットアップ
ソースを入手します。
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.*)がうまく消えていない時の処理も必要かも...
Linux の場合
ソースアーカイブの
contrib/start-scripts/linux
スクリプトを postgresという名前で、/etc/rc.d/init.d
にコピー して ランレベル 3, 5 で動作するように設定します。# cd /etc/rc.d/init.d # cp -f /usr/local/src/postgresql-7.4.1/contrib/start-scripts/linux postgres # chmod 755 postgres # chkconfig --add postgres # chkconfig postgres on
FreeBSD の場合
ソースアーカイブの
contrib/start-scripts/freebsd
スクリプトを/usr/local/etc/rc.d/pgsql.sh
としてコピーする。実行権を与えるのを忘れないように。# cd /usr/local/etc/rc.d # cp -f /usr/local/src/postgresql-7.4.1/contrib/start-scripts/freebsd pgsql.sh # chmod 755 pgsql.sh
Solaris の場合
/etc/init.d/pgsql
として以下の内容を作成し、/etc/rc3.d
等にS88pgsql
などとシンボリックリンクを張っておく。実行権を与えるのを忘れないように。#!/bin/sh # PATH=/usr/bin:/bin case "$1" in 'start') if [ -f /usr/local/pgsql/bin/postmaster ]; then echo "Starting PostgreSQL." su postgres -c '/usr/local/pgsql/bin/postmaster -S \ -D/usr/local/pgsql/data'& 1>/dev/console 2>&1 fi ;; 'stop') pid=`ps -e | grep postgres | sed -e 's/^ *//' -e 's/ .*//'` if test "$pid" then kill -TERM $pid fi ;; *) echo "Usage: /etc/init.d/pgsql {start|stop}" ;; esac
MySQLのセットアップ
ソースを入手します。
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= |
[mysqld]
default-character-set=
|
調整するとよいパラメータ:
パラメータ | 意味 | 増やすことで得る効果 |
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
Listen | httpd (HTTPサーバー) が、監視するポートを指定します。 |
User | httpd (HTTPサーバー)を起動するときのオーナーを指定します。 |
Group | httpd (HTTPサーバー)を起動するときの group を指定します。#-1 に設定されていてうまく動作しないときがあるので、nobody など実際に許可を与えたいグループに設定する。 |
ServerName | httpd (HTTPサーバー)を起動するホストとポートを指定します。DNS に登録されていない場合、IP Address を指定します。 |
また、デフォルトの 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 以降常に On
、variables_order
、gpc_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 をアクセスすると以下のようなページが表示されます。
● 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'), ...); |
権限の剥奪 | 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
|
||||||||||
$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.ini
の include_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>