PHPは、HTML埋め込み形のサーバサイド・スクリプト言語である。WindowsNT系のサーバサイド・スクリプト言語ではASPが有名だが、ASPのLinux版と考えていいだろう。ASPはIIS上で動作し、PHPはApache上で動作する。
PHPは、様々なデータベースに接続し、WebDBを容易に実現できる。LinuxでWebサーバの公開と、データベースを利用しているなら、是非PHPを利用し、WebDBシステムを作ってみてほしい。
インストールはrootユーザで行う。
1-1 ソースファイルの展開
/usr/local/srcなどにPHP5のソース・ファイルをコピーし、次のように展開する。
# cd /usr/local/src
# tar zxvf php-5.2.1.tar.gz1-2 configureスクリプトの実行
展開してできたソース・ディレクトリに移動し、configureスクリプトを実行(PostgreSQLがインストールされているものとする)。
# cd php-5.2.1
# ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pgsql=/usr/local/pgsql --with-sigchild --enable-mbstring --enable-mbregex --enable-zend-multibyte --without-mysql1-3 コンパイル、インストール
configureが無事終了したら、コンパイル、インストールを行う。
# make
# make install1-4 php.iniの設定
インストール終了後、PHP4の設定ファイルをコピーする。
# cp php.ini-dist /usr/local/lib/php.ini
WebからPHPを利用してPostgreSQLのデータベースにアクセスさせる場合は、PostgreSQLのアクセス用関数で使用する共有ライブラリ(libpq)の設定を行う。
# vi /etc/ld.so.conf
ファイルの最後に次の2行を追加し、保存する。
/usr/local/lib
/usr/local/pgsql/lib修正を反映させるため、ldconfigを再起動する。
# /sbin/ldconfig
Apache上でPHPが使えるよう、httpd.confファイルを設定する。
# vi /usr/local/apache2/conf/httpd.conf
3-1 モジュールの設定
以下の行が追加されているかを確認する。追加されていなければ自分で入力する。
# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule php5_module modules/libphp5.so3-2 その他の設定
PHPスクリプトファイル(拡張子が.php)をスクリプトだと認識させるため、AddHandler cgi-script .cgiという行の上あたりに以下の行を追加する。
#
# To use PHP scripts:
#
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps ←任意次に、index.phpというファイルがデフォルトページとして使えるよう、DirectoryIndexの設定を次のように修正する。(任意)
<IfModule mod_dir.c>
DirectoryIndex index.html index.php
</IfModule>3-3 再起動
設定を反映させるため、Apacheを再起動する。
# /etc/rc.d/init.d/httpd restart
4-1 ApacheからPHPが使えるかどうかを確認する
phpinfo.phpというファイルを以下の内容で作成し、クライアントからブラウズする。
<?php phpinfo(); ?>
「PHP Version 5.2.1」という表が出てきたらOK。「<?php phpinfo(); ?>」という文字列が表示されたら、PHPコマンドとして認識されていないことになるので、Apacheの設定などを見直す。
4-2 PHPからPostgreSQLデータベースのテーブルが利用できるかを確認する
PostgreSQLデータベース上の任意のテーブルが、PHPから検索できるかを確認する。select_tbl.phpというファイルを以下の内容で作成し、クライアントからブラウズする。
(※赤字のところは自分の環境に合わせて編集する)<?php $db_host = "ホスト名またはIPアドレス"; $db_port = "5432"; $db_name = "データベース名"; $db_user = "データベースユーザ名"; $db_userpw = "データベースユーザのパスワード"; ?> <HTML> <HEAD><TITLE></TITLE></HEAD> <BODY> <?php $con = pg_connect("host=$db_host port=$db_port dbname=$db_name user=$db_user password=$db_userpw"); if ($con == false) { echo "Connect Error\n"; exit; } $tbl_name = "テーブル名"; $sql = "SELECT * FROM $tbl_name"; $result = pg_exec($con, $sql); if ($result == false) { echo "SQL Error\n"; exit; } $rows = pg_NumRows($result); for ($i = 0;$i < $rows; $i++) { echo pg_Result($result, $i, 1); echo "<BR>\n"; } pg_FreeResult($result); pg_Close($con); ?> </BODY> </HTML>エラーメッセージが出ずに、指定した表の1列目のデータが表示されればOK!
※ここで指定するテーブル名は、nobodyユーザがselect権限を持つテーブルでなければならない。
PHP 4.2.0より、php.iniのregister_globalsパラメータのデフォルトがOffになり、フォーム変数が $変数名 でアクセスすることができなくなった。これにより、例えばリストボックスの値によって処理を振り分けたり、ベーシック認証などで認証したユーザ名によって表示項目を変えるなどの処理を行っていたプログラムが、すべて機能しなくなる。
例えば、次のようなプログラムがあったとする。例1)フォームで入力した値を元に、メッセージを変える
<FORM action="<?php echo $PHP_SELF?>" method="POST"> <INPUT type="text" name="nenrei"><INPUT type="SUBMIT" value="実行"> </FORM> <?php if ($nenrei >= 18) print("18歳以上です"); else print("18歳未満です"); ?>例2)ユーザ認証で使用したユーザ名を利用する
<?php if ($REMOTE_USER == "webmaster") print("管理者ユーザです"); else print("一般ユーザです"); ?>PHP 4.2.0より以前のバージョンであれば、問題なく使えるプログラムであるが、PHP 4.2.0以降では、このプログラムでは$REMOTE_USERが使えなくなり、すべてelseの処理になってしまう。
これを解決するには、2つの方法がある。方法1:php.iniの設定を変える
PHPの設定ファイルである「php.ini」のパラメータ「register_globals」の値がOffになってしまったために、今まで動いていたプログラムが動かなくなったのである。なので、このパラメータを従来どおり「On」に設定してApacheを再起動すれば、今までのプログラムは問題なく動くようになる。
方法2:プログラムを修正する
register_globalsパラメータの値がOffになったのは、セキュリティーの脆弱性をある程度解決するためである。であれば、このパラメータはOffにしたままでプログラムが動くように修正するべきである。
PHP 4.1.0より、スーパーグローバル変数というものが追加された。スーパーグローバル変数は通常の変数と異なり、global宣言をすることなく参照できる。【スーパーグローバル変数(抜粋)】
変数名 従来の名前 使いかた $_SERVER $HTTP_SERVER_VARS 実行環境情報などを保持する $_ENV $HTTP_ENV_VARS 環境変数 $_POST $HTTP_POST_VARS HTTP POSTメソッドで与えられた変数 $_GET $HTTP_GET_VARS HTTP GETメソッドで与えられた変数 $_COOKIE $HTTP_COOKIE_VARS HTTPクッキーを通じて与えられた変数
- $_SERVER
- 従来、環境周りの情報を取得するために使用していた $PHP_SELF、$REMOTE_ADDRなどが、すべて $_SERVER[ ]にまとめられた。
$_SERVER['PHP_SELF'] のように使う。- $_ENV
- PHP実行時の環境変数(getenv()で取得できるもの)を保持している。PHPがDSOで組み込まれている場合は、サーバの実行時の環境変数となる。
- $_POST、$_GET
- HTMLフォームのMETHODでPOSTを指定した場合、スクリプト側は $_POST['変数名'] で入力を受け取る。METHODでGETを指定、または何も指定しなかった場合、およびURLに ?変数名=値 で渡された引数については $_GET['変数名7] で受け取る。
- $_COOKIE
- クライアントからクッキーで送り込まれた値を保持する。
これらを利用すると、例題のプログラムは次のように修正できる。
例1)フォームで入力した値を元に、メッセージを変える:修正版
<FORM action="<?php echo $_SERVER['PHP_SELF']?>" method="POST"> <INPUT type="text" name="nenrei"><INPUT type="SUBMIT" value="実行"> </FORM> <?php if ($_POST['nenrei'] >= 18) print("18歳以上です"); else print("18歳未満です"); ?>例2)ユーザ認証で使用したユーザ名を利用する:修正版
<?php if ($_SERVER['REMOTE_USER'] == "webmaster") print("管理者ユーザです"); else print("一般ユーザです"); ?>補足?
しかし、旧バージョンのやり方でプログラムを数多く作っている場合、修正が大変である。なので、とりあえずregister_globalsパラメータをOnに設定して、すべてのプログラムが正常に動作することを確認して動かしておき、少しずつ新しい命令に修正していき、すべての修正が終わったらパラメータをOffに設定すればいいんじゃないか・・・と私は思う。