PHP/FI 2.0 版

目次

  1. はじめに
  2. インストールの手順
  3. PHP/FIで何ができるか?
  4. CGIリダイレクション
  5. セキュリティについて
  6. セーフモード
  7. コマンドラインからの PHP/FI 実行
  8. HTTP 認証
  9. Apache リクエスト変数
  10. Apache モジュール
  11. Apache モジュールの設定
  12. FastCGI サポート
  13. アクセス制御
  14. アクセス情報の記録
  15. 相対URLと絶対URL、なぜイメージファイルが表示されないのか
  16. PHP/FI における GET と POST データの処理法
  17. PHP における GD (GIF画像作成用ライブラリ) サポート
  18. PHP/FI と仮想ホスト
  19. ファイルアップロード
  20. クッキー(Cookie)のサポート
  21. mSQL サポート
  22. Postgres95/PostgreSQL サポート
  23. mysql サポート
  24. Solid サポート
  25. Sybase サポート
  26. Oracle サポート
  27. Illustra サポート
  28. Adabas サポート
  29. 正規表現
  30. エスケープキャラクター
  31. UNIX ファイル許可属性の8進数表記
  32. PHP/FI スクリプト言語
  33. 自作の内部関数を PHP/FI に加える方法
  34. ソースコード改造について

はじめに

PHP は Perl で書かれた小さな CGI ラッパーであった。 私は自分のレジュメを読んだ人からアイデアを得るための簡便なツール が必要だったので、ある日の午後、このプログラムを作った。 この頃、私個人の使用以外は考えていなかった。 私がレジュメを置いていたWebサーバーは極端に過負荷で、 常にプロセスをフォークするという問題を抱えていた。 私は、Perl ラッパーを C で書き直し、自分のレジュメがアクセスされる度に Perl プロセスがフォークされることによる著しい無駄を 取り除こうとした。

しだいに私のラッパーを知った同じ Web サーバのユーザーから、 これを使わせてくれないか、と尋ねられるようになった。 それから、当然のように彼らはより多くの機能を望みはじめた。 私は多くの機能を付加し、その後ドキュメントとメーリングリストとFAQ 付でベータ版配布をはじめた。 このパッケージの最初の名前は 「Personal Home Page Tools」で、後に 「Personal Home Page Construction Kit」 となった。

同じ頃、私はデータベースで遊ぶようになり、 SQL クエリーを容易に web ページ中に埋め込める ツールを書いた。 これは、根本的に別のCGIラッパーで、 SQLクエリーを処理し、それらのクエリーに基づいて容易にフォームと テーブルを作ることができた。 このツールは、FI (Form Interpreter) と名付けられた。

PHP/FI バージョン 2.0 は、これら2つのパッケージを組み合わせて 1つのプログラムにすることにより、完全に書き直されたものである。 今や、HTML ファイル埋め込み型の簡単なプログラム言語を持つまでに 進化した。 元の頭字語である PHP は過去のものとなった。 この単語は、もはや適当ではない。 PHP/FI は、個人のホームページ(Personal Home Page) での使用に留まらず、多くの web サーバーで使われるようになった。 なんといっても、HTML ファイルに直接簡単なスクリプトを置くこのが 可能になったおかげで、数多くの小さな Perl CGI プログラムを書く必要が なくなったのである。 これにより、 Perl プロセスを何回もフォークすることによる負荷がなくなるため、 あなたの web ページを見る際の総合的な速度が向上する。 また、一つの html ファイルの中にすべての web ページの構成要素を 置くことにより管理が簡単になる。 いくつかのデータベースのサポートの付加により、 データベース機能を有する web ページの開発がとても簡単に なった。 埋め込み型の方が、CGI と HTML 分割して作ろうとするよりもはるかに 処理が容易であることに多くの人が気づいたのである。

PHP 3.0版は、更に別途書き直されたものである。 PHP を今から始めようとする場合には、2.0版よりも 3,0版で始める ことを推奨する。 PHP3 は PHP/FI 2.0 に短期間で更新されるであろうし、開発の労力は 現在 PHP3 に集中しているからである。 PHP/FI 2.0 に残るすべてのバグも単純なもの以外は修正される予定は ない。 PHP3 に関する詳細な情報は、 http://www.lerdorf.on.ca/php3 で得ることができる。

このドキュメントにおいて、PHP,FI あるいは PHP/FI といった 表現を用いているが、これらが指しているのは同じものである。 PHP と FI の違いは、コンセプトの違いによるものだけである。 両者は、同じ配布ソースからつくられる。 アクセスログ機能あるいはアクセス制限機能のサポートを外して 実行ファイルを作った場合には、FI バイナリと呼ぶ。 また、これらのオプション付で作成した場合には、PHPと呼ぶ。


インストールの手順

はじめる前に

もし、あなたにUNIXの経験が全くない場合には、このインストール際に UNIXに関するちょっとした知識を周りの誰かに聞きたいと 思うかもしれない。 すべての手順は可能な限りシンプルに構成されているが、 このソフトウエアは多くの要素により構成されているので、 全てのシステムにおいてスムーズに進行すると考えるのは 現実的ではない。 あなたは、インストールするシステムの特徴を知る周りの誰かを 必要とするかもしれない。

インストール前に知るべきこと

インストールするサーバーは、post と get を用いた CGI プログラム 動かすことができるか?
これは、Apache モジュール版をインストールする場合には関係ない。 そうでない場合には、このパッケージを使用することはできない。 多くのプロバイダでは、CGI プログラムは許可されないか、極端に制限 されている。自分のシステムがそうである場合には、 システム管理者と話して、このパッケージを見せ、 自分のためにインストールしてくれるかどうかを調べること。

mSQL がシステムにインストールされている場合には、 インストールされている場所を知っている必要がある。

Postgres95 または PostgreSQL がシステムにインストールされている 場合には、インストールされている場所を知っている必要がある。

もし、ログの保存やアクセス設定ファイルをNFSマウントされたディレクトリに 置こうとする際に、システムがNFSファイルロック機能を有しない 場合には、src/Makefile 中の NFS_HACK 変数を定義し、 少し修正した gdbm ライブラリを用いなければならないであろう。 詳しくは、doc ディレクトリの中の nfs_hack.txt を参照のこと。

もし、あなたがPHPを使って自分のページのアクセス状況をモニタすることに 関心がない場合には、このオプションを実行ファイルに組み込まないこと。 また、アクセス制限機能も外した方が良いかもしれない。 これらのオプションを組み込むことは、著しいシステム負荷の増大を招く。

もし、Apache モジュール版をインストールする場合には、 Apache のソースコードのディレクトリを知っている必要がある。

インストール手順

手順 1.

まず、インストールプログラムを走らせる。: ./install

いくつかの質問をされる。もし、どんなこと聞かれているかが わからない場合には、単にリターンキーを押すこと。 デフォルトの選択支はほとんどのシステムで安全である。 しかし、設定ファイルとログファイルを置くディレクトリ についての質問に関して、このことはあてはまらない。 httpd (通常は nobody)が書き込み許可を有するディレクトリ を選ぶこと。 このディレクトリを以下のコマンドで簡単に作成することができる。

chown nobody directory.

手順 2.

src ディレクトリに移る。: cd src

php.h ファイルを見ることを推奨する。多くのコンパイル時オプション をここでセットすることができる。

手順 3.

以下を入力する。: make

このコマンドにより、実行ファイル php.cgi がデフォルトで 作成される。もし、Apache モジュール版をインストールする場合には、 libphp.a が作成される。

手順 4. (Apache モジュール版で ない 場合)

実行ファイル php.cgi を自分のシステムの cgi-bin ディレクトリにコピーする。 もし、このディレクトリに書き込む権利がなく、自分のディレクトリに インストールしたい場合には、そうすることができる。 しかし、次のコマンドにより、実行ファイルの setuid ビットを オンにしなければならない。:

chmod u+s /path/php.cgi

もし、実行ファイルの setuid ビットをオンにしない場合には、 この実行ファイルにより作成されたファイルは全てそのユーザーの ID により所有される。もし、このことが受け入れられるならば、 setuid ビットを安心してオフにすることができる。

手順 4. (Apache モジュール版をインストールする場合)
Apache ソースディレクトリに移動する。 ここには、mod_php.cmod_php.h がコピーされていなければならない。 書き込み許可の問題でこれらのファイルが書き込まれなった場合には、 2つのファイルを手動でそこにコピーする必要がある。 Configuration ファイルを編集し、EXTRA_LIBS の行に 手順 3の最後に出力された行を加える。 そして、次の行をファイルの最後に加える。 :

Module php_module mod_php.o

続いて、次のように入力する。 : ./Configure そして、Apache httpd サーバーを再構築する。 make この実行ファイルをインストールする。

次に、Apache の conf/srm.conf ファイルを編集し、次のような 行を加える必要がある。 :

AddType application/x-httpd-php .phtml

これにより、.phtml という拡張子を持つ全てのファイルに対して、 PHP モジュール起動のトリガーとなる新しい MIME の型、 application/x-httpd-php が定義される。 他の拡張子を同様にして定義することも可能である。

もし、全てのユーザーが PHP で解釈されるファイルを実行可能であること を望まない場合には、 access.conf において、 AddType の行を <Location /path>....</Location> 構文の中に置くことにより、PHPで解釈されるドキュメントを サーバー中の特定のディレクトリにのみ許可することができる。

以上で、httpd サーバーを再起動する準備ができた。 PHP モジュールの設定に関するより詳細な情報は、 Apache モジュールに関して を 参照のこと。

実行テスト

インストール終了後、 自分のブラウザに次のような URL を入力することにより、 実行ファイルが動作するかどうかをテストすることができる。 :

http://your.site.domain/cgi-bin/php.cgi

これにより、バージョン番号や他の有益な情報等を含むページが表示される。

Apache モジュール版をテストするためには、.phtml という拡張子を 持つ任意のファイルを作成し、 次のようなタグを入力する。:

<?phpinfo()>

これが PHP に解釈されれば、同様の情報を見ることができる。

使用法

既にある HTML ファイルに対して PHP/FI を使用する場合には、 上記のURLに自分のファイル名をパス付きで加えるだけでよい。 すなわち、

http://your.site.domain/cgi-bin/php.cgi/path/file.html

Apache このドキュメント中の CGI リダイレクションの項を 参照されたい。 PHP/FI をリダイレクトで実行することにより、 PHP/FI に解釈される次のようなURLを自動的に使用することができる。

http:/your.site.domain/file.phtml

以上のことは、Apace モジュール版のユーザーには適用されない。


PHP/FI で何ができるのか?

PHP/FI を介して自分のページを見た時に最初に気づくのは、 フッターにそのページのアクセス数についての情報が加えられて いることであろう。 (アクセス記録機能を有効にして実行ファイルを作成した場合) これは、PHP/FI があなたのために行なえることのほんの一部に 過ぎない。 PHP/FI はフォーム解釈用 CGI 、つまり PHP/FI という名前の FI という部分、 として別の非常に重要な役割を果たす。 例えば、自分のWWWページにフォームを加えようとする際には、 フォームに入力された情報を処理する手段が必要になる。 単にその情報を他のページに受け渡そうとするだけであっても、 そのような処理を行なうCGI プログラムを用意する必要がある。 PHP/FI は、フォームに入力されたデータの処理や、そのデータを用いて このようなことをすることを著しく簡単化する。

簡単な例

次のようなフォームがあるとする。:

<FORM ACTION="/cgi-bin/php.cgi/~userid/display.html" METHOD=POST>
<INPUT TYPE="text" name="name">
<INPUT TYPE="text" name="age">
<INPUT TYPE="submit">
</FORM>

続いて、次のような文を含む display.html というファイルを用意する。:

<?echo "Hi $name, you are $age years old!<p>">

簡単だ! PHP/FI は自動的にフォームのそれぞれについて一つの 変数を作る。 これらの変数を ACTION タグで URL により指定されたファイルにおいて 用いることができる。

次のステップでは、変数の使い方を理解したとして、 ホームページに論理的な流れを作り出すことを始める。 例えば、ユーザーの入力により異なったメッセージを表示したい 場合には、if/else 構文を使うだろう。 上記の例においてユーザーが入力した年齢に基づいて displat.html を変えることにより、異なった表示を行なうことができる。 :

<?
    if($age>50);
        echo "Hi $name, you are ancient!<p>";
    elseif($age>30);
        echo "Hi $name, you are very old!<p>";
    else;
        echo "Hi $name.";
    endif;
>

PHP/FI は上に示した簡単な例よりもはるかに多くのことを行なえる 強力なスクリプト言語を提供する。 詳細な情報は PHP/FI スクリプト言語 を参照のこと。

PHP/FI を自分のページにアクセスする許可を与える人を設定するために も使うことができる。 これは、PHP/FI に組み込まれた設定用画面により行なうことができる。 これにより、例えば特定のドメインからのアクセスする人のみ自分の ページを見ることを許可するということを決めることができる。 また、特定のページをパスワードにより保護するというような 規則を設けることもできる。 詳細な情報は アクセス制御 の項を参照のこと。

PHP/FI は、RFC-1867 の要件を満たす全ての WWW ブラウザからの ファイルアップロードを受け取ることができる。 この機能においては、テキストとバイナリの両方をアップロードする ことができる。 PHP/FI のアクセス制御機能と論理関数により、 ファイルをアップロードできる人と、いったんアップロードされた ファイルによりすることができることを 完全に制御することができる。 詳細は、ファイルのアップロード の項を参照のこと。

PHP/FI は、mSQL と呼ばれるデータベースをサポートしている。 これにより、情報をデータベースに渡したり、.HTML ファイルに 記述された簡単な SQL クエリーを通じてこの情報にアクセスしたりすることが 可能になる。 データベースのバックエンドをWWWページに加えることは、 従来簡単なことでなかった。 詳細は、mSQL のサポート の項を参照のこと。

PHP/FI は、Postgres95/PostgreSQL データベースをサポートする。 この機能は、.HTML ファイル中における埋め込み型の SQL クエリー をサポートする。 詳細は、Postgres95/PostgreSQL のサポート を参照のこと。

PHP/FI は、mysql データベースエンジンもサポートする。 .HTML ファイルにおける埋め込み SQL クエリーがサポートされる。 詳細な情報については、mysql サポート を参照のこと。


CGI リダイレクション

Apache 1.0.x について

PHP/FI を実行するうまいやり方は、Apache サーバーと共に CGI リダイレクションモジュールを用いることである。 もし、Apache モジュール版の PHP/FI を用いる場合には、 リダイレクトモジュールに関する事項を気にする必要はない。 このリダイレクトモジュールは2種類のものが手に入る。 一つは、Dave Andersen <angio@aros.net> により作られたものであり、 ftp://ftp.aros.net/pub/util/apache/mod_cgi_redirect.c から手に入る。 もう一つは、Apache にバンドルされているものであり、mod_actions.c という 名前である。これらのモジュールはほとんど同じものである。 わずかな違いは、使用法に関してである。 両方のモジュールは共にテストされおり、 PHP/FI と組み合わせて動作する。

これを書いている時点(96/4/20)において次のような問題がある。 現在の Apache の公式リリース(1.0.5 版)には、 POST により渡されたデータを処理する際に、 CGI リダイレクションによる関連する要求を実行不可能であるという、 厳しい制限がある。 私は、この原因を突き止め、自分の版の Apache で修正した。 これに関する公式のパッチが PHP ホームページFile Archives にある。

Apache 1.0.x に関する 2 番目の更に大きな問題は、 倍精度実数型のデータをほとんどのアーキテクチャーにおいて 正しく配置しないということである。 あなたが、mod_php を用いた時に奇妙なバスエラーが起こることを 発見したときには、 Apache 1.1 にアップグレードするか、Apache のソースファイル中の alloc.c を編集するかのどちらかを行なう必要がある。 このファイル中に、次のようなコードがある。 :

  union align
  {
    /* Types which are likely to have the longest RELEVANT alignment
     * restrictions... we don't do much with doubles.
     */

    char *cp;
    void (*f)();
    long l;
    FILE *fp;
  };

この部分に倍精度の実数を一つ加えて Apache サーバーを再構築する 必要がある。 正しいコードを示す:

  union align
  {
    /* Types which are likely to have the longest RELEVANT alignment
     * restrictions... we don't do much with doubles.
     */

    char *cp;
    void (*f)();
    long l;
    FILE *fp;
    double d;
  };

これらの問題は、後のバージョンの Apache では全て修正されている。

Apache のドキュメントでモジュールの加え方を確認すること。 通常、Configuration という名前のファイルに モジュール名を加える。 mod_actions モジュールを使いたい場合には、次のような1行を 加える。:

Module action_module mod_actions.o

mod_cgi_redirect.c モジュールを使っている場合には 次のような1行を加える。:

Module cgi_redirect_module mod_cgi_redirect.o

次に httpd をコンパイルし、インストールする。 CGI リダイレクションを設定するために、 mime.types というファイルに新しい MIME タイプを 作るか、 srm.conf というファイルに AddType コマンドを 使って新しいMIMEタイプを加えることができる。 加えるべき MIME の型は次のようなものである。:

application/x-httpd-php phtml

もし、mod_actions.c モジュールを使っているならば、 srm.conf ファイルに次のような行を加える必要が ある。:

Action application/x-httpd-php /cgi-bin/php.cgi

もし、mod_cgi_redirect.c 使っているならば、 srm.conf に次のような行を加える。:

CgiRedirect application/x-httpd-php /cgi-bin/php.cgi

mod_actions.c と mod_cgi_redirect.c を同時に用いてはならない。

CGI リダイレクションモジュールのどちらかをインストールし、 正しく設定した場合には、 単に拡張子 .phtml を有するファイルを作ることに より、PHP/FI により解釈されるファイルを決めることができる。 さらに、index.phtmlsrm.conf 中の DirectoryIndex に関する設定の行に加え、 index.phtml という名前でインデックスファイルを作ることにより、 (index.phtml を置いた) あるディレクトリの最上位のページは自動的に php で解釈されるようになる。

Netscape HTTPD

Netscape サーバー CGI リダイレクションモジュールを用いることにより、 自動的に PHP/FI により処理される拡張子を有するファイルに関する要求を リダイレクトできる。 このモジュールは以下の場所で手に入る。 PHP/FI Home PageFile Archives。 このパッケージに含まれる README の中で、 これをPHP/FI と組み合わせて使う際の 設定法が明解に説明されている。

NCSA HTTPD

NCSA は、現在モジュールをサポートしていない。 そこで、CGI リダイレクションを使うためにはソースコードを 修正する必要がある。 NCSA 1.5 に対するパッチが PHP/FI file archives より手に入る。


セキュリティについて

CGI 版の PHP/FI は、 .htaccess ファイルがディレクトリにある場合でも、 PHP/FI はこのファイルを読まない。 .htaccess による標準的なサーバーによるアクセス制御機能 を用いて保護しているファイルがある場合には、PHP/FI を通してそのページを ロードすることにより、このセキュリティ機構を回避される可能性がある。 このことは、Apache モジュール版の PHP/FI にはあてはまらない ことに注意されたい。

CGI 版に関する2番目の問題点は、システムのcgi-bin ディレクトリに php.cgi が置かれた場合に、php.cgi を実行するユーザーのID でアクセスできる限り システムの中の全てのファイルを見ることが可能であるということである。

この問題に対する対策はいくつかある。最も簡単な解決策は、php.h 中にある パターン制限(PATTERN_RESTRICT) 機能を使うやり方である。 この機能により、PHP/FI により解釈させることが可能な ある拡張子(もしくは拡張子のパターン)を定義することができる。 この拡張子を持たないあるファイルを誰かがPHP/FIを通じて ロードしようとした時には、アクセス拒否 のメッセージが現れる。

別の対策は、PHP/FI のアクセス制限機構により .htaccess に記述したアクセス制限の設定を模擬することである。 しかし、この情報を2つの場所に置くのは冗長であるし、 2つのシステムは全く同じ機能を有しているわけではない。

この問題は、ファイルの許可属性によっても解決することができる。 PHP/FI は、任意のユーザのID で動作するように設定できる。 つまり、 PHP/FI により読み込まれてもよいファイルに適当なアクセス許可属性を 与え、PHP/FI により読み込まれたくないファイルは、 他ユーザーに所有させて適当に変更した許可属性を与えるべきである。

PHP に関するアクセス権が共有されているサイトに関連する追加のセキュリティ オプションについては、 セーフモード 節を参照のこと。


セーフモード

PHP のセーフモードは、全てのユーザーが CGI プログラムを実行する ことを許可しようとする多くの ISP が直面する共通の問題を解決しよう とするものである。 共有される CGI アクセスをより安全にするための 一般的な機構は、Apache に付属するユーティリティ su_exec のような CGI ラッパーを使用することである。 この機構は、PHP がモジュールとして実行されている場合には動作しない。 これは、この場合、setuid されて実行可能な別プロセスではないから である。

この機構は、ファイルのアクセス許可の手法に基づいている。 あるファイルがそのファイルをアクセスしようとしているスクリプトと 同じユーザーIDにより所有されるか、または、 そのファイルがそのファイルにアクセスしようとするスクリプトと同じ ユーザーにより所有されるディレクトリにある場合にアクセスが許可される。 ここで注意を要するのは、自分の OS が、 自分所有のファイルを自分以外の所有に変更することをルートでない ユーザーに許可しないことを確認する必要があることである。 多くの古い SysV システムはこれを許可している。 Irix が、その典型的なものである。 Irix の OS レベルでこの動作を変更することは不可能である。

セーフモードは、セキュリティ上の危険性がある 各関数に適用される。 以下は、関連する各関数に適用される現在のチェックの一覧表である。 次のリストで、PHP UID は、PHP により解釈される現在のファイルの所有者の ユーザーID を指す。 そして、HTTP UID は、httpd プロセスが実行されているユーザーID (通常は、nobody) を指す。

Include, ReadFile, Fopen, File, Link, Unlink, Symlink, Rename, RmDir, ChMod, ChOwn, ChGrp
インクルードされるファイルの所有者が PHP UID であるか、または ファイルが存在するディレクトリが PHP UID により所有されている必要が ある。
Exec, System, PassThru ,Popen
子プロセスとして実行される実行ファイルは、PHP がコンパイルされる 際に php.h で #define PHP_SAFE_MODE_EXEC_DIR で定義された ディレクトリにある必要がある。
Mysql_Connect
この関数は、MySQL データベースと接続する際に使用するために オプションとしてユーザー名をとる。セーフモードの時は、 このユーザー名は、現在解釈中のファイルの所有者のユーザ名または httpd ユーザー(通常は、nobody)のどちらかである必要がある。
HTTP 認証
HTTP認証コードを含むスクリプトの所有者のユーザーID番号は、 認証領域に事前送付される。 これにより、誰かが同じサーバー上の別の認証付きページをだまして パスワードを横取りするスクリプトを書くことを防止する。


コマンドラインからの PHP/FI 実行

PHP/FI の CGI 版を構築する場合、次のようにタイプするだけで コマンドラインからこれを使用することができる。
php.cgi ファイル名
ただし、ファイル名は、処理しようとするファイルである。 また、スクリプトの最初に次のような行を作成することにより、 スタンドアロン PHP/FI スクリプトを作成することも可能である。

    #!/usr/local/bin/php.cgi -q

"-q" は、HTTP ヘッダの出力を抑制する。もし、望むならば このオプションは抜くことが可能である。


HTTP 認証

PHP/FI における HTTP 認証のフックは Apache モジュールとして PHP/FI を実行している時にのみ使用可能である。 Apache モジュール PHP/FI スクリプトにおいては、 Header() コマンドにより "認証要求" メッセージを クライアントのブラウザに送ることができる。 これにより、ユーザ名/パスワード入力用ダイアログがポップアップする。 ユーザーがユーザー名とパスワードを入力すると、 PHP/FI スクリプトを含む URL が $PHP_AUTH_USER,$PHP_AUTH_PW and $PHP_AUTH_TYPE にそれぞれユーザー名、パスワード、認証方法をセットした状態で 再び呼ばれる。 基本的な認証のみがここではサポートされている。

クライアント認証をページで行なうスクリプトの例の一部 を以下に示す。

    <?
        if(!$PHP_AUTH_USER) {
            Header("WWW-authenticate: basic realm=\"My Realm\"";)
            Header("HTTP/1.0 401 Unauthorized");
            echo "Text to send if user hits Cancel button\n"
            exit;
        } else {
            echo "Hello $PHP_AUTH_USER.<P>";
           Header("WWW-authenticate: basic realm=\"My Realm\"");
            echo "You entered $PHP_AUTH_PW as your password.<P>";
        }
    >

単に $PHP_AUTH_USER と $PHP_AUTH_PW を出力するかわりに、 認証のためにユーザー名とパスワードをチェックしたいこともあるだろう。 クエリーをデータベースに送るか、dbm ファイル中のユーザー情報を 見ることにより、認証が可能であろう。

相手がバグのあるインターネット・エクスプローラであるときには 注意を要する。 このブラウザはヘッダーの順序にとてもうるさい。 現状では、WWW-authenticate ヘッダーを HTTP/1.0 401 ヘッダーの前に送ることにより 認証を行なうことができる。

従来の外部プログラムにより認証されるページについてパスワードを 暴くようなスクリプトが書かれることを防ぐために、 外部認証が特定のページについて可能であるならば PHP_AUTH 変数はセットされない。

しかし、この機能により 未認証のURLを制御する誰かが同じサーバー上の認証済みURLから パスワードを盗むことを防ぐことはできない。 php.h 中に定義された PHP_AUTH_VARS を未定義とすることにより、 上記の変数がセットされないことを保証し、 mod_php を使用する誰かがパスワードを盗むことを 確実に不可能にすることができる。


Apache リクエスト変数

PHP を Apache モジュールとして実行している場合、 使いたいヘッダ変数の前に $req_ を付加することにより、 リモートブラウザから送られたリクエストヘッダ変数にアクセスすることが 可能である。 リクエスト名が、User-Agent のように文字 - を含む場合は、 - を _ (アンダースコア)に置き換え、$req_User_Agent のように 参照する必要がある。 phpinfo() 関数は、 リクエストヘッダを全て表示するために使用することができる。

    <
        echo "$req_connection<br>";
        echo "$req_host<br>";
    >
上の簡単なスクリプトは、次のように出力する。
    Keep-Alive
    www.host.com

Apache モジュールに関して

PHP/FI を Apache モジュールとして実行することは、 このパッケージを最も効率的に運用する手段である。 PHP/FI をモジュールとして実行することは、 PHP/FI の機能が Apache サーバーの機能と組み合わされ 一つのプログラムとなることを意味する。 PHP/FI をモジュールとして実行することには、数多くの 利点がある。:

性能

性能面からは、従来のCGIプログラムよりもかなり速い。 事実、PHP/FI をモジュールとして動作させる時、CGIは必要とされない。 HTML中のスクリプトコードは Apache web サーバープロセスにより直接実行される。

セキュリティ

モジュールとして実行される際には、 Apache の設定ファイルか個人の.htaccess ファイル中において 定義される通常の httpd で用いられるアクセス制限ルールは、 モジュールがファイルを処理することを許可された後で適用される。 もしくは、 通常のhttpd ベースの認証を制御するPHP/FIスクリプトを 作ることもできる。 HTTP 認証 を参照のこと。

設定の簡便性

パーサが httpd プロセスの内部でいつでもアクティブであるので、 httpd プロセスの設定に用いるのと同じ設定ファイルを用いて プロセス開始時に設定を行なうことができる。 モジュールにおいては、.htaccess ファイル中に PHP 設定ディレクティブを置くことにより、 ディレクトリ毎に設定を行なうこともできる。

カスタムサーバー型アプリケーションの基礎

Apache の内部から自分の関数にアクセスすることに関心がある C プログラマ にとって、PHP/FI フレームワークは、Apache と PHP 自体への非常に簡単な インターフェースを提供します。 PHPに関数を加えて処理されるページから呼び出すのは、 スクラッチから Apache モジュール全体を書くより非常に簡単である。 このドキュメントの終りの方にある 自分の関数をPHP/FI に加えるには 節を参照のこと。

Apache モジュール設定ディレクティブ

次の宣言文は、srm.conf ファイルか、 access.conf 中の <Directory>...</Directory> タグの 内部か、access.conf 中の <Location /path>...</Location> タグの内部か個々の .htaccess ファイル中に置くことができる。:

.htaccess ファイルにおいて命令が動作するために、Options override を AllowOverride Apache 命令によりセットする必要がある。 ただし、 *.conf ファイルにおいてのみ使用可能な phpEngine 命令は例外である。

phpShowInfo on|off
PHP 情報フッターをオン/オフにする。デフォルトはオン。

phpLogging on|off
ログ機能をオン/オフにする。デフォルトはオン。

phpDebug on|off
自動 ?info デバッグ画面を on または off にする。デフォルトはオフ。

phpUploadTmpDir directory
フォームによりアップロードされるファイルを置くディレクトリを指定する。

phpDbmLogDir directory
dbm に基づくログファイルが書き込まれるディレクトリを指定する。

phpSQLLogDB database
ログ記録用の SQL データベースの名前をセットする。 デフォルトは、"phpfi"。

phpSQLLogHost hostname
ログ記録用の SQL データベースがあるホスト名をセットする。 デフォルトは、"localhost"。

phpAccessDir directory
PHP アクセス制御用の内部ファイルが保存されるディレクトリを指定する。

phpMaxDataSpace KiloBytes
PHPモジュールにおける内部記憶領域の最大値。 この値を小さな数にすることにより、mod_php がシステムに与える負荷を 最小化することができるが、複雑なスクリプトを書くことも制限を受ける 可能性がある。デフォルトは、8K。

phpIncludePath colon-separated path
include() を実行する際に php がファイルを 探すコロンで分割されたディレクトリのリスト。 デフォルトは、カレントディレクトリのみを探す。

phpAutoPrependFile ファイル名
PHPの Include()関数を用いて (よって、phpIncludePath がこのファイル名に適用される) 実際の PHP/FI ファイルである"主ファイル" が実行される前に 実行されるファイルの名前をここで指定することができる。 自動的に付加されるファイル(auto-prepended file)から HTML を書く場合には、 Header()関数を主ファイル中で使用することが困難になることに注意されたい。

phpAutoAppendFile ファイル名
PHP/FIファイル本体が実行された後に(PHPのInclude()関数により) 実行されるファイルの名前。 phpAutoPrependFileと同様。

phpAdaDefDB データベース
デフォルトで使用するの Adabas データベース。 デフォルト値はなし。

phpAdaUser ユーザ名
デフォルトの Adabas データベースユーザ名。 デフォルト値はなし。

phpAdaPW パスワード
デフォルトの Adabas データベースのパスワード。 デフォルト値はなし。

phpEngine on|off
PHP の文法解釈エンジンを on または off にする。 デフォルトはonである。 この命令は、AllowOverride Options により .htaccess ファイルにおいて、命令リストにより命令を使用できる ようにする一方で、同時に mod_php へのアクセスを制限するような サイトにおいてのみ有益である。 仮想ホスト毎に PHP のインストール管理を行う一般的な方法は、 仮想ホスト毎に AddType 命令により PHP の mime 型を使用可能にし、 PHP を使用しない仮想ホストの組では、"e;phpEngine off" を用いることである。 PHP を使用しない顧客が、PHP mime 型を自分の .htaccess に置くことにより 回避しようとしても、phpEngine off の設定によりPHP パーサに機能上の拘束が 課される。
phpLastModified on|off
PHPページは動的に作成されるため、アクセスする度に各ページ は処理され、ブラウザに送られる。 しかし、単純な挿入のために PHP を使用する場合には、 ソースが変わらない限り実行されるページは不変である。 このような場合、ページの再作成や再ロードを回避したいと 考えるであろう。 phpLastModified をオンにすると Apache は、Last-Modified タグを ブラウザに送る。 この場合、そのページは変更があった場合にのみ再ロードされる。 ページ記録機能を使用している場合、多重アクセスは記録されないことに注意 されたい。

これらの宣言文は全てオプションである。 宣言がどこでもなされない場合には、コンパイル時のデフォルト値が用いられる。


FastCGI サポート

PHP/FI は FastCGI サポートを有効にしてコンパイルすることができる。 その際には、PHP/FI をコンパイルする前に 自分のプラットフォーム用の FCGI 開発キット をダウンロードし、コンパイルする必要がある。 また、CGI リダイレクション を動作させる 必要がある。 それから、自分のプラットフォーム用 FastCGI のドキュメント中の指示に従うこと。 mod_fastcgi モジュールを Apache サーバーと共に使用する場合には、 次のような順序で作業を行なう。:

これにより、 .fhtml 拡張子を有する全てのファイルは、 既に実行されている FastCGI php.fcgi プロセスへと 渡される。 php.fcgi 実行ファイルは、まだ通常のCGI実行ファイルとしても 動作するので、 php.cgi から php.fcgi へのシンボリックリンクを作成する ことも可能である。

Apache を使用しない場合には、上記手順に似ているが異なった 手段となる。 NCSA や Netscape サーバにおいて使用可能な CGI リダイレクション機構用 ファイルは、 PHP/FI ファイルアーカイブ にある。


アクセス制御

PHP/FI 組み込みのアクセス制御のサポートは、恐らく将来のバージョンにおいて 打ち切られるだろう。 代わりに web サーバーに付属する セキュリティ機構の使用を真剣に考慮するべきである。

このパッケージをコンパイルする時にアクセス制御機能を含めた場合には、 ?configという記述をURLに加えることによりアクセス制御ファイルを 編集することができる。以下に例を示す。

http://your.machine.domain/cgi-bin/php.cgi/path/file.html?config

あなたの設定用パスワードの初期値はあなたのユーザーIDにセットされる。 もし自分のユーザーIDがパスワードとして使用できないときは、 おそらく PHP があなたのユーザーIDが存在するマシンの /etc/passwd ファイルを 読むことができないと考えられる。 このような場合には、初期パスワードは、"php"にセットされる。 このパスワードは変更するのが賢明である。 単一の PHP/FI バイナリを用いて 複数のユーザーが自分自身の個人設定用ファイルを保持することができる。

アクセス制御に関して最初はかなり混乱するかもしれない。 ?config の画面は複数の節(画面)に分割されている。 最初の節はパスワードを変更するためのものである。 このパスワードはこれを知る者だけがアクセス制御の 設定を変更可能であるようにするためのものである。 システム全体にインストールを行なった場合には、 各ユーザーはパスワードで保護された自分用の設定画面を持つことができる。

?config 画面の第2節は、複数の表から構成される。 各表はあるルールセットを規定する。 最初のルールセットはいつもデフォルトのルールセットとなる。 このデフォルトのルールセットはもしあるページが固有のルールセットを 規定していない場合に用いられる。 デフォルトのルールセットの後に 複数の特定のルールセットを記した表を続けることができる。

特定のファイル用のルールセットを加えるためには、 ブラウザ上でそのファイルのURLを入力し、 ?config をURLの終わりに付け加える。 もし、まだあるルールセットが存在しない場合には、 表示された ?config 画面においてそのページにそのルールセットが付け加えられた ことを確認できる。 新しいルールセットが付け加えられた時には、 デフォルトのルールセットと同様にセットされる。 次の図は、2つの簡単なルールセットを示している。 最初は、全てのドメインからのアクセスをログに記録することだけを指示する デフォルトのルールセットであり、 2番目は /~rasmus/test.html というファイルのみについて ".edu" ドメインから来たユーザーのアクセスを 許可しないことを指示するものである。

[Image of ?config screen]

ルールセットを編集する際には、所望の設定がルールセットの中に 現れるように(ドロップダウンボックス等の)フィールドを修正し、 "Submit Changes" ボタンを押す。 もし、もっと多くのルールが必要ならば、 "Add Rule" を押し、付け加えられたルールを 編集する。

ルールを削除するためには、そのルールの右にあるチェックボックスを 選択し、"Submit Changes" を押す。 画面が再描画され、そのルールは消える。

正規表現をパターンフィールドに入力することが必要となることもある。 詳細はこのドキュメント中の正規表現の節を参照のこと。


アクセス情報の記録

アクセス情報の記録は、コンパイル時にインストール用スクリプトの 質問に対して Yes を答えることにより使用可能となる 別のオペレーション機能である。 アクセス記録データを dbm ファイル、mSQL データベース、 mysql データベースのどれかに保存することが可能である。 後ろの 2つはより強力であるが、セットアップがやや難しい。

dbm ファイルをログ記録の保存に使う際には、 ログファイルを書き込むことのできるディレクトリを指定する必要がある。 PHP はこのディレクトリがない場合には作成を試みる。 しかし、適当な許可属性を確実に設定するために、 始めて PHP を動作させる前にこのディレクトリを自分で作成することもできる。 PHP cgi プログラムを実行するユーザーIDがこのディレクトリに対して 書き込み可能であるように許可属性を設定する必要がある。

アクセス記録データを保存するために mSQL データベース、 または mysql データベースを使う時は、 自分のシステムにmSQLまたは mysql がインストールされ、実行されているかを 最初に確認する必要がある。 次にデータベースを作成する必要がある。 デフォルトの名前は "phpfi" であるが、 この名前は src/php.h において変更可能である。 mSQL でデータベースを作成するには、次のように入力する。:

    msqladmin create phpfi

mysql については、次のように入力する。:

    mysqladmin create phpfi

次に mSQL の場合は、msql.acl ファイルを編集し、 データベースの許可属性が正しいことを確認する。 次のような記述で充分である。:

    database=phpfi
    read=*
    write=nobody,<your user id>
    access=local

mysql の場合は、httpd ユーザー(通常は "nobody") が データベースにアクセスできるかどうかを確認する必要がある。 mSQL とは異なり、mysql はアクセス制御データをあるデータベースの 中に保持する。 デフォルトの許可属性を仮定すると、 次のようなコマンドを実行することができるに違いない。:

    echo "INSERT INTO user VALUES ('localhost','nobody','','Y','Y','Y','Y','Y','Y','Y','Y','Y');" | mysql mysql

忘れずに次のように新しい設定をロードする。:

    mysqladmin reload

ログデータを保存させたいユーザーID毎に、 2つのテーブルを作成する必要がある。 scripts ディレクトリにあるシェルスクリプト msqllog はこれを行なう。 単に以下を入力する。:

    msqllog <user id> 

mysql の場合は、以下を入力する。:

    mysqllog <user id> 

これによりスクリプトは適当なテーブルを作成する。 各システム上においてログが保存される場所を反映するためにスクリプト を編集する必要があるかもしれない。

あなたはこのスクリプトを覗いてみたいと思うかもしれない。 ここでは、記録用テーブルのフィールドの大きさを定義している。 例えば、ファイルパスが64文字を越えることがわかっているならば、 msqllog または、mysqllog ファイル中の logNlastN の両方のテーブルにおけるファイル名の大きさを 大きくする必要がある。

アクセス記録時にはページ毎の "ヒット " 数についての情報 が保存される。 このヒット数情報はこれらのログファイルを 評価することにより集計することができる。 ログファイルを集計するスクリプトの例がこのパッケージに含まれている。 examples ディレクトリ中の log.html ファイルがそれである。 これは、 dbm によるログファイルの解析を行なう。 mSQL によるログファイルの解析を行なうのは、mlog.html である。 そして、 mysql によるログファイルの解析を行なうのは、mylog.html である。 これを実行するには、このファイルと、他のmlog.* ファイルを 自分の web サーバーからアクセス可能なディレクトリに コピーし、次のように入力する。:

    http://your.machine.domain/cgi-bin/php.cgi/path/mlog.html

もしくは、Apache モジュール版を使用している場合には、 このスクリプトに拡張子 ".phtml" を付け、次のようにコールする。:

    http://your.machine.domain/path/mlog.phtml

PHP をアクセス記録機能付きでコンパイルした場合、 デフォルトでは、各ページはいくつかのアクセス情報を含む フッター付きで表示される。 このフッターを表示させずにヒット数の記録を行ないたいと思う時、 Apache を実行している場合には、Apache の httpd.conf または .htaccess ファイルに"phpShowInfo off" を記述しこのフッタを オフにすることができる。 Apache を使用していない場合には、?config に関する これらのログフッタを によりオフにできるであろう。 ?config を行なう際に そのページについてのルールを作るか、 このページの中に次のようなタグを加えることにより ログフッターを非表示とすることができる。

<?setshowinfo(0)>


相対URLと絶対URL もしくは、なぜイメージファイルが表示されないのか?

全てのCGIラッパーに共通な問題の一つは、HTTPDプログラムが現在のディレクトリを ロードしているものが保存されているディレクトリに変えてしまうことである。 CGIプログラムの場合は、現在のディレクトリはCGIプログラムが置かれたディレクトリに セットされる。 このことは相対URL指定を受けた場合を除き通常問題とならない。

相対URLは、 現在のディレクトリが現在処理中のHTMLファイルが置かれているディレクトリと 同じであることを前提としたURLである。 つまり、例えば以下のようなURLがあったとする。:

    http://my.machine/~rasmus/file.html

実際のHTMLファイルは以下の場所にある。:

    ~rasmus/public_html/file.html

仮にファイル file.html中に次のようなタグがあったとする。:

    <IMG SRC="pic.gif">

正常に読み込まれた場合、この gif ファイルは ~rasmus/public_html/pic.gif にあると想定される。 しかし、次のようなURLのファイルがCGIラッパー経由で読み込まれたとすると、

    http://my.machine/cgi-bin/php.cgi/~rasmus/file.html

HTTPD は現在のディレクトリを /cgi-bin に (あるいは、ScriptAlias で指定した場所に)セットする。:

続いてこのページが読み込まれる際に、pic.gif ファイルは /cgi-bin/pic.gif にあるものと想定されるが、 これは通常望んだ結果ではない。

この問題の手っ取り早い解決手段は絶対URLを使うことである。 上記の例においてimageタグが次のようなものであった場合には、 何の問題も生じなかったであろう。:

    <IMG SRC="/~rasmus/pic.gif">

絶対URLを使用することはポータビリティを悪化させるため、 いつも望ましいわけではない。 この問題に関して次のような明白な疑問を生じるかもしれない。 「なぜ、PHP は正しい場所にカレントディレクトリを変えないのか?」 実際にはPHPはカレントディレクトリを表示中の HTML ファイルが ある場所に変えている、というのが答えである。 PHP スクリプトタグ中で用いられるあらゆるファイルパスは 相対表現とすることができる。 問題は、PHP による制御の範囲外にある <img > や <a href > のようなタグは、 PHP により処理されないということである。 これらが解釈される時、PHP はもはやアクティブではなく、 カレント作業ディレクトリはHTTP デーモンにより指定された ディレクトリに戻されている。

解決手段 は妥協策である。PHP は PATH_DIRという変数を提供する。 これは、現在処理中の HTML ファイルのディレクトリ部を常に保持している。 この PATH_DIR 変数を <img > や <a href > タグ に用いた場合、 サーバーが解釈する際には絶対URLのように見えるにもかかわらず、 相対URL を用いた場合と同様の効果が得られる。 上記の例において必要な変更点は img タグを次のように 変えることだけである。:

    <IMG SRC="<?echo $PATH_DIR>/pic.gif">
上記タグの使用により、このタグを含むファイルを移動することが 可能になる。 このタグは常に同じディレクトリにあるpic.gif ファイルを HTML ソースファイルとして参照する。

この問題に対する伝統的な別の解決策は、 <BASE HREF=...> タグをHTMLファイル中に 用いることである。


PHP における GET と POST メソッドの処理

PHP は、HTML フォームから送られる GET と POST メソッドの両方を 検出する。 理解しておかなければならない重要な点は、 両方が共に与えられた場合にはPOST メソッドによるデータが常に最初に処理される、 ということである。 ある PHP 変数が POST メソッドによるデータで定義されるか、 UNIX環境におけるHTTPデーモンによって定義される場合には、 GETメソッドによるデータはこれを上書きすることはできない。 これは、誰かが自分のURLに?REMOTE_HOST=some.bogus.hostと加えることにより、 こうした別のデータを記録するように PHP のログ機構を欺くことを防ぐためである。 しかし、POST メソッドによるデータはこれらの変数を上書きすることが可能である。

フォームにより作成される GET データの全ての構成要素(URL における '?' に続くデータ) はword=something という形式であり、 something という値を有する変数 $word を定義する。 データがこの形式でない時でも、組み込み配列 $argv によりアクセスすることができる。 例えば、次のようなURL:

    /cgi-bin/php.cgi/file.html?abc+def+EMAIL_ADDR=rasmus@lerdorf.on.ca&var=value
においてPHPシンボルテーブルにおける関連する構成要素は次のようになる。:

    $argc       = 4
    $argv[0]    = abc
    $argv[1]    = def
    $argv[2]    = EMAIL_ADDR=rasmus@lerdorf.on.ca&var=value
    $EMAIL_ADDR = rasmus@lerdorf.on.ca
    $var        = value

データ中の EMAIL_ADDR の部分が、解釈されていない状態で $argv[2] の中と、 rasmus@lerdorf.on.ca という値を有するように作成された変数 $EMAIL_ADDR の名前の 双方に現れている。

変数 $EMAIL_ADDR は、 PHP のログ機能を使っている場合には便利な変数であるので、 上記の例で用いた。 ユーザーの e-mail アドレスが既知であるようなページにおける リンクに次のように付け加えることにより、 次のページにそれを受け渡すことができる。:

    ?EMAIL_ADDR=

PHP ログ機能は自動的にこの変数を見つけてユーザーの e-mail アドレスとして 値を記録する。 PHP1 のユーザーにとっては、上記の記述は PHP1 において URL に ?<!--$email--> を加えることにより 行なわれてきたことと同じ機能を与えるものである。 現仕様は若干複雑になっているようであるが、複雑なページの構築が可能なように 完全に一般的になっている。

上記の例において、 GET メソッドによるデータにおいて "&" 文字 で区切ることにより、 複数の変数を定義する手法も見ることができる。 この "&" で区切られた変数のリストにおける定義を有効と するためには、GETメソッドデータの最後の(そして、唯一の) 構成要素でなければならない。

SELECT MULTIPLE と PHP

HTML における SELECT MULTIPLE タグはリストから複数の項目を選択可能にする。 これらの項目はフォームのアクションハンドラに渡される。 問題は、全て同じウイジェット名でそれらが渡されることである。 すなわち、

    <SELECT NAME="var" MULTIPLE>

選択されたオプションの各々は、アクションハンドラに次のような形式で 送られる。:

var=option1
var=option2
var=option3

各々のオプションは、以前の $var 変数の内容を上書きするであろう。 解決策は、PHP/FI の添字無配列機能を用いることである。 次のような記述を行なう必要がある。:

    <SELECT NAME="var[]" MULTIPLE>

これは、PHP/FI に対して var を配列として取り扱うように 宣言するものである。 オプションの各々の値の割付けはこの配列 var[] へ要素を付加すること  により行なわれる。

最初の項目は、$var[0]、次は $var[1] 等となる。 選択されたオプションの数を定義するために 関数 count() を用いることができる。 また、必要ならばオプション配列をソートするために 関数sort() を用いることができる。


イメージによる投稿 と PHP

フォームを投稿する時、通常の投稿(submit)ボタンの代わりに 次のようなタグによりイメージを用いることが可能である。:

    <input type=image src=image.gif name=sub>

ユーザーがイメージのどこかをクリックした時、 sub_xsub_yという2つの変数が付加されて 付随するフォームがサーバーに送られる。 この変数はユーザーがイメージ中でクリックした座標を保持している。 経験ある者は、 ブラウザから送られる実際の変数名はアンダースコアの代わりにピリオドとなる (sub.x,sub.y)というかもしれない。 しかし、PHP はこのピリオドを自動的にアンダースコアに変換する。


相対URLと絶対URL もしくは、なぜイメージファイルが表示されないのか?

全てのCGIラッパーに共通な問題の一つは、HTTPDプログラムがカレントディレクトリを ロードしているものが保存されているディレクトリに変えてしまうことである。 CGIプログラムの場合は、カレントディレクトリはCGIプログラムが置かれたディレクトリに セットされる。 このことは相対URL指定を受けた場合を除き通常問題とならない。

相対URLは、 カレントディレクトリが現在処理中のHTMLファイルが置かれているディレクトリと 同じであることを前提としたURLである。 つまり、例えば以下のようなURLがあったとする。:

    http://my.machine/~rasmus/file.html

実際のHTMLファイルは以下の場所にある。:

    ~rasmus/public_html/file.html

仮にファイル file.html中に次のようなタグがあったとする。:

    <IMG SRC="pic.gif">

正常に読み込まれた場合、この gif ファイルは ~rasmus/public_html/pic.gif にあると想定される。 しかし、次のようなURLのファイルがCGIラッパー経由で読み込まれたとすると、

    http://my.machine/cgi-bin/php.cgi/~rasmus/file.html

HTTPD はカレントディレクトリを /cgi-bin に (あるいは、ScriptAlias で指定した場所に)セットする。:

続いてこのページが読み込まれる際に、pic.gif ファイルは /cgi-bin/pic.gif にあるものと想定されるが、 これは通常望んだ結果ではない。

この問題の手っ取り早い解決手段は絶対URLを使うことである。 上記の例においてimageタグが次のようなものであった場合には、 何の問題も生じなかったであろう。:

    <IMG SRC="/~rasmus/pic.gif">

絶対URLの使用は、ポータビリティを悪化させるため、 いつも望ましいわけではない。 この問題に関して次のような明白な疑問を生じるかもしれない。 「なぜ、PHP は正しい場所にカレントディレクトリを変えないのか?」 実際にはPHPはカレントディレクトリを表示中の HTML ファイルが ある場所に変えている、というのが答えである。 PHP スクリプトタグ中で用いられるあらゆるファイルパスは 相対表現とすることができる。 問題は、PHP による制御の範囲外にある <img > や <a href > のようなタグは、 PHP により処理されないということである。 これらが解釈される時、PHP はもはやアクティブではなく、 カレント作業ディレクトリはHTTP デーモンにより指定された ディレクトリに戻されている。

解決手段 は妥協策である。PHP は PATH_DIRという変数を提供する。 これは、現在処理中の HTML ファイルのディレクトリ部を常に保持している。 この PATH_DIR 変数を <img > や <a href > タグ に用いた場合、 サーバーが解釈する際には絶対URLのように見えるにもかかわらず、 相対URL を用いた場合と同様の効果が得られる。 上記の例において必要な変更点は img タグを次のように 変えることだけである。:

    <IMG SRC="<?echo $PATH_DIR>/pic.gif">
上記タグの使用により、このタグを含むファイルを移動することが 可能になる。 このタグは常に同じディレクトリにあるpic.gif ファイルを HTML ソースファイルとして参照する。

この問題に対する伝統的な別の解決策は、 <BASE HREF=...> タグをHTMLファイル中に 用いることである。


GD (GIF生成のためのグラフィックライブラリ)のPHPでのサポ ート

PHPは、 Thomas Boutell氏が作成したGDバージョン1.2をサポートする。ただし、 PHPのパッケージにはGDのコードは含まれない。従って、PHPで、GDを使いたければ、 最初に、 http://www.boutell.com/gd/gd1.2.tar.Zを入手し、インストールした後、 再度、PHPをインストールする。

PHPはGDの全ての機能をサポートしない。PHPで利用できるGDの関数は、(後の) アルファベット順の関数リストに示してある。ここで使える全てのGD関数は、 Image という単語で始まる。 GDについて、さらに詳細が知りたければ下記にアクセスの事。 http://www.boutell.com/gd/

GD 1.2 is copyright 1994, 1995 Quest Protein Database Center, Cold Springs Harbor Labs.


PHP/FI と仮想ホスト

PHPは数種のHTTPサーバがサポートする仮想ホスト環境でも不都合なく動作する。 ひとつの問題は、仮想ホスト環境上ではHTTPDサーバが設定する環境変数 SCRIPT_NAME と矛盾を引き起こすかもしれない事である。 SCRIPT_NAME には、通常 HTTP サーバにおけるトップレベルルートディレクトリ ROOT_DIR から相対的に CGIプログラム のあるパスが設定される。 しかしながら、仮想ホストを利用する場合、いくつかの HTTP サーバは その仮想ホストの正しいトップレベルディレクトリからの相対パスとして 正確な SCRIPT_NAME 変数を設定することが出来ない。 もし、?configで出力されるメッセージに、Invalid URL というエラーがあれば、PHPのセットアップに問題があったことになる。 その場合は、php.hというファイル中を編集し、#define VIRTUAL_PATH で 定義されるパスを仮想ホストのトップレベルディレクトリから php.cgi への相対パスにセットする必要がある。


ファイルアップロード

PHP/FIは、ブラウザーからのファイルアップロードを自動的に検知する。 この機能は、フォームベースのファイルアップロード機能で、 Xerox の E. NebelL. Masinter により 提案された。 詳細は、RFC 1867 による。

ファイルをアップロードする画面は、下記のような特別なフォームを記述する 事で実現出来る。

<FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST>
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000">
Send this file: <INPUT NAME="userfile" TYPE="file">
<INPUT TYPE="submit" VALUE="Send File">
</FORM>

_URL_ は、PHPで書かれたHTMLファイルの場所を指す必要がある。 hidden フィールド MAX_FILE_SIZE は、file 入力フィールドの前に なければならない。 MAX_FILE_SIZEの値は、許容されるファイル容量の最大値をバイト単位で示した ものである。 受信側のファイルにおいては、支障なくファイルのアップロードを 行うために次の環境変数が定義されている。:

$userfile

サーバマシン上に格納されたアップロードファイルの一時的なファイル名。

$userfile_name

送り側のオリジナルのファイル名。

$userfile_size

アップロードされたファイルのバイト容量。

$userfile_type

ブラウザが生成するファイルの MIME TYPE。例えば、"image/gif"。

上記変数のうし、$userfile のファイル名の部分は、 アップロードフォームの NAME フィールドに一致する。

アップロードされたファイルはサーバのデフォールトの一時的なディレクトリーに 格納される。この場所は、PHP/FIが稼働する環境変数 TMPDIR の設定により 変更出来る。PHP/FI スクリプトの中で PutEnv()関数を使用して設定変更しても うまくいかない。もしくは、php.h を編集し、 UPLOAD_TMPDIR 変数の定義を埋め込むことも可能である。

アップロードファイルを受け取る PHP/FI スクリプトは、 アップロード時に行ったことを把握するために必要な 論理的手段を用意すべきである。例えば、小さすぎたり、大きすぎたりした 任意のファイルを破棄するために $file_size という変数を使用できる。 また、$file_type という変数を使って、正しくない型のファイルを破棄する ことも可能である。 どのような論理的手段を用いた場合でも、アップロードされたファイルは 一時的なディレクトリから消すか他の場所へ移動すべきである。

CERN HTTPD は、クライアントから送られたファイルの content-type mime ヘッダーにおいて空白文字で始まる行を全て削除するということに注意されたい。 この様な仕様である限り、CERN HTTPD においてファイルアップロード機能はサポート されないであろう。


クッキー(Cookie)のサポート

PHP/FI は Netscape's Spec に定義される HTTP クッキーを透過的にサポートする。 クッキーは、リモートブラウザにデータを保持する仕組みである。 これにより、再訪したユーザーの追跡や特定を行なう。 SetCookie() 関数を用いて、クッキーをセットすることができる。 クッキーはHTTPヘッダーの一部であるので、 SetCookie() 関数は他の出力がブラウザに送られる前に呼ばれなければならない。 この制約は Header() 関数と同様のものである。

クライアントからサーバーに送られるクッキーは、 GET や POST メソッドによるデータと全く同様に 自動的にPHP/FI 変数へ変換される。

一つのクッキーに複数の変数を割り付けたい場合には、 クッキーの名前に [] を加えるだけで良い。 例えば、:

    SetCookie("MyCookie[]","Rasmus Lerdorf", time()+3600);
パスやドメイン名が異なっていない場合には、 クッキーはブラウザにおける同じ名前の以前のクッキーを置き換える。 ショッピングカートのアプリケーションにおいては、 カウンタとカートに入れられたものを保持したいと思うだろう。 すなわち、

    
    $Count++;
    SetCookie("Count",$Count, time()+3600);
    SetCookie("Cart[$Count]",$item, time()+3600);

mSQL サポート

mini-SQL を意味する mSQL は、David Hughes により作られた 小型でかつ簡易な SQL データベースエンジンである。 この mSQL は、 ftp://ftp.bond.edu.au/pub/Minerva/msql より入手可能である。

PHP/FI は多くの mSQL サポート用関数を有している。

msql()
msql_Close()
msql_Connect()
msql_CreateDB()
msql_dbName()
msql_DropDB()
msql_FieldFlags()
msql_FieldLen()
msql_FieldName()
msql_FieldType()
msql_FreeResult()
msql_ListDBs()
msql_Listfields()
msql_ListTables()
msql_NumFields()
msql_NumRows()
msql_RegCase()
msql_Result()
msql_TableName()

これらの関数に加えて、PHP/FI においては GET もしくは POST データ中の前方引用付( ' )を 自動的にエスケープするようにコンパイルすることができる。 MAGIC_QUOTES 変数を php.h ファイル中で定義した場合には、 これらの引用付は自動的にエスケープされるので、 データを直接 msql クエリーに渡すことが容易になる。


Postgres95/PostgreSQL サポート

Postgres95/PostgreSQL は、SQL 言語の主要部分を実装した強力な public domain の データベースであり、mSQL において使用できない多くのデータ型とコマンド をサポートしている。 Postgres についての詳細な情報とソフトウエア自体は次のURLで 見つけることができる。: http://www.postgreSQL.org/

次の PHP 関数が Postgres95/PostgreSQL 用に使用可能である。:

pg_Connect()
pg_Close()
pg_Host()
pg_Port()
pg_Options()
pg_tty()
pg_DBname()
pg_Exec()
pg_Result()
pg_FreeResult()
pg_GetLastOid()
pg_NumRows()
pg_NumFields()
pg_FieldNum()
pg_FieldName()
pg_FieldType()
pg_FieldSize()
pg_FieldPrtLen()
pg_errorMessage()

注意: バイナリカーソルはサポートしていない。

これらの関数に加えて、PHP/FI においては GET もしくは POST データ中の前方引用付( ' ) または、引用符( " )を 自動的にエスケープするようにコンパイルすることができる。 MAGIC_QUOTES 変数を php.h ファイル中で定義した場合には、 これらの引用付は自動的にエスケープされるので、 データを直接 Postgres クエリーに渡すことが容易になる。

以下に localhost 上の 'mydb' というPostgres データベースと接続し テーブル中の人の名前と年齢を引き出す サンプルスクリプトを示す。:

<?
   $conn = pg_Connect("localhost", "5432", "", "", "mydb");
   if (!$conn) {
      echo "An error occured.\n";
      exit;
   }

   $result = pg_Exec($conn, "select * from table1");
   if (!$result) {
      echo "An error occured.\n";
      exit;
   }

   $num = pg_NumRows($result);
   $i = 0;

   while ($i < $num) {
      echo "name: ";
      echo pg_Result($result, $i, "name");
      echo "  age: ";
      echo pg_Result($result, $i, "age");
      echo "<BR>";
      $i++;
   }

   pg_FreeResult($result);
   pg_Close($conn);
>


mysql サポート

mysql は、mSQL パッケージのクローンである。 http://www.tcx.se/から コピーを手にいれることができる。

PHP/FI においては、多くの mysql 関数がサポートされる。:

mysql()
mysql_Close()
mysql_Connect()
mysql_CreateDB()
mysql_dbName()
mysql_DropDB()
mysql_FieldFlags()
mysql_FieldLen()
mysql_FieldName()
mysql_FieldType()
mysql_FreeResult()
mysql_ListDBs()
mysql_Listfields()
mysql_ListTables()
mysql_NumFields()
mysql_NumRows()
mysql_Result()
mysql_TableName()

これらの関数に加えて、GET もしくは POST データに含まれる前方引用符を 自動的にエスケープするようにコンパイルすることが可能である。 MAGIC_QUOTES 変数が、php.h ファイルにおいて定義される場合には、 これらの前方引用符は自動的にエスケープされるので、 mysql クエリーに直接データを渡すことが容易になる。


Solid サポート

Solid サーバーは、多機能な SQL サーバーである。ANSI SQL2、ODBC、 SAG CLI、X/Open SQL 標準をサポートする。 Solid サーバーに関するより詳しい情報は、 www.solidtech.com で手にはいる。 PHP 用 Solid インターフェースは、 DigiFace Internet Services により 開発されたものである。

次のPHP 関数が Solid サーバーについて使用可能である。:

Solid_Connect()
Solid_Close()
Solid_Exec()
Solid_Result()
Solid_FreeResult()
Solid_NumRows()
Solid_NumFields()
Solid_FieldNum()
Solid_FieldName()

これらの関数に加えて、GET もしくは POST データに含まれる前方引用符を 自動的にエスケープするようにコンパイルすることが可能である。 MAGIC_QUOTES 変数が、php.h ファイルにおいて定義される場合には、 これらの前方引用符は自動的にエスケープされるので、 Solid クエリーに直接データを渡すことが容易になる。

以下に、Postgres の節において用いたのと同じ例をSolid サーバー用にした ものを示す。

<?
   $conn = Solid_Connect("", "username", "password");
   if (!$conn) {
      echo "An error occured.\n";
      exit;
   }

   $result = Solid_Exec($conn, "select * from table1");
   if (!$result) {
      echo "An error occured.\n";
      exit;
   }

   while (Solid_FetchRow($result)) {
      echo "name: ";
      echo Solid_Result($result, "name");
      echo "  age: ";
      echo Solid_Result($result, "age");
      echo "<BR>";
   }

   Solid_FreeResult($result);
   Solid_Close($conn);
>


Sybase サポート

サポート関数は、Sybase DB のライブラリ API コールを使用する。 したがって、sybase サポートを有効にして PHP/FI をコンパイルするためには、 sybase API ライブラリとヘッダーファイルがシステムにインストールされている 必要がある。

次の PHP/FI 関数がSybase 用に使用可能である。

SybSQL_CheckConnect()
SybSQL_Connect()
SybSQL_DBuse()
SybSQL_Exit()
SybSQL_Fieldname()
SybSQL_GetField()
SybSQL_IsRow()
SybSQL_NextRow()
SybSQL_NumFields()
SybSQL_NumRows()
SybSQL_Query()
SybSQL_Result()
SybSQL_Result_All()
SybSQL_Seek()

完全な例については、以降の例 sybSQL_Result() 関数を参照のこと。

Oracle サポート

Oracle 用 PHP/FI インターフェースは、Oracle Call Interface (OCI) を使用する。 PHP/FI をOracle サポート付きでコンパイルするためには、 システム上に OCI ライブラリが必要である。

次の PHP/FI 関数が Oracle 用に利用可能である。

Ora_Bind()
Ora_Close()
Ora_Commit()
Ora_CommitOff()
Ora_CommitOn()
Ora_Exec()
Ora_Fetch()
Ora_GetColumn()
Ora_Logoff()
Ora_Logon()
Ora_Open()
Ora_Parse()
Ora_Rollback()

PHP/FI Oracle アプリケーションの例を次に示す。

<?
PutEnv("ORACLE_HOME=path_to_your_oracle_home"
PutEnv("ORACLE_SID=database"
  
/* Establish a connection between PHP and Oracle. */
$conn = Ora_Logon("username" "password"
  
if ($conn < 0) {
    echo("Could not connect to Oracle.\n"
    exit;
}

/* Open a cursor in Oracle. */
$cursor = Ora_Open($conn);

if ($cursor < 0) {
    echo("Could not open a cursor.\n"
    Ora_Logoff($conn);
    exit;
}

/* Turn off autocommit. */
Ora_CommitOff($conn);

/* This is the SQL query. */
$query = "SELECT * FROM some_table"

if (Ora_Parse($cursor, $query) < 0) {
    echo("Parse failed!\n"
    Ora_Logoff($conn);
    exit;
}

/* Execute the SQL statement associated with $cursor and
   prepare storage for select-list items. */
$ncols = Ora_Exec($cursor);
 
echo "lt;P>\n"
echo "lt;TABLE BORDER=1 CELLSPACING=0>\n"

/*  Retrieve all rows from the database one after another. */
while (Ora_Fetch($cursor) == 1) {
    $i = 0;
    echo "lt;TR>\n"
    while ($i < $ncols) {
     /* Get data for a single column of currently fetched row. */
     $col = Ora_GetColumn($cursor, $i);
        echo("lt;TD>$col</TD>\n"
     $i++;
    }
    echo("lt;/TR>\n"
}

echo "</TABLE>\n";

/* Close the Oracle connection. */
Ora_Close($cursor);
 
/* Disconnect the logon data area. */
Ora_Logoff($conn);
>


Informix Illustra サポート

Illustra はInfomix により買収されたデータベース製品である。 幾つかの機能は、本インターフェースで(まだ)サポートされていない。 Illustra の優れた主な特徴は、オブジェクト指向により拡張可能な オブジェクトリレーショナルデータベースであることである。 例えば、データベース内に基本型としてイメージ型を作成することが可能である。 より、詳しいj情報は、 illustra ホームページ より得ることができる。

次の PHP 関数が Illustra 用に利用可能である。:

mi_Connect()
mi_Close()
mi_DBname()
mi_Exec()
mi_Result()
mi_NumRows()
mi_NumFields()
mi_FieldNum()
mi_FieldName()

注意: 型の演算は、まだサポートされていない。

以下にローカルホストの 'mydb' という名前の illustra データベースに接続し、 テーブルから人の名前と年齢を得るスクリプトを示す。:

<?
   $conn = mi_Connect("mydb", "username", "password");
   if ($conn<0) {
      echo "An error occured on connection.\n";
      exit;
   }

   $result = mi_Exec($conn, "select * from table1");
   if ($result < 0) {
      echo "An error occured.\n";
      exit;
   }

   $num = mi_NumRows($result);
   $i = 0;

   while ($i < $num) {
      echo "name: ";
      echo mi_Result($result, $i, "name");
      echo "  age: ";
      echo mi_Result($result, $i, "age");
      echo "<BR>";
      $i++;
   }

   mi_Close($conn);
>


Adabas サポート

Adabas D は、多くのプラットフォームで利用可能な先進的 RDBMS である。 パーソナル版という名前の特別なバージョンは、 Linux用と Win32用のものが無償で手に入る。 この版は、同時5ユーザーと100MBのデータに制限されている。 Adabas D に関する更に詳しい情報は、 http://www.softwareag.comを 参照されたい。

次の PHP 関数が、Adabas データベースにアクセスするために 利用可能である。:

Ada_Connect()
Ada_Close()
Ada_Exec()
Ada_Result()
Ada_ResultAll()
Ada_FreeResult()
Ada_NumRows()
Ada_NumFields()
Ada_NumRows()
Ada_NumFields()
Ada_FieldNum()
Ada_FieldName()
Ada_FieldType()
以下に Postgres と Solid の節で示したのと同じスクリプトを Adabas D 用に修正したものを示す。

<?
   $conn = Ada_Connect("node:db", "username", "password");
   if (!$conn) {
      echo "An error occured.\n";
      exit;
   }

   $result = Ada_Exec($conn, "select * from table1");
   if (!$result) {
      echo "An error occured.\n";
      exit;
   }

   while (Ada_FetchRow($result)) {
      echo "name: ";
      echo Ada_Result($result, "name");
      echo "  age: ";
      echo Ada_Result($result, "age");
      echo "<BR>";
   }

   Ada_FreeResult($result);
   Ada_Close($conn);
>


正規表現

正規表現は PHP/FI において複雑な文字列操作に用いられる。 次の関数を通じてスクリプトインターフェイスは正規表現をサポートしている:
EReg(), ERegi(), EReg_Replace(), ERegi_Replace(), Reg_Match(), Reg_Replace(), Reg_Search()
全ての関数に対する最初の引数(argument)は正規表現文字列である。 EReg 関数は POSIX 1003.2 で定義された Posix 拡張正規表現を使っている。 一方、 Reg 関数は基本的な正規表現を実装している。 正規表現についての詳細は、man の regex(7) を参照のこと。 このページが無い場合には、Henry Spencer により書かれた regex(7) の man ページが PHP/FI ディストリビューションの src/regex ディレクトリにある。 システム管理者にこの man ページをインストールするように頼むこと。

正規表現とその動作についての例を以下に挙げる。

ereg("abc",$string);
$string の中で "abc" を見つければ真( true ) を返す。

ereg("^abc",$string);
$string の最初に "abc" を見つければ真( true ) を返す。

ereg("abc$",$string);
$string の終わりに "abc" を見つければ真( true ) を返す。

eregi("(ozilla.[23]|MSIE.3)",$HTTP_USER_AGENT);
クライアントのブラウザがNetscape 2, 3 あるいは MSIE 3であれば真( true ) を返す。

ereg("([[:alnum:]]+) ([[:alnum:]]+) ([[:alnum:]]+)",$string,$regs);
空白で分離される3つの単語を $regs[1], $regs[2] と $regs[3] に代入する。

ereg_replace("^","<BR>",$string)
$string の始めに <BR> タグを入れる。

ereg_replace("$","<BR>",$string)
$string の終わりに <BR> タグを入れる。

ereg_replace(10,"",$string);
$string の中の全ての復改文字( LF )を取り除く。

ereg_replace(13,"<BR>",$string);
$string の中の全ての改行文字( CR )を <BR> tag で置き換える。


エスケープ キャラクター

次のエスケープシークエンスは前方引用符で囲われた文字列引数が 使われるほとんどのところでサポートされている。

	\a --> bell(ベル)
 	\b --> backspace(バックスペース)
 	\n --> linefeed(ラインフィード)
 	\r --> carriage return(改行)
 	\t --> tab(タブ)
 	\nnn --> octal char(8進数を表現する文字)
 	\xXX --> (16進数を表現する文字)


UNIX ファイル許可属性の8進表記

PHP/FI スクリプト言語のいくつかの関数は、UNIX 形式の許可属性パラメータを 定義するために8進表記を要求する。 この8進表記においては、0-7の値を表わすために3ビットが用いられる。 3つの各ビットは、特定の許可属性を表わす。 8進数は、従来より 0755 のように 0で始まる数で記述されてきた。 PHP においては、 8進数パラメータを要求する関数はパラメータが8進数であると単純に仮定するので、 この先頭の 0 は必要ない。 しかし、先頭に 0 を付けることは、10進数を処理していないことを自覚するため の良い練習となる。

ビット表記

    xxx
    ^^^
    ||+----1 bit (実行許可)
    |+-----2 bit (書き込み許可)
    +------4 bit (読み出し許可r)
これらの3ビットは、所有者、グループ、全ての人に関して3回繰り返される。 つまり、0755 は以下を意味する。
    owner: r,w,x
    group: r, ,x
    world: r, ,x
ディレクトリの実行ビットは、'アクセス'を意味し、'実行'を意味しないことに 注意されたい。 0?755 のような4番目の8進数ニブル(半ワード)に拡張ビットも存在する。 つまり、
    4: suid ビット   (userid をセット)
    2: sgid ビット   (グループ id をセット)
    1: sticky ビット (あるディレクトリにおいてその所有者のみが、ファイルを消去できる。)


PHP/FI スクリプト言語

PHP スクリプト言語は多くの場合 C 言語の構文に似ている。 変数、配列、関数の呼び出し、異なる変数の型、そして cgi プログラムを 書くために必要なほとんどのものがサポートされている。

各々の PHP/FI 関数は次項で説明されている。 各関数の説明にはその名前でタグが付けてあるので、 このドキュメントの URL に #関数名 を付加することにより 容易に見つけることが可能であろう。

構文

それぞれの PHP 命令は

 で始り、
>
で終わる。 あるいは、PHP 命令を一組の
によりグループ化し、
;
文字で分割しても良い。

変数はサポートされており、変数名の前に $ を 付けることにより定義される。 例えば、変数に 5 をセットし、それからこの変数を表示するには 次のように書くのが正しい書き方である。

	<?$a = 5>
	<?echo $a>

以下のように書いても同じである。

	<?; $a = 5; echo $a >

また、これも同じ意味である。

	<?;
	$a = 5;
	echo $a;
	>

スペース、タブや改行のような余分な空白文字は無視される。 このため、PHP スクリプトのブロックをフォーマットして 読みやすくする為に空白文字を用いることができる。 変数においては大文字小文字は区別されるが、関数の呼び出しに おいては区別されない。 後述する関数の概要において、大文字小文字の区別は関数名を読みやすくする 為だけに使われている。 実際のスクリプトにおいては、大文字、小文字の好きな方を用いて良い。

コメントもサポートされている。コメントは C 言語のコメントと全く同様に書くことが出来る。

/*
で始り、
*/
でコメントを終わる。コメントは
ブロックの中のどこに置いても構わない。

変数

3種類の変数がサポートされている。 すなわち、ロング整数型倍精度浮動小数型文字列型である。 これらは自動的に検出される。例えば、:

	<?$a = 5>

ここで $a はロング整数型の変数である。

	<?$a = 5.0>

この時、$a は倍精度実数型である

	<?$a = "5">

この時、$a は文字列型である。

変数の型はあまり重要ではない。あらゆる変数はその型にかかわらず内部で すべて3つの型に変換され、様々な関数は正しい型を使おうとする。 2,3の関数だけが変数の型に影響される。

3つの変数型はその名前に [値]を付けることで すべて配列として扱うことも出来る。 C 言語とは異なり、それらは Perl で使うのと同様に実際には連想配列である。 次のように書くのが正しい:

	<?
	  $a[0] = 5;
	  $a["hello"] = 6;
	  echo $a[0];
	  echo $a["hello"];
	>

以下の点に注意すること。 ある変数名が配列と普通の変数と両方で使われる場合には、 普通の変数は配列中では添字"0"の要素を登録することと同じ事を意味する。 例えば、

    $a = 1;

は次のように書かれるのと同じである。

    $a[0] = 1;

PHP/FI は添字無し配列もサポートしている。 添字無し配列においては、要素が追加された時に独自に添字が作成される。 例えば、:

    $a[] = "Hello";
    $a[] = "There";

添字無し配列に代入された最初の要素は、常に添字 0 を割り当てられる。 2番目は添字 1 である。よって、先の要素は次のように出力される。

    echo $a[0];
     echo $a[1];
  

配列は、簡単な割り付けによりコピーすることができる。 $b が配列である場合、次のように入力することにより、 全ての値を $a という名前の新しい配列にコピーすることができる。:

    $a = $b;

PHP は変数を使用する前にその変数を定義することを強制しない というのは、必ずしも望ましいことではない。 上記の命令において、$b が未定義の場合、$a は空の文字列("") にセットされる。

追加されるのが配列であることを示すために [] 記法も用いられる。 $a と $b が共に配列である場合に、次のように入力することにより、 $b を $a に追加することができる。:

    $a[] = $b;

上の例では、連想配列と通常の番号をふられた配列の間に差が生じる。 番号をふられた配列の場合は、$b からの全ての要素が $a からの元の要素に 続くように番号がふりなおされる。 一方、連想配列においては $b の要素は、$a の要素に取り込まれる。 $a に既に存在する全ての要素(同じ項目名を有する項目)は、 $b の要素で上書きされる。

配列の要素数を定義するために count() 関数 を使うことが出来る。

言語の本質的な事実でもあるが、変数の型はある基本的な動作が どのように実行されるかで決められる。例えば、:

    $a = $b + $c;

は一連の異なった操作を行なう。$b が数字である場合には、数値 $c は $b に加算され、合計が $a に代入される。この場合、$c の型は動作に 無関係である。 操作は最初の変数の型で支配される。$b が文字列ならば、文字列として $c の値が $b に加えられ、最終的な文字列が $a に代入される。 これらの処理においてはいくつか注意すべき点がある。 これらの処理についてより深く理解するには、 演算子の多重定義の項を参照のこと。


連想配列

先ほどのセクションで連想配列を紹介した。連想配列は添字が連続した 数値である必要の無い配列である。 配列の添字はいかなる数でも文字でも良い。 PHP/FI はこれらの連想配列を上手く処理するために一連の関数を用意している。 その中には Next()Prev()Reset()End()Key()を含む。


可変変数

可変変数名を使う事が便利な時がある。それは、宣言し使われている変数名が 動的に扱われるときである。通常の変数は次のように宣言される。

    $a = "hello";

可変変数は変数の値を持ち、さらに変数名としても扱われる。 上の例では、hello は2つの $ を使って変数名と しても使う事が出来る。例えば、

    $$a = "world";

この時2つの変数が定義され、 PHP/FI のシンボルツリーに保存されている。

    Variable Name        Variable Content
         a                   hello
         hello               world

さらにこの文は

    echo "$a $$a";

以下とまったく同じ出力をする。

    echo "$a $hello";

すなわち、両方とも次のように出力される。 : hello world


言語構造

言語構造に関する限り、 PHP 言語は非常に単純である。 次のコマンドはファイルの中で制御フローを導くのに使われている。

条件構文は C 言語と似ている。 == は等しいことをテストする。 != は等しくないことを表わす。 また次のものもサポートしている。 ><>=<=。条件の積 (AND) は &&、 条件の和 (OR) は ||である。

例えば、

    <?
      if($a==5 &&  $b!=0 );
        $c = 100 + $a / $b;
      endif;
    >

上の例は以下のように標準的な C の構文で書くこともできる。
この場合、閉じるのに使われている大括弧の後のセミコロンは必要ない。

    <?
      if($a==5 && $b!=0) {
          $c = 100 + $a / $b;
      }
    >

2つの構文に違いはない。私は個人的に endif、 endswitch や endwhile を 使うのが好きなので、閉じる時には常に自明な方法を用いる。 しかし、これらの閉じるための構造を大括弧で置き換えることも出来る。

以下の点に注意すること。 言語処理の流れは、コードの中のスクリプトブロックの形態に依存していない。 1つのブロックの中で if で始まり、他の表現で終わることも出来る。例えば、

	<?if($a==5 &&  $b!=0)>
		  <b>Normal html text</b>
	<?endif>

この例では閉じる大括弧の代わりに endif を使うことが非常に 好ましい時がある事が容易に理解できる。上の例は次の例よりはるかに読みやすい。

	<?if($a==5 &&  $b!=0) {>
		  <b>Normal html text</b>
	<? } >

どちらの例も正しく、同じ事を行う。


ユーザ定義関数

次の文章のように PHP スクリプト中で関数を定義出来る。

    <?
      Function Test (
        echo "This is a test\n";
      );
    >

この関数は定義した後ではスクリプト中のどこででも呼び出すことが出来る。 例えば、

    <?
      Test();
    >

この様なユーザが定義した関数は、PHP の内部関数と全く同じように働く。 内部関数と同様に、関数に引数を渡し関数から値を返す事が可能である。 以下は 3つの引数を取り、それらの引数の合計を返す関数の定義である。

    <?
      Function Sum $a,$b,$c (
        return($a+$b+$c);
      );

      echo Sum($a,$b,$c);
    >

return は関数から一つの値を返すのに使われる。 この方法により返すことができる値は一つだけである。 メインコードと関数の間でより多くの値を受け渡す必要がある場合には、 グローバル変数を用いることができる。 このことに関しては次項の「変数の範囲」でも説明する。


変数の範囲

変数の範囲はそれが定義されている文脈の中である。 大部分の PHP/FI の変数は単一の範囲を持つだけである。 しかし、ユーザ定義関数の中では、ローカルな関数範囲が使われる。 関数の内部で使われる変数はデフォルトでローカルな関数範囲に制限されている。 例えば、

    $a=1; /* global scope */
    Function Test (
      echo $a; /* reference to local scope variable */
    );
    Test();

このスクリプトは全く出力をしないであろう。これは、echo 文が $a 変数のローカル版を参照しており、この範囲内では値が 割り付けられていないためである。 C 言語においては、ローカル変数の定義により上書きされない限り グローバル変数を関数内部において自動的に使用することができる。 しかし、上記の動作はこれとやや異なっているということに必要である。 この方法では、 グローバル変数の値が誤って変更されるという問題を生じる可能性がある。 PHP/FI においては、関数で使用される全てのグローバル変数は 関数の内部で global として宣言されなかればならない。 例えば、

    $a=1;
    $b=2;
    Function Sum $first,$second (
      global $a,$b;

      $b = $a + $b;
    );
    Sum();
    echo $b;

上のスクリプトは "3"を出力する。 $a and $b を関数内でglobal 宣言することにより、各々の変数への全ての参照は グローバル変数を参照する。 関数によって処理されるグローバル変数の数に制限は無い。 しかし、変数は関数が呼ばれるよりも前のグローバルな範囲になければならない。 関数の中で新しいグローバル変数を作ることは出来ない。

一方、「変数範囲」で重要な特徴は スタティック 変数である。 スタティック変数はローカルな関数の範囲内でのみ存在するが、 プログラムの実行がこの範囲を離れてもその値を失わない。 次の例で考えてみよう。

    Function Test (
      $a=0;
      echo $a;
      $a++;
    );

この関数は全く役に立たない。何故ならば関数が呼ばれたときは常に $a に 0 を代入し、 "0" を出力するからである。 変数を増加させる $a++ は関数が存在するとすぐに $a 変数がなくなるので 意味がない。 現在のカウントを失わないような役に立つ数を数える関数を作るには、 変数 $a をスタティックに宣言する。

    Function Test (
      static $a=0;
      echo $a;
      $a++;
    );

Test() 関数が呼ばれるときは常に $a の値を出力してその数を増やす。

関数が再帰的に呼ばれる時にもスタティック変数は重要である。再帰的関数は 自分自身を呼ぶような関数である。 再帰的関数を書いている時には充分注意するべきである。 何故ならばそれがいつまでも再帰するように出来るからである。 再帰が適切に終わるようにしなければならない。 次の簡単な関数は10まで再帰的にカウントする。

    Function Test (
      static $count=0;

      $count++;
      echo $count;
      if($count <  10) {
        Test();
      }
    );


数学的表現

PHPは式が求められる全ての場所で完全な数学的演算をサポートする。 演算子の順番は考慮される。次のものは有効な演算子である:

	<? $a = 2 + 1 > 足し算
	<? $a = 2 - 1 > 引き算
	<? $a = 2 * 1 > かけ算
	<? $a = 2 / 1 > 割算
	<? $a = 2 % 1 > 剰余
 	<? $a = 2 ^ 1 > ビット毎の排他的OR

括弧での括りと演算子の順番はどちらもサポートされる。 よって、次のものは有効である:

	<?$a = (2+1)*3+6/3>

C言語ライクなインクリメント演算子 +=-= がサポートされる。

すなわち

    <? $a += $b>

これは、次と同義である:

    <? $a = $a + $b>

C言語に似たビット演算子 &=|=^= がサポートされる。 すなわち

    <? $a &= 4>
これは、次と同義である:

    <? $a = $a &  4>


While ループ

PHPスクリプト中で while(); endwhile; 構文によるループが使用できる。

	<?
	  $a=0;
	  while($a<100) {
		  $a++;
		  echo $list[$a];	
	  } 
	>

上記は配列の内容を表示する while ループの使用例である。 注意 PHP言語は ++-- のような変数を加算減算するインクリメント演算子をサポートするが、 C言語のように厳密に扱われることはない。変数は即座にインクリメントされる。 C言語にみられるように、操作の前または後で変数をインクリメントする概念はない。

上記の言語構造の項で述べたように、 while(); endwhile; についても同様のことが可能である。


Switch 構造

PHPはC言語と良く似た switch 構造をサポートする。

	<?
	  $a=0;
	  switch($a) {
		case 1;
		  echo "a is 1";
		  break;
		case "hello";
		  echo "a is hello";
		  break;
		default;
		  echo "a is unknown";
		  break;
	  } 
	>

上記は switch 構造の例である。これは一連の if/elseif/else 構造に似ているが、 より読みやすいものである。C言語とPHPとの switch 構造の違いは、 各行を区切るためにコロン(:)ではなくセミコロン(;)が用いられていることである。

上記の言語構造の章で述べたように、 switch(); endswitch; を用いても同様のことが可能である。

これら全ての構造はもちろん、C言語と同様にネストして使用できる。 PHP配布パッケージの examplesディレクトリーにある様々なファイルが、 この言語を学ぶための良いスタート地点を提供するであろう。


安全な変数 - GET メソッドのハッキング防止

前項では GET と POST のメソッドのデータと変数について述べた。 これについて考えてみると、セキュリティーに関する問題を想像できる であろう。 例えば、ウェブのページでデータベースからあるデータを入手し、このデータを "data"という変数に入れて POST メソッドのフォームから送ったとする。 その次のページでこの変数にアクセスし、それを使って何かをすることができる。 しかし、この2番目のページに直接アクセスし "?data=something"を URLに付け足すことにより GET メソッドの変数をセットした場合には、 元の POST メソッドを効果的に回避することが可能である。

PHPは、変数名を安全な変数(secure variable)として指定する SecureVar()関数を提供する。 これらの安全な変数は、PHP スクリプトの中で直接値をセットする ことのみが可能である。 もしくは、POST メソッドのフォームから値を得ることが可能である。 この変数は GET メソッドによる変数定義の機構を使用してはセットできない。 上記の記述をもとに、次の行を実行する。:

    <?SecureVar("data")>

これを二つめのページの始めに置くことにより、GET メソッドにおけるトリックは 機能しなくなる。"data"という変数は、最初のページの POST メソッドのフォームから直接来ない限り、空の状態になる。

SecureVar()は、実際は正規表現を引数としてとるため、 安全な方法で扱いたい変数の名前のパターンを指定することができる。 例えば、

    <?SecureVar(".*data.*")>

は、"data"という語をその名前の中のどこかに含む全ての変数を指定する。

気をつけなければいけないのは、POSTメソッドは本質的に安全ではないという 点である。 システムのHTTPポートに単に telnet することで、 疑似的にフォームのデータの転送をすることができるのである。 実際にセキュリティが重要である場合には、このようなことが行なわれないように 適当なセキュリティチェックを行なう必要がある。


演算子のオーバーロードと変数の型の扱い

オーバーロードされた演算子とは、例えば'+'のように、演算する式の型によって 違ったことのできる演算子である。

問題は、PHPが三つの変数の型を理解することである。 整数(Integer)、倍精度小数(Double)、文字列(String)がそれである。 変数が最初に割り付けられた時にPHPは自動的に変数の型を判定する。

すなわち、

    $a = 1;     型は整数(integer)になる
    $b = 1.5;   型は倍精度小数(double)になる
    $c = "1";   型は文字列(string)になる

それでは、次のようにした場合どのようなことが起こるであろうか:

    $d = $a + $c;

構文解析は最初の算術式を見て、結果と、成すべき計算の種類の型を 決めるために使用する。上記の例では $a が整数(integer)であるため、 $d は整数(integer)に、そして整数の足し算が結果として行なわれる:

    $d = 2      型は整数である

従って:

    $d = $c + $a

の結果は:

    $d = "11"   型は文字列である

上の事項は私にとって理にかなっており、一度理解すれば実用になるであろう。 しかし、さらに複雑な式が使われた時、極端に混乱を招くものとなり得る。

解決方法は、単純な型キャストのメカニズムである。

実際、全ての変数は自動的に三つの全ての型に変換され、 内部的なフラッグがその変数が現にどの型なのかを示しているのである。 つまりいうなれば:

    $a = 1;

内部的に記号表(symbol table)には三つのバージョンで保存されている。

    Integer:  1    <--- ここをフラッグが指している
    Double :  1.0
    String :  "1"

SetType()関数は、この変数の型を示すフラッグを動かすことができる。

    SetType($a,"double");

これは、$a を倍精度小数(double)として、これから後強制的に扱うようにする。

GetType()関数は型を返す。 この例でGetType()は、"double"を返す。

型のフラッグを動かさずにいろいろな三つの型を返す関数も存在する。

    IntVal($a)     returns  1
    DoubleVal($a)  returns  1.0
    StrVal($a)     returns  "1"

これは、PHP変数のオーバーロードされた演算子の本質を変えることはないが、 それらをよりうまく扱うためのツールを提供する。PHPは一人前のPerlもどきではない。 小さく速くなくてはならない。Perlはオーバーロードされた演算子の落とし穴 を扱うのに、'+'の様な演算子は強制的に数字のみに働くようにする。 もし文字列を加えたいならば、'.'演算子を使わなければならない。 各々の型別に別れた演算子を持ち始めると、その言語をますます複雑なものと することになる。すなわち、'=='を文字列に使うことができず、 'eq'を使うことになる。 こういったことは、 特にPHPの様にほとんどのスクリプトがどちらかといえば単純で、 多くの場合あまり学習曲線の高くない基本的な論理的構文の言語を求める プログラマーでない人々が書くような言語においては意味があることとは思えない。


関数呼び出し時のエラー抑制

特定のPHP関数からの致命的なエラーを無視することが望ましい場合もある。 例えば、dbmopen() の呼び出しのエラーを無視して、ウェブの画面にエラー メッセージを出すことなしに、単に戻り値をチェックしたいとする。 これは、"@"文字を関数の前に置くことで実現できる。 すなわち

    $err_code = @dbmopen($filename,"w");

出力された実際のエラーメッセージは、PHPの内部変数である $phperrmsgを見ることでチェックできる。

より一般的なエラーメッセージ表示の抑制方法は、 SetErrorReporting()関数を使うことである。 この関数を用いて、全てのスクリプトコードのブロックで、次のような呼び出しを 含むブロックを前に置くことで、その後のエラーの表示を不能にすることができる:

    SetErrorReporting(0);

これは、全てのエラー表示を消す。再度表示可能にするには以下のようにする:

    SetErrorReporting(1);


内部関数

PHPには多くの組み込み関数がある。関数の呼び出しは C言語のものと 同じ方法が用いられる。 一つあるいは複数の引数を取るものもあり、 変数に格納したり他の関数の引数にするための戻り値を返すものもある。 例えば:

	<?$t=time()>

これは time()関数の戻り値を変数tに代入する。


関数のアルファベット順リスト

Abs(引数)

Abs は引数の絶対値を返す。

Ada_Close(接続ID)

Ada_Close は、指定された接続IDに関連する Adabas サーバーへの接続を閉じる。

この関数は、PHP 側で Adabas サポートが有効である場合にのみ利用可能である。

$connection = Ada_Connect(データソース名, ユーザ名, パスワード)

Ada_Connect は、Adabas サーバーへの接続をオープンする。 各引数は、引用符付きの文字列でなければならない。 最初のパラメータ(データソース名)は、 "サーバ名:データベース名"という形式の文字列である。 ローカルのデータベースをアクセスする場合には、サーバ名を省略することができる。 (コロンは省略不可。) この関数は、接続IDを返す。 このIDは、他の Adabas 関数を使用する際に必要である。 一度に複数の接続を開くことができる。この関数は、エラーの際に 0 を返す。

この関数は、PHP 側で Adabas サポートが有効である場合にのみ利用可能である。

$result = Ada_Exec(接続ID, クエリー文字列)

Ada_Exec は、接続IDで指定された Adabas サーバーに SQL 命令を送る。 接続IDは、Ada_Connect から返された有効な ID または 特別な値 0 でなければならない。 接続IDが0の場合、ada_exec は 設定命令 phpAdaDefDB, phpAdaUser and phpAdaPWで 指定されたパラメータを用いて接続を試みようとする。
この関数の返り値はIDであり、他のAdabas 関数が検索結果に アクセスする際に用いられる。 この関数は、エラーの場合 0 を返す。 この関数は、正常に実行された場合でもデータを返さないコマンド (例えば insert や update コマンド)について 1 を返す。 select は、データを返さない場合でも 1 より大きい有効な値を返すことに 注意されたい。

この関数は、PHP 側で Adabas サポートが有効である場合にのみ利用可能である。

Ada_FetchRow(結果ID [,行番号])

Ada_FetchRow は、Ada_Exec から返されたデータを一行取り出す。 Ada_FetchRow がコールされた後、この行のフィールドは Ada_Result で アクセスすることがアクセスすることが可能である。 行番号が与えられない場合、Ada_FetchRow は結果の組から次の行を取り出そうと 試みる。 Ada_FetchRow がコールされる度に、Ada_Result により新しい行にアクセスする ことができる。 Ada_FetchRow が成功した場合(行があった場合)には 1 が返される。 もう行がない場合には、Ada_FetchRow は 0を返す。 Ada_FetchRow の返り値は、while ループの条件として使用可能である。 行番号のない Ada_FetchRow() と行番号のある Ada_FetchRow() のコールを 混用することができる。 結果を再度読み出したい場合には、Ada_FetchRow()で行番号として1を指定した後、 行番号無しで Add_FetchRow()を呼び出し続けることにより結果を再度見ることが 可能である。

この関数は、PHP 側で Adabas サポートが有効である場合にのみ利用可能である。

Ada_FieldName(結果ID,フィールド番号)

Ada_FieldName は、指定した Adabas 結果ID においてカラム番号で 指定したフィールドの名前を返す。 フィールド番号は 0 から始まる。

この関数は、PHP 側で Adabas サポートが有効である場合にのみ利用可能である。

Ada_FieldNum(結果ID,フィールド名)

Ada_FieldNum は、Adabas 結果ID におけるフィールド名で対応する カラムの番号を返す。 フィールド番号は 0 から始まる。

この関数は、エラーの場合に -1 を返す。

この関数は、PHP 側で Adabas サポートが有効である場合にのみ利用可能である。

Ada_FieldType(結果ID,フィールド名|フィールド番号)

Ada_FieldType は指定した Adabas 結果IDにおいて名前または番号により 参照されるフィールドのSQL型を返す。注意:フィールド番号が0から始まる。

この関数は、PHP 側で Adabas サポートが有効である場合にのみ利用可能である。

Ada_FreeResult(結果ID)

Ada_FreeResult は、スクリプト実行時にメモリを大量に使用したくない 場合にのみ必要である。 結果を保持する全てのメモリは、スクリプト終了時に自動的に解放される。 しかし、あるスクリプトにおいて結果データがもう必要でないことが確実である 場合には、結果ID を引数として Ada_FreeResult をコールし、メモリを解放する ことが可能である。

この関数は、PHP 側で Adabas サポートが有効である場合にのみ利用可能である。

Ada_NumFields(結果ID)

Ada_NumFields は、Adabas の検索結果におけるフィールド(カラム)の 数を返す。 引数は、Ada_Exec により返された有効な結果IDである。 この関数は、エラーの場合に -1 を返す。

この関数は、PHP 側で Adabas サポートが有効である場合にのみ利用可能である。

Ada_NumRows(結果ID)

Ada_NumRows は、Adabas の結果における行数を返す。 引数は、Ada_Exec により返された有効な結果IDである。 この関数は、エラーの場合に -1 を返す。 INSERT、UPDATE、DELETE 命令については、Ada_NumRows() は作用した行数を 返す。SELECT 文について、この関数は有効な行の数を返す。

この関数は、PHP 側で Adabas サポートが有効である場合にのみ利用可能である。

Ada_Result(結果ID, フィールド名 | インデックス)

Ada_Result は、Ada_Exec から返された結果IDを入力として実際の値を返す。 フィールド名は、行においてどのセルを返すかを指定する。 フィールドの名前を指定する代わりに、引用符無しの番号をフィールドインデックス として使用することができる。 フィールドインデックスは、0から始まる。 要求されたフィールドが BYTE (バイナリ) または 4096バイトより大きい場合、 内容はクライアントに直接送られる。 ヒント: [VAR]CHAR BYTE フィールドは、データベース関数 HEX() を使用して PHP 変数に返すことができる。 例:SELECT HEX(SYSKEY) SYSKEY FORM MYTABLE

この関数は、PHP 側で Adabas サポートが有効である場合にのみ利用可能である。

Ada_ResultAll(結果ID [,フォーマット])

Ada_ResultAll は AdaExec により生成される結果IDから全ての行を 出力する。 結果は、HTML テーブルフォーマットで出力される。 フォーマット用オプションを付加することにより、テーブル全体に渡る フォーマット指定が可能である。 (例えば、bgcolor= は背景色をセットする。 >caption> </caption はキャプションをセットする。) 注意: "format" の内容は、 <table format >... のようにHTML テーブルタグに挿入される。

この関数は、PHP 側で Adabas サポートが有効である場合にのみ利用可能である。

AddSlashes(引数)

全ての $ \ あるいは ' をバックスラッシュでエスケープする。 (MAGIC_QUOTES がセットされている場合) StripSlashes() も参照のこと。

ASort(配列)

Sort は、PHP 連想配列を昇順にソートするために使用される。 降順にソートする場合は、ARSort() を使用のこと。 Sort() 関数とは異なり、ASort() は index 値の組みを維持する。 この関数は、3つの変数型を理解し、配列が文字列を含む場合は アルファベット順にソートし、数を含む場合は数値でソートする。 配列に複数の型がある場合には、配列の最初の型がソートの種類を 決定する。 連想配列でない配列をソートしようとする場合、 Sort()関数を使う必要があることに注意されたい。

BinDec(2進文字列)

BinDec は2進数表現の引数文字列と等価な10進数を返す。 31 ビット長で表される最大の数は、10進数では4294967295である。 DecBin() 関数も参照のこと。

Ceil(値)

Ceil() は、浮動小数点数をこの数より大きな整数の側に丸める。 返り値は、倍精度実数型であり、複雑な式においても使用可能である。 整数型を得るためには次のようにする。 : $new = IntVal(Ceil($value));
Floor()も参照のこと。

ChDir(ディレクトリ)

ChDir はカレントディレクトリを引数で指定されたディレクトリに変更する。

ChGrp(file,group)

ChGrp は、指定されたファイルの グループ id を変更する。

ChMod(ファイル,許可属性)

ChMod は、指定されたファイルの許可属性を変更する。許可属性 パラメータは、8進表記で指定しなければならない。 例: ChMod($filename,0755)

ChOwn(ファイル,所有者)

ChOwn は指定されたファイルを指定された所有者の所有に変更する。 この関数は、PHP/FI 実行ファイルがルートとして実行されている 場合にのみ使用可能である。 (PHP/FI をルートで実行することは通常好ましくない。)

Chop(文字列)

Chop は、改行、タブ、空白を含む全ての最後の空白文字を削除し、 新しい文字列を返す。

Chr(引数)

Chr は、整数引数で表わされた ASCII 文字列を返す。

ClearStack()

ClearStack() 関数は、PHP パーサの欠陥に対する取り合えずの対策 (hack/workaround)である。 この欠陥とは、PHP が一つの式スタックしか持っていないことである。 ユーザー定義関数の内部にあるとき、この式スタックは決してクリアされない。 これは、ユーザー定義関数がコールされた箇所の 複雑な式の中でその内容が必要になるかもしれないからである。 これは、ユーザー定義関数の中で多くの繰り返しを行う while ループを有している 場合、多くのスタック領域を消費してしまうことを意味する。 最大データ領域の制限にかかることも考えられる。 このメモリー消費を防止するために while ループの中で ClearStack() をコールすることができる。 しかし、自分の関数を文の中で使用できない、つまり、 関数の出力を一時的な変数に割付け、この一時変数を必要とされる場所で 使用する必要があるというトレードオフがある。

ClearStatCache()

stat() システムコールは、ほとんどのオペレーティングシステムにおいて 負荷の高い操作である。 FilePerms()FileInode()、 等のような様々な File* 関数を繰り返しコールする手段を講じるために、 最後の stat() コールの結果は常にキャッシュされる。 File* 関数の一つが再び同じ引数で呼ばれた場合には、 キャッシュされた stat() の結果が使用される。 強制的に新しいシステムコールを行うために、 この ClearStatCache() 関数がコールされる。 この関数は、キャッシュされた stat() の結果をクリアする。

CloseDir()

CloseDir は、openDir 関数を用いて 開かれたディレクトリを閉じる。

CloseLog()

CloseLog() は、記述子 Syslog() を閉じる。 システムログに書くために使用する。 更に詳細な情報は、closelog(3) UNIX man ページを参照のこと。 また、Syslog()OpenLog()InitSyslog() も参照のこと。

Cos(引数)

Cos は、引数(ラジアン)のコサインを返す。Sin()Tan()も参照のこと。

Count(配列)

Count は、配列変数 array における要素数を返す。 変数が配列でない場合には、 (通常の変数は要素数が 1 の配列と同様であるので、) 返り値は 1 となる。 変数が未定義の場合には。返り値は、0となる。

Crypt(文字列,[salt])

Crypt は、標準的な Unix DES 暗号化法を用いて文字列を暗号化する。 引数は暗号化する文字列である。 また、オプションとして暗号化の基底となる塩として2文字の文字列 (salt string)をとる。 より詳細な情報は、crypt 関数に関する Unix マニュアルを参照のこと。 もし、自分の Unix システムにcrypt 関数がない場合には、 デンマークで開発されたMichael Glad'の public domain UFC-Crypt パッケージを 使用することが可能である。 合州国外のサイトから ftp でこれを手にいれる限り、 合州国の輸出法による拘束を受けない。

Date(フォーマット,時間)

Date 関数は、時間と日付を様々な手法で表示するために用いられる。 この関数はフォーマット文字列と時間を引数としてとる。 時間の引数が省略された場合には、現在の時間が使われる。 時間の引数は、Unix 時間(1970 年1月1日からの秒数)を表す整数で指定する。 フォーマット文字列は、表示する日付/時間要素と それらの表示フォーマットを指定するために用いる。 次の文字はフォーマット文字列の中で認識される。 認識されない文字は、冗長に表示される。:

  • Y - Year eg. 1995
  • y - Year eg. 95
  • M - Month eg. Oct
  • m - Month eg. 10
  • F - Month eg. October
  • D - Day eg. Fri
  • l - Day eg. Friday
  • d - Day eg. 27
  • z - Day of the year eg. 299
  • H - Hours in 24 hour format eg. 13
  • h - Hours in 12 hour format eg. 1
  • i - Minutes eg. 5
  • s - Seconds eg. 40
  • U - Seconds since epoch eg. 814807830
  • A - AM/PM
  • a - am/pm

MkTime() 関数も参照のこと。

dbList()

dbList は PHP に組み込まれた db サポートについての情報を出力する。

dbmClose(ファイル名)

dbmClose は指定されたdbm ファイルを閉じる。 この関数は、全てのロックファイルのロックを解除する。 そのため、オープンした全ての dbm ファイルを閉じることは 重要である。

dbmDelete(ファイル名,キー)

dbmDelete は、キー引数により指定された キー/内容の組を削除する。

dbmExists(ファイル名,キー)

dbmExists は、キーが存在する場合には 1、それ以外は 0 を返す。

dbmFetch(ファイル名,キー)

dbmFetch は、与えたキーに関連づけられた文字列を返す。

dbmFirstKey(ファイル名)

dbmFirstKey は、dbm ファイルの最初のキーを返す。 キーの順番は dbm の実装毎に内部で計算されるハッシュテーブルの値に依存する。 このため、特定の順番は保証されない。 必要ならば dbm ファイルからの配列データをソートするために Sort 関数を使用することが可能である。

dbmInsert(ファイル名,キー,内容)

dbmInsert は、新しいキー/内容の組を dbm ファイルに挿入する。 キーが既に存在する場合には、挿入は失敗する。

dbmNextKey(ファイル名,キー)

dbmNextKey は、指定したキーの次のキーを返す。 dbmfirstkey()を呼んだ後に dbmnextkey() を逐次呼びだすことにより、 dbm ファイルの中の全ての key/内容の組を見ることが可能である。

dbmOpen(ファイル名,モード)

dbmOpen() は dbm ファイルを開く。最初の引数は、開こうとする dbm ファイルの フルパス表現のファイル名である。2 番目はファイルを開くモードで あり、"r""n""w" により、それぞれ read、new (write を含む)、write を表す。 ndbm サポートを用いる場合には、ndbm は filename.dirfilename.pag ファイルを作成する。 gdbm は、内部的にフラットなアスキーファイルをサポートしているので 一つのファイルのみを用いる。 Berkeley の libdb は、filename.db ファイルを作成する。 dbm ライブラリ自体により行なわれるであろうファイルのロックに加えて、 PHP も独自のファイルのロックを行なう。 PHP は、作成した .lck ファイルを削除しない。 PHPは、これらのファイルを単にファイルのロックを行なうための 固定された inode として用いる。 dbm ファイルに関するより詳しい情報は、 Unix の man ページを見るか、もしくは、GNU の gdbm を ftp://prep.ai.mit.edu/pub/gnu より手にいれること。

dbmReplace(ファイル名,キー,内容)

dbmReplace は、dbminsert() 関数に似ている。 唯一の違いは、キーが既に存在する場合の動作である。 この関数においては、古い内容は新しい内容で置き換えられる。

DecBin(数値)

DecBin は、与えられた引数の2進表現を保持する文字列を返す。 変換できる最大の数は、31 ビット長、あるいは、10進数では 4294967295 である。 BinDec() 関数も参照のこと。

DecHex(数値)

DecHex は、10 進数を16 進数を表す文字列へ変換する。 HexDec() 関数も参照のこと。

DecOct(数値)

DecOct は、10進数を 8 進数へ変換する。 OctDec()も参照のこと。

doubleval(変数)

doubleval は、変数を倍精度実数(浮動小数点)で表した値を返す。 strval()intval() 関数も参照のこと。

Echo [フォーマット文字列] 式 [, 式 [,...]]

Echo は関数ではない。 すなわち、引数の前後を括弧でくくりはしない。 Echo は、PHP 関数の結果もしくはPHP変数の表示に用いられる。 サポートされる特殊文字のリストについては、 エスケープ文字の節を参照のこと。 format_string はオプションである。 もしこれがない場合には、出力のフォーマットは行なわれない。 このフォーマット文字列は、C 言語のprintf関数の フォーマット文字列に似ている。 詳細は、printf のマニュアルページを参照のこと。 5 つまでの式が一回の echo コマンドで表示可能である。 それ以上を表示させようとすると、構文エラーとなる。 式の型は(出力と)関係ない。 フォーマット文字列がある時には、表現式は自動的に フォーマット文字列により指定された適当な型に変換される。 ある変数をフォーマットし、フォーマットされた文字列を表示する代わりに 変数に割り付けたい場合には、 sprintf() 関数を使うこと。

次の変換がサポートされている。

%d %i
符合付きの10進数を表示する。
%o
8進数を表示する。
%u
符合無しの10進数を表示する。
%x %X
16進数を表示する。
%f
浮動小数点数を表示する。
%e %E
科学記数法で浮動小数点数を表示する。
%g %G
科学記数法または通常の標記のどちらか適当な方で浮動小数点数を表示する。
%c
一文字を表示する。
%s
文字列を表示する
%%
パーセント記号をそのまま表示する。

次のフラグが使用可能である。

'-'
フィールド幅の中で出力を左揃えする。
'+'
全ての整数が符合付きで(正/負の符合付きで)出力されることを指定する。
' '
'+' に似ている。しかし、プラス符合の代わりに空白を用いる。
'#'
16進数や8進数であることを明示するために、それらの前に前置記号を出力する。
'''
複数の桁をグループに分割する。(通常は3桁の組毎にカンマで区切る。)
'0'
フィールド幅をゼロで埋める。

これら全てのフラグは、自分のシステムにおける C ライブラリの printf 関数が それらをサポートしているかどうかに依存している。 (例えば、'''は GNU における拡張である。)

ほとんどの変換においては、 /examples ディレクトリ中の demo_echo.html ファイルに示すように、 フィールド幅と精度を指定できる。 いかなる型の変換も指定する必要はない。 実際、PHP は型の修正子に意味がない場合には、エラーとする。 (ほとんど、いつもこのケースである。) PHP は、認識できないもの全てをエラーとする。 (そして、処理を拒絶する。) そのフォーマット文字列により必要のない引数は全て無視される。

End(変数)

End は、与えられた変数に関する内部配列のポインタを配列の最後の要素に移動し、 最後の要素の値を返す。 この関数は、連想配列を後ろから移動する際に便利である。 Reset()Prev() も参照のこと。 次の例は、連想配列を後ろから移動するものである。:

    <?
      Reset($array);
      $first_key = key($array);
      End($array);
      $k = key($array);
      while($k != $first_key);
        echo $array[$k];
        prev($array);
        $k = key($array);
      endwhile;
      echo $array[$k];
    >

ereg(正規表現,文字列[,regs])

ereg は、正規表現が引数文字列にマッチする場合に非0を返す。 条件 <?if (ereg("^This.*","This is an example string")>を例にとると、 "^This.*"式は文字列の先頭にある This と 後ろに続く全ての文字にマッチすることを意味するので真となる。 引数 regs がある場合には、マッチレジスタの値が 引数 regs を名前とする配列の 0-10 番目に代入される。 レジスタ 0 は常にマッチした文字列全体を保持する。 正規表現に関するより詳しい情報については、このドキュメント中の 正規表現の節 を参照のこと。

eregi(正規表現,文字列[,regs])

eregi は、正規表現の大文字/小文字が無視されて適用されることを除いて ereg() 関数と同じである。

ereg_replace(正規表現,置換文字列,文字列)

ereg_Replace は、引数文字列全体を探索し 与えられた式にマッチする文字列を全て置換文字列で置き換える。 例えば、文字列 "This is an example string" において、 次のコマンドを用いて非常に簡単に全ての空白をダッシュに置換できる。: ereg_replace(" ","-","This is an example string") 正規表現に関するより詳しい情報については、このドキュメント中の 正規表現の節 を参照のこと。

eregi_replace(正規表現,置換文字列,引数文字列)

eregi_replace は、正規表現の大文字/小文字が無視されて適用されることを除いて ereg_replace() 関数と同じである。

EscapeShellCmd(文字列)

EscapeShellCmd は、文字列の中で シェルコマンドをだまして任意のコマンドを実行させるために用いられる可能性が ある全ての文字をエスケープする。 ユーザー入力から得られたデータを Exec() または System() 関数に処理させる際には、 事前にこの関数を用いてこのデータを確実にエスケープする必要がある。 通常の使い方を示す。:

    <?system(EscapeShellCmd($cmd))>

Eval(文字列)

Eval は文字列を引数にとり、その内容をミニPHP/FIスクリプト として取り扱う。 この内容は、独立した PHP/FI スクリプトとして実行される。 全ての変数は eval の内部からセットしたり、アクセスすることができる。 これらは、スクリプト中における eval 文の現在の文脈に応じて 大局的な参照フレームから得ることができる。 文字列引数においては変数の置換が行なわれる。 そのため、変数を文字列式の中で用いる際には、エスケープする必要がある。 いくつかの例を示す。:

    $a = "echo phpversion();";
    eval($a);

    eval("echo phpversion();");

    eval("\$a=1; echo \$a;");

Exec(コマンド文字列 [, 配列 [,返り値]])

Exec は与えられた unix コマンドを実行する。 しかし、何も出力しない。 exec は単にコマンドの実行結果から最後の行を返すだけである。 あるコマンドを実行し、そのコマンドから得られる全てのデータを 全く変更なしに直接得る必要がある場合には、 PassThru() 関数を使用すること。 配列引数がある場合には、指定されたその配列に unix コマンドからの出力の全ての行が代入される。 代入はその配列の最後から始められる。 すでにその配列が要素を保持しているおり、かつ、 0 番目の要素からコマンド出力を代入したい場合には、 関数のコール前に配列をUnSet により未定義とすること。 配列引数と同時に返り値引数が指定された場合には、 実行された UNIX コマンドのリターンステータスがこの変数に代入される。 ユーザーから入力されたデータにより Exec 関数を実行可能とする場合には、 ユーザーがシステムをだまして任意のコマンドを実行することができない ようにEscapeShellCmd() 関数を 用いなければならない。 system() 関数も参照のこと。

Exit

Exit コマンドは、このタグが解釈されると同時に 解釈を終了するために用いる。

Exp(引数)

Exp は、e の引数(arg)乗を返す。pow()も参照のこと。

fclose($fd)

fclose() は、fopen() により開かれたファイルを閉じる。 引数は、fopen() の呼び出しにより返されたファイルポインタの インデックスである。

feof($fd)

Feof は、ファイルポインタ引数により参照されるファイルがファイルの終端に達した場合に真を返す。

fgets($fd,バイト数)

fgets() は fopen() によりオープンされた ファイルから1行読み込む。 引数は、fopen() から返されたファイルポインタと読み込む最大のバイト数である。 最大バイト数分のデータか行の終わりを読み込んだ場合には、読み込みを 終了する。 このことは、C の fgets() 関数のコールに似ている。 fputs()も参照のこと。

fgetss($fd,バイト数)

fgets() 関数とほぼ同じである。この関数においてはファイルを読み込む際に 全ての HTML タグやPHP/FI スクリプトを取り除くというところが 異なっている。

$array = File(ファイル名)

File は、ファイル全体を読み込み、0番目の要素から 始まって各々の配列要素にファイルの各行が代入された配列を返す。

fileAtime(ファイル名)

fileAtime は最後にデータがアクセスされた時間を返す。 ファイルが存在しないか、アクセスできないような他の要因がある場合には、 この関数は -1 を返す。 fileAtime と他の file* 関数に関するコールが 繰り返し行われる際に、アクセスされたファイルが変更されたり、 消されたりした場合には、file* 関数をコールする前に ClearStatCache() をコールする必要がある。

fileCtime(ファイル名)

fileCtime は最後にファイルのステータスが変更された時間を返す。 ファイルが存在しないか、アクセスできないような他の要因がある場合には、 この関数は -1 を返す。 fileCtime と他の file* 関数に関するコールが 繰り返し行われる際に、アクセスされたファイルが変更されたり、 消されたりした場合には、file* 関数をコールする前に ClearStatCache() をコールする必要がある。

fileGroup(ファイル名)

fileGroup は、ファイルの所有者のグループIDを返す。 ファイルが存在しないか、アクセスできないような他の要因がある場合には、 この関数は -1 を返す。 fileGroup と他の file* 関数に関するコールが 繰り返し行われる際に、アクセスされたファイルが変更されたり、 消されたりした場合には、file* 関数をコールする前に ClearStatCache() をコールする必要がある。

fileInode(ファイル名)

fileInode はファイルの inode を返す。 ファイルが存在しないか、アクセスできないような他の要因がある場合には、 この関数は -1 を返す。 fileInode と他の file* 関数に関するコールが 繰り返し行われる際に、アクセスされたファイルが変更されたり、 消されたりした場合には、file* 関数をコールする前に ClearStatCache() をコールする必要がある。

fileMtime(ファイル名)

fileMtime は最後に修正が行なわれた時間を返す。 ファイルが存在しないか、アクセスできないような他の要因がある場合には、 この関数は -1 を返す。 fileMtime と他の file* 関数に関するコールが 繰り返し行われる際に、アクセスされたファイルが変更されたり、 消されたりした場合には、file* 関数をコールする前に ClearStatCache() をコールする必要がある。

fileOwner(ファイル名)

fileOwner はファイルの所有者のユーザーID(uid) を返す。 ファイルが存在しないか、アクセスできないような他の要因がある場合には、 この関数は -1 を返す。 fileOwner と他の file* 関数に関するコールが 繰り返し行われる際に、アクセスされたファイルが変更されたり、 消されたりした場合には、file* 関数をコールする前に ClearStatCache() をコールする必要がある。

filePerms(ファイル名)

filePerms は、ファイルの許可属性ビットを返す。 これは、 UNIX C 言語における stat 構造体の st_mode フィールドである。 ファイルが存在しないか、アクセスできないような他の要因がある場合には、 この関数は -1 を返す。 filePerms と他の file* 関数に関するコールが 繰り返し行われる際に、アクセスされたファイルが変更されたり、 消されたりした場合には、file* 関数をコールする前に ClearStatCache() をコールする必要がある。

fileSize(ファイル名)

fileSize は、ファイルの大きさをバイト数で返す。 ファイルが存在しないか、アクセスできないような他の要因がある場合には、 この関数は -1 を返す。 fileSize と他の file* 関数に関するコールが 繰り返し行われる際に、アクセスされたファイルが変更されたり、 消されたりした場合には、file* 関数をコールする前に ClearStatCache() をコールする必要がある。

fileType(ファイル名)

fileType は、ファイルの型を返す。返り値は、 "dir"、"file"、"fifo"、"char"、 "block"、"link" のうちの一つである。 これらは、それぞれ、ディレクトリ、標準ファイル、fifo スペシャル、 文字スペシャル、ブロックスペシャル、シンボリックリンクである。

Floor(値)

Floor() は、浮動小数点数をこの数より小さい整数の側に丸める。 返り値は倍精度実数型(浮動小数点数)であり、 複雑な方程式に使用することが可能である、 整数型を得るためには次のようにする。: $new = IntVal(Floor($value));
Ceil()も参照のこと。

Flush()

Flush() 関数は、出力バッファをフラッシュするために使用される。 Apache モジュールの場合、この関数は Apache の出力バッファをフラッシュし、 CGI版の場合、単に標準出力をフラッシュする。 Apache で CGI として実行される場合、 サーバーは、CGI スクリプトの出力をバッファリングするので、 この Flush() 関数はあまり有効な動作をしない。 Apache web サーバーのもとで PHP の CGI 版を実行する場合には、 スクリプトを nph- スクリプトとして実行することを考えてみること。 さもなくば、PHP のモジュール版を実行すること。

$fp = fopen(ファイル名,モード)

fopen() は、ファイルをオープンしファイルのポインタを返す。 ファイルがオープンできない場合は、この関数は -1 を返す。

これは、C のfopen() コールと同様である。 filename 引数は開こうとするファイルの相対もしくは絶対パス である。 mode 引数は "r", "r+", "w", "w+", "a", "a+" のどれかである。 より詳しい情報を得るには、 fopen() コールの Unix man ページを 参照のこと。 popen() 関数に関する記述も参照のこと。 fclose() 関数に関する記述も参照のこと。

例:

    $fp = fopen("/home/rasmus/file.txt","r");
fputs(fp,文字列)

fputs() は、fopen() により開かれたファイルに 1 行書き込む。 引数は、fopen() より返されたファイルポインタと書き込む文字列である。 string 引数には、改行や復改、タブを出力するためにそれぞれ \n\r\t を使う等の特別なエスケープ文字を用いることができる。 fgets()も参照のこと。

FPassThru(fp)

FPassThru() は、fp に残るデータを全て直接的に出力する。 この関数は ReadFile() とは異なり、 fsockopen() でオープンされた ファイルも取り扱うことが可能である。 この関数は PassThru() とは異なり、 コマンド出力に対応せずオープンされたファイルに対応する。 FPassThru() は、読み込んで書き込んだバイト数を返す。

fseek(fp,位置)

fseek() は、fopen() コールの返り値である $id 引数により特定されるファイルポインタをファイル上の指定した位置に 移動させる。 ファイルポインタは、ファイルの開始位置に対して pos 引数で 指定されるオフセット分だけ加えた位置に移動される。 ftell() および rewind() も参照のこと。

fp = fsockopen(hostname,port)

fsockopen() は、ソケットコネクションをオープンし、 ファイルポインタを返す。 ファイルポインタは、fgetsfputsfcloseにより使用することができる。 引数はホスト名とポート番号である。 返り値は次のようになる。:ソケットが作成できなかった場合は -3 、ホスト名の dns による検索が失敗した場合は -4、コネクションが拒否されるか時間切れの場合は-5、 fdopen() コールが失敗した場合は -6、 setvbuf() コールが失敗した場合は -7。 オペレーティングシステムが UNIX ドメインソケットをサポートしている場合、 ポート番号が0 の時には ホスト名引数は UNIX ドメインソケットの ファイル名として扱われる。

pos = ftell(fp)

ftell() は、fopen() コールの返り値である fp 引数により指定されたファイルポインタの位置を返す。 この位置は、後に fseek() の引数として用いることが可能である。 fseek()rewind() も参照のこと。

getAccDir()

getAccDir は PHP のアクセス情報ファイルが存在する ディレクトリ名を返す。 このアクセス情報ファイルの存在するディレクトリ名は、 アクセス情報を記録するファイルを所有するユーザーの ユーザーID番号から付けられる。

GetEnv(文字列)

GetEnvは文字列で指定された環境変数の値を返す。PHP/FIでは、 環境変数は直接扱う事が出来るので、通常はこの関数は使わない。仮に、 内部のシンボルテーブルに見当たらない変数の参照が発生すれば、自動的に 環境変数空間を探すのである。

環境変数が通常のPHP/FI変数で書き換えられない事を 保証する必要がある時には、GetEnvを使うべきである。 セキュリティ機構が、HTTP サーバーが定義した REMOTE_ADDR や REMOTE_HOST のような変数に基づく場合には、 これらの変数を $REMOTE_ADDR として直接参照せずに GetEnv を用いてロードするべきである。 これは、誰かが偽りのフォームを作ってサーバーにそのデータを ポストした場合に、結果として、どのようなセキュリティ機構をもってしても すり抜けられてしまうことを避けるためである。

getHostByName(ドメイン名)

getHostByNameは、与えられたドメイン名を、nnn.nnn.nnn.nnn形式の IPアドレスに変換する。

getHostByAddr(IPアドレス)

getHostByAddrは、nnn.nnn.nnn.nnnで与えられたアドレスをFQDN形式の ドメイン名に変換する。

GetImageSize(ファイル名)

The GetImageSize() 関数は、ファイルの絶対パスまたは呼び出す スクリプトからの相対パスをとる。この関数は、幅、高さ、型の 3つの要素からなる配列を返す。幅と高さは、ピクセル単位であり、 型は、1 が GIF ファイル、2 が JPG ファイル、3 が PNG ファイルを意味する。 他の型はサポートされていない。返される配列の4番目の要素は、 "width=x height=y" という文字列を含んでおり、 これは、直接 IMG タグとして使用可能である。 この関数を使用するために GD イメージライブラリは必要ないことに 注意されたい。例を以下に示す。

    <?
        $result = GetImageSize("img/flag.jpg");
    >
    <IMG SRC="img/flag.jpg" ?echo $result[3]> >

getLastAccess()

getLastAccessは現在のページが最後にアクセスされた時間をUNIXのtime 形式で返す。この値は、Date()関数を通してフォーマット 出来る。 この関数は、PHPのコンパイル時に、アクセスログ機能を有効にした時のみ 利用できる。

getLastbrowser()

getLastBrowserは、現在のページを最後にアクセスしたユーザの ブラウザーを表す文字列を返す。 この関数は、PHPのコンパイル時に、アクセスログ機能を有効にした時のみ 利用できる。

getLastEmail()

getLastEmailは現在のページを最後に参照したユーザーのE-Mailアドレスを 返す。
この関数は、PHPのコンパイル時に、アクセスログ機能を有効にした時のみ 利用できる。

getLastHost()

getLastHostは現在のページを最後に参照したユーザーのホスト名を 返す。
この関数は、PHPのコンパイル時に、アクセスログ機能を有効にした時のみ 利用できる。

getLastMod()

getLastModは、現在のページを最後に修正した時刻(日付と時間)を、 UNIXのtime形式で返す。この値はDate()でフォーマット 出来る。
この関数は、PHPのコンパイル時に、アクセスログ機能を有効にした時のみ 利用できる。

getLastref()

getLastRefは、現在のページを最後にアクセスしたユーザが参照した URLを返す。
この関数は、PHPのコンパイル時に、アクセスログ機能を有効にした時のみ 利用できる。

getLogDir()

getLogDir は PHP のログファイルが存在する 最上位階層のディレクトリを返す。 実際のログファイルは、このディレクトリの下のディレクトリに 存在する。 各サブディレクトリ名は、ログファイルの属するユーザのユーザID番号 である。 それらのディレクトリの中にいくつかの dbm ログファイルがある。 各 dbm ファイル は、名前の最初の部分が示すファイルの inode 数を保持している。

getMyInode()

getMyInodeは、現在のHTMLファイルの inode 数を返す。

getMyPid()

getMyPid()は、現在の PHP 処理プロセスのプロセスIDを返す。

getMyUid()

getMyUidは、現在のHTMLファイルの所有者のID番号を返す。

getRandMax()

getRandMaxはRand関数が返す乱数の最大値を返す。 この値が正確でないと思われれる場合には、 PHP配布ファイル中の php.h のソースを見て、より詳細な情報を得ること。

getStartLogging()

getStartLogging は現在のページに関するログの記録が開始された日時を、 UNIXの time 形式で返す。 mSQL によりログを記録した場合には、タイムスタンプが各ログファイルへ 記録されるので、この日時は、より正確になる。 dbm によりログを記録する場合には、そのユーザーのログ用ディレクトリが 作成された時間が返される。

getToday()

getTodayは現在のページに関するローカル時間の深夜12時からの 総アクセス数を返す。
この関数は、PHPのコンパイル時に、アクセスログ機能を有効にした時のみ 利用できる。

getTotal()

getTotalは、アクセス記録を始めてから現在のページが受けた 総ヒット数を返す。
この関数は、PHPのコンパイル時に、アクセスログ機能を有効にした時のみ 利用できる。

GetType(変数)

GetTypeは変数の型を返す。返り値は文字列で、 ""integer"、"double"、string"の いづれかである。 SetType()関数も参照の事。

gmDate(フォーマット,時間)

gmDateは、ローカルタイムの代わりにグリニッジ標準時を用いること以外、 Dateと同一である。

Header(ヘッダー文字列)

Headerコマンドは、HTMLファイルの先頭で、HTTPのヘッダー文字列を 送るのに使われる。HTTPヘッダーについての詳細は HTTP Specificationを参照の事。Header()コマンドは通常のHTMLタグや PHP の echo コマンドにより実際の出力が行なわれる前に使用しなければならない。
使用例は、HTTP 認証節において参照可能である。

HexDec(16進文字列)

HexDecは16進数を10進数に変換する。DecHex()も 参照の事。

HtmlSpecialChars(文字列)

HtmlSpecialCharsは、 160から255までのアスキーコードを有する任意の文字を示す 引数文字列を対応する実際の HTML 名に変換する。 この関数は、変換された文字列を返す。 <>&" も変換される。

ImageArc(im, cx, cy, w, h, s, e, col)

ImageArcは、imで現わされるイメージ上に、 cx,cyを中心(左上を原点)とする部分楕円を描く。wとhは、それぞれ、 楕円の幅と高さを特定する。一方、始点と終点は、sとeで示す角度で特定する。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageChar(im, size, x, y, c, col)

ImageCharは、imで識別されるイメージ上の x,y座標(左上が原点)にcol色の文字cを描画する。引数sizeは、1,2,3,4, 5のいづれかの値であり、1が最小で、5が最大である。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageCharUp(im, size, x, y, c, col)

ImageCharUpは、imで識別されるイメージ上の x,y座標(左上が原点)にcol色の文字cを縦に描画する。引数sizeは、1,2,3,4 ,5のいづれかの値であり、1が最小で、5が最大である。
本関数は、GDがPHPに組み込まれていれば機能する。

col = ImageColorAllocate (im, red, green, blue)

ImageColorAllocateは、指定した RGB 要素で構成される色を 示す色識別子を返す。引数 im は、 ImageCreate関数の返り値である。 ImageColorAllocateは、imで現わされるイメージで使われる個々の色を作成する ために呼び出す必要がある。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageColorTransparent(im, col)

ImageColorTransparentは、イメージ im の透明色をcolにする。 imはImageCreateで返されるイメージ識別子で、 colはImageColorAllocateで返される 色識別子である。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageCopyResized(dst_im, src_im, dstX, dstY, srcX, srcY, dstW, dstH, srcW, srcH )

ImageCopyResizedは、イメージの一矩形領域を、別のイメージにコピーする。 dst_imはコピー先のイメージ名であり、src_imはコピー元の イメージ名である。コピー元とコピー先のイメージの座標や幅や高さが異なれば、 適当な伸縮が行なわれる。座標系は、左上隅を基準とする。 この関数は、同一イメージ内(dst_imsrc_imが同じ場合) における領域のコピーにも用いることが出来るが、その領域が重なった場合の 結果は予測不可能である。
本関数は、GD がPHPに組み込まれていれば機能する。

im = ImageCreate(x_size, y_size)

ImageCreateは、x_size × y_size の大きさの空のイメージを表す イメージ識別子を返す。
本関数は、GDがPHPに組み込まれていれば機能する。

im = ImageCreateFromGif(ファイル名)

ImageCreateFromGifは与えられたファイル名 から得られるイメージを表すイメージ識別子を返す。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageDestroy(im)

ImageDestroyはイメージ im に関連するメモリを開放する。 im は ImageCreate関数が返すイメージ識別子である。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageFill(im, x, y, col)

ImageFillはイメージimをcol色で、座標x, y(左上が原点)から塗りつぶす。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageFilledPolygon(im, points, num_points, col)

ImageFilledPolygonは、イメージ im の中に 塗りつぶされた多角形を作成する。 points は多角形の頂点を要素とするPHP配列である。 すなわち、points[0] = x0, points[1] = y0, points[2] =x1, points[3] = y1 等となる。num_points は頂点の総数である。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageFilledRectangle(im, x1, y1, x2, y2, col)

ImageFilledRectangleは、イメージ im 上に 左上の座標 x1,y1 から始まって右下の座標 x2,y2 までの 色 col の塗りつぶされた矩形を作成する。左上隅がイメージの原点である。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageFillToBorder(im, x, y, border, col)

ImageFillToBorderは border で定義される境界色を用いて、 塗りつぶす。x,yは塗りつぶしを始める点で(左上が原点)、col色で塗りつぶす。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageGif(im [,filename])

ImageGifは、イメージ im から filename という名前の GIFファイル を作成する。引数imは、ImageCreate関数の 返り値である。引数filenameはオプションであり、省かれた場合には、 画像データが直接ストリームに書きだされる。 Header()関数を使用して、content-typeに image/gifを送る事で、この関数を使って直接GIF画像を生成する PHPスクリプトを記述できる。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageInterlace(im, interlace)

ImageInterlaceは、インターレースビットのオンオフを切り替える。 interlaceが 1 ならば、イメージ im はインターレース化される。 interlaceが0ならば、インターレースビットはオフになる。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageLine(im, x1, y1, x2, y2, col)

ImageLineは、イメージim上に col色で、x1,y1からx2,y2(左角を原点とする) への直線を描画する。
本関数は、GDがPHPに組み込まれていれば機能する。

ImagePolygon(im, points, num_points, col)

ImageFilledPolygonは、イメージ im の中に 多角形を描画する。pointsは多角形の頂点を含むPHPの配列である。 すなわち、points[0] = x0, points[1] = y0, points[2] =x1, points[3] = y1 等となる。num_points は頂点の総数である。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageRectangle(im, x1, y1, x2, y2, col)

ImageRectangleは、イメージim上に、左上隅を起点として、x1,y1を左上の始点、 x2,y2を右下の終点とするcol色の矩形を生成する。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageSetPixel(im, x, y, col)

ImageSetPixelは、imで示されるイメージ上の x,yで示される座標(左上が原点)に、col色の 点を描画する。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageString(im, size, x, y, s, col)

ImageStringは、imを識別子とする イメージにおいて、x,yで示される座標(左上が原点)に colで示される色で文字列 s を描画する。 引数 sizeは 1,2,3,4,5の値を取り、1が最小で、5が最大である。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageStringUp(im, size, x, y, s, col)

ImageStringUpは、 x,yで示される座標(左上が原点)に、 imを識別子とするイメージにおいて colで示される色で文字列 s を垂直に描画する。 引数 sizeは、1,2,3,4,5の値を取り、1が最小で 5が最大である。
本関数は、GDがPHPに組み込まれていれば機能する。

ImageSX(im)

ImageSXは、imを識別子とするイメージの幅を返す。

ImageSY(im)

ImageSYは、imを識別子とするイメージの高さを返す。

Include(filename)

Includeコマンドは、現在のHTMLファイル中に、他のファイルを挿入するのに 用いられる。ヘッダーやフッターを何百ものHTMLファイルに加える必要が ある際には非常に便利である。 include コマンドを使う場合には、変更の必要がある時にヘッダーもしくはフッターを 一個所で修正するだけで済む。 インクルードファイルにおいても PHP による解釈は完全に行なわれるので、 これまで書いた共通の PHP スクリプト を include コマンドで読み込ませる ことも可能である。  いわば、プリミティブな共有ライブラリを有しているが如く、 自分の HTML ファイルから呼び出すことが可能である。 このような共通ライブラリファイルを一つのディレクトリに置き、 PHP のインクルードパスをセットすることにより、 ファイルをパス名付きで参照する必要がないようにすることが可能である。 Apache モジュールのユーザーについては、 phpIncludePath ディレクティブによりこの機能を 設定することが可能である。 CGI 版のユーザーについては、PHP_INCLUDE_PATH 環境変数により 設定が可能である。 このパスは、ちょうど UNIX シェルにおける $PATH のように コロンで区切られている。 例えば、

    <?include("/path/filename.txt")>

InitSyslog()

InitSyslog() は、OpenLog() および Syslog() を使用する際に必要となる いくつかの PHP 変数を定義する。 これらの変数は、デフォルトでは効率のため定義されない。 変数は、<syslog.h> C インクルードファイル と同様の方法で($LOG_LOCAL0 のように)名前が付けられている。 更に詳細な情報については、syslog(3) UNIX マニュアルを参照されたい。 InitSyslog()Syslog()CloseLog() も参照のこと。

intval(変数)

intval関数は、変数の倍精度整数値(long integer)を返す。 strval()doubleval() も参照のこと。

IsSet(変数)

IsSet関数は、変数が定義されていれば1を返し、そうでなければ0を返す。

Key(変数)

Key は現在の配列要素のキーを返す。その要素は与えられた変数の 配列ポインタの位置によって定義される。 この配列ポインタは関数 Reset()End()Next()Prev() により操作される。 この関数は普通の配列でも充分使えるが、主として連想配列中の要素に関する キーの値を決めるために使用される。

Link() はハードリンクを作る。シンボリック(ソフト)リンクを作るにはSymlink() を参照のこと。また、ReadLink および LinkInfo 関数も参照のこと。

LinkInfo(パス)

LinkInfo は lstat システムコールで返される UNIX の C 言語の stat 構造体の st_dev フィールドを返す。この関数は(パスが指す)link が本当に 存在しているかを (stat.h の中で定義されている S_ISLNK マクロと同じ方法を使って) 確認する為に使われる。エラーの場合は -1 を返す。

Log(引数)

Log は引数の自然対数を返す。

Log10(引数)

Log10 は引数の基底が 10 の対数を返す。

LogAs(ファイル名)

LogAs() 関数は、カレントのページへのアクセスを 実際には引数で指定されたファイルにアクセスされたものとして 記録する。

Mail(to,題名,メッセージ[,ヘッダ文字列])

Mail は、メッセージ引数で指定されたメッセージを to 引数で指定された宛先に向けて自動的にメールする。 to 引数において宛先の間を空白で区切ることにより複数の宛先を 指定できる。

例えば、

   mail("rasmus@lerdorf.on.ca", 
        "My Subject", 
        "Line 1\nLine 2\nLine 3");
4番目の引数として文字列が渡された場合、この文字列がヘッダの最後に挿入される。 例えば、
   mail("ssb@guardian.no", "the subject", $message,
        "X-Mailer: PHP/FI " + phpversion());
Max(配列)

Max は PHP 配列の中で最大値を返す。 すなわち、最大要素を探して配列全体を検索する。 array が文字列の配列である場合には、配列の中でソートした場合に アルファベット順で最後となる文字列が返される。

Md5(メッセージ)

Md5 は、文字列の MD5 ハッシュ値を返す。

mi_Close(接続ID)

mi_Close は、指定された接続IDに関連付けられた Illustra データベース への接続を閉じる。

この関数は、PHPにおいて Illustra サポートが有効な場合にのみ 実行可能である。

$connection = mi_Connect( データベース,ユーザ名,パスワード)

mi_Connect は、Illustra データベースへの接続を開く。 各引数は、引用符付きの文字列でなければならない。 この関数は、接続IDを返す。このIDは、他の Illustra 関数使用の際に 必要である。複数の接続を同時に開くことが可能である。 接続可能なホストは、 PHP が実行されているマシン上の MI_PARAMS ファイルに拘束される。 リモート実行はまだサポートされていない。 この関数は、エラーの場合に -1 を返す。

この関数は、PHPにおいて Illustra サポートが有効な場合にのみ 実行可能である。

mi_DBname(接続ID)

mi_DBname は、指定した Illustra 接続IDが接続するデータベースの 名前を返す。

この関数は、PHPにおいて Illustra サポートが有効な場合にのみ 実行可能である。

$result = mi_Exec(接続ID, クエリー文字列)

mi_Exec は、接続IDで指定された Illustra データベースに SQL 命令を 送信する。 接続IDは、mi_Connect から返された有効なIDでなければならない。 この関数の返り値は、他の Illustra 関数が結果にアクセスする際に 使用される結果IDである。 この関数は、エラーの場合に -1 を返す。

この関数は、PHPにおいて Illustra サポートが有効な場合にのみ 実行可能である。

mi_FieldName(接続ID, 結果ID,フィールド番号)

mi_FieldName は、指定された Illustra 結果ID、接続IDについて 指定されたカラム番号に存在するフィールドの名前を返す。 フィールド番号は、0から始まる。

この関数は、エラーの場合に -1 を返す。

この関数は、PHPにおいて Illustra サポートが有効な場合にのみ 実行可能である。

mi_FieldNum(接続ID, 結果ID, フィールド名)

mi_FieldNum は、指定された Illustra 結果IDについてフィールド名に対応する カラムの番号を返す。 フィールド番号は、0から始まる。

この関数は、エラーの場合に -1 を返す。

この関数は、PHPにおいて Illustra サポートが有効な場合にのみ 実行可能である。

mi_NumFields(接続ID, 結果ID)

mi_NumFields は、Illustra 結果におけるフィールド(カラム)の数を返す。 引数は、mi_Exec により返された有効な結果IDである。

この関数は、エラーの場合に -1 を返す。

この関数は、PHPにおいて Illustra サポートが有効な場合にのみ 実行可能である。

mi_NumRows(接続ID, 結果ID)

mi_NumRows は、Illustra 結果における行の数を返す。 引数は、mi_Exec により返された有効な結果IDである。

この関数は、エラーの場合に -1 を返す。

この関数は、PHPにおいて Illustra サポートが有効な場合にのみ 実行可能である。

mi_Result(接続ID, 結果ID, 行番号, フィールド名/インデックス)

mi_Result は、mi_Exec により生成された結果IDから値を取り出す。 行番号とフィールド名によりテーブル中のどのセルを返すかを指定する。 フィールド名を指定する代わりに、引用符無しの番号である フィールドインデックスで指定することもできる。 フィールドインデックスは、0から始まる。

現在は、型検出ができないため、データベースから返される全ての値は、文字列型である。

この関数は、PHPにおいて Illustra サポートが有効な場合にのみ 実行可能である。

Microtime()

Microtime() は文字列 "msec sec" を返す。 ここで sec は 1970年1月1日 00:00 GMT からの経過秒数であり、 msec は(秒の一部分である)マイクロ秒の部分である。 例えば、"0.87633900 825010464" である。
この関数は gettimeofdat() システムコールを サポートするオペレーティングシステムでのみ使用可能である。

Min(配列)

Min は PHP 配列の中で最小値を返す。 すなわち、最小要素を探して配列全体を検索する。 array が文字列の配列である場合には、配列の中でソートした場合に アルファベット順で最初となる文字列が返される。

MkDir(ディレクトリ,モード)

MkDir はディレクトリを作る。 モード パラメータは8進表記で与えなければならない。 例: MkDir("DirName",0755);

MkTime(hour,min,sec,mon,day,year)

MkTime は引数により指定された日時に対応する時間を Unix タイムスタンプ (ロング整数)フォーマット で返す。 与える引数成分が現在のローカル日時に基づいた値に設定されている場合には 引数は省略できる。 この引数の省略は、右から左にのみ可能である。 例えば、 MkTime(hour,min,sec) は正しいが、 MkTime(mon,day,year) は誤りである。

この関数は、日付計算および日付の有効性確認の両方を行うツールとして 非常に便利であるということに注意されたい。 この関数に 12より大きい月や、31より大きい日付といった 無効なパラメータを与えることができる。 この場合でも、この関数は正しい日付を計算する。 パラメータのどれかが標準の値の外側にある場合にエラーメッセージを 生成したりもする。 関数を呼ぶ前にこのエラー告知を解除するためには、 SetErrorReporting(0) 関数を 使用すること。 この場合、生じる可能性がある全てのエラーについて $phperrmsg で確認することが 可能である。

        SetErrorReporting(0);
        $a = MkTime(0,0,0,13,1,1997);
        SetErrorReporting(1);
        echo $phperrmsg;
$result = msql($database,$query)

msql は mSQL クエリーを送る。引数はデータベース名とクエリー文字列である。 すなわち、<?msql("MyDatabase" , "select * from table")><?msql("MyDatabase" , "select * from table")> である。 この関数から返される値は、他の msql関数から得られる結果にアクセスするための 結果識別子(result identifier)である。結果識別子は、正の整数である。 結果識別子が作成されない場合には、0 を返す。 これは何も返さないクエリー、例えば、create, update,drop, insertdeleteの場合である。 エラーが生じた場合、関数は -1 を返す。 そのエラーについて記述した文字列が $phperrmsg にセットされる。 msql 関数を @msql() として呼ばない限り、 このエラー文字列の出力も行なわれる。 mSQL 2.0 においては、$result 変数には実行された SQL コマンドにより 作用された行数が返される。 アプリケーションが mSQL 1.0 との互換性を保つためには、 これに依存するべきではない。
この関数は PHP において mSQL がサポートされている場合のみ利用できる。

msql_close()

msql_Close は、開かれたソケット結合がある場合には、 msql デーモンに対するその結合を閉じる。 同時に開くことができる mSQL セッションは一つだけなので、 この関数は引数を取らない。

msql_connect($hostname)

msql_Connect は mSQL データベースエンジンが属するホスト名または IP を 指定する。 これは mSQL の C 言語での API の中の msqlConnect() 関数と同じである。 この関数の C API との唯一の違いは、この関数をコールしなくても msql() 関数に対する最初のコールが行なわれた際にデフォルトで ローカルホストへの接続が行なわれるということである。 そして、同時に有効な接続は 1つだけであるので、msql_close 関数は必要ない。 一つのファイル中で msql_connect() の 2回目のコールを行なう場合には、 最初のホストに対する接続は自動的に閉じられる。 ローカルホストの msql デーモンに明示的に接続する為に <?msql_connect("localhost")> を使う。
この関数は PHP で mSQL がサポートされている場合のみ利用出来る。

msql_CreateDB($database)

msql_CreateDB は与えられたデータベースを作成する。
この関数は PHP で mSQL がサポートされている場合のみ利用出来る。

msql_dbName($result,$i)

msql_dbName は msql_ListDbs() 関数から 返される結果(result)ポインタの $i 番目に格納されている データベース名を返す。 msql_NumRows() 関数は有効な データベース名の数を調べるために使うことができる。
この関数は PHP で mSQL がサポートされている場合のみ利用出来る。

msql_DropDB($database)

msql_DropDB は指定された mSQL データベース (database)を削除する。 そのデータベース中の全てのデータを失うので注意して使用すること。
この関数は PHP で mSQL がサポートされている場合のみ利用出来る。

msql_FieldFlags($result,$i)

msql_FieldFlags は指定されたフィールドのフィールドフラッグを返す。 現在、この返り値は "not null"、"primary key"、これら2つの結合、あるいは "" (空の文字列)のいずれかである。
この関数は PHP で mSQL がサポートされている場合のみ利用出来る。

msql_FieldLen($result,$i)

msql_FieldLen は指定されたフィールドの長さを返す。
この関数は PHP で mSQL がサポートされている場合のみ利用出来る。

msql_FieldName($result,$i)

msql_FieldName は指定されたフィールドの名前を返す。 関数の引数は結果識別子とフィールドインデックスである。 すなわち、msql_FieldName($result,2); は、 結果識別子 (result) に結合された結果において 2番目のフィールド名を返す。
この関数は PHP で mSQL がサポートされている場合のみ利用出来る。

msql_FieldType($result,$i)

msql_FieldType は msql_FieldName() 関数と似ている。 引数は全く同じであるが、フィールドの型が返される。 これは、"int"、"char"、"real" のどれかである。
この関数は PHP で mSQL がサポートされている場合のみ利用できる。

msql_FreeResult($result)

msql_FreeResult は、スクリプトを走らせる際のメモリー使用量が 多すぎると危惧される場合にのみコールする必要が生じる。 結果(result)を保持する全てのメモリーはスクリプト終了時に自動的に解放される。 しかし、スクリプト中でこれ以上結果のデータを必要としないことが確かならば、 結果識別子を引数として msql_freeresult をコールし、 関連する結果を保持するメモリーを解放することが可能である。
この関数は PHP で mSQL がサポートされている場合のみ利用できる。

$result = msql_ListDBs()

msql_ListDBs は現在の mSQL デーモンから利用できるデータベースを 含む結果(result)へのポインタを返す。 この結果ポインタの内容にアクセスするには、 msql_dbName() 関数を使用すること。
この関数は PHP で mSQL がサポートされている場合のみ利用できる。

$result = msql_Listfields($database,$tablename)

msql_Listfields はテーブル名(tablename)で指定されたテーブル に関する情報を調べる。引数はデータベース名とテーブル名である。 返り値である結果(result)ポインタは、 msql_fieldflags, msql_fieldlen, msql_fieldname, msql_fieldtype で使用 可能である。結果識別子は正の整数である。 エラーを生じた場合には関数は -1 を返す。 そのエラーについて記述した文字列が $phperrmsg にセットされる。 関数を @msql() のように呼ばない限りこのエラー文字列の 出力も行なわれる。
この関数は PHP で mSQL がサポートされている場合のみ利用できる。

$result = msql_ListTables($database)

msql_ListTables は msql() 関数と同様に データベース名を引数、結果(result)ポインタを返り値とする。 この結果ポインタから実際のテーブル名を展開するには、 msql_TableName() 関数を用いる必要がある。
この関数は PHP で mSQL がサポートされている場合のみ利用できる。

msql_NumFields($result)

msql_NumFields は結果(result)の中のフィールド数を返す。 引数は msql() 関数で返された結果識別子である。
この関数は PHP で mSQL がサポートされている場合のみ利用できる。

msql_NumRows($result)

msql_NumRows は単に結果(result)の行数を返す。 引数 msql() 関数から 返された結果識別子である。
この関数は PHP で mSQL がサポートされている場合のみ利用できる。

msql_RegCase(string)

msql_RegCase は文字列引数をとり、それを大文字小文字を区別しない マッチングを行なう際に mSQL に送る必要のある正規表現に変換する。 この関数は文字列 "abc" を "[Aa][Bb][Cc]" にすると いった変換を行なう。
この関数は PHP で mSQL がサポートされている場合のみ利用できる。

msql_Result($result,$i,field)

msql_Result は返されたレコードからフィールド(field)を表示する。 引数は msql() 関数によって返される結果識別子(result)、 表示するレコードのインデックスを示す整数およびフィールド名である。 フィールド名(field)引数は結合関数(join) からの結果を処理するために "table.field" 構文をサポートしている。 この関数は以下の完全な例により最も良く説明されるであろう。

    <?
      $name = "bob";	
      $result = msql($database,"select * from table where firstname='$name'");
      $num = msql_numrows($result);
      echo "$num records found!<p>";
      $i=0;
      while($i<$num);
        echo msql_result($result,$i,"fullname");
        echo "<br>";
        echo msql_result($result,$i,"address");
        echo "<br>";
        $i++;
      endwhile;
    >

上のスクリプトはローカルマシン上の mSQL エンジンに接続し、 name 変数に bob をセットする。 そして、table において firstname フィールドが bob である 全てのフィールドを検索するクエリーを送る。 見つかったレコードの数を表示した後、見つかったレコードにおいてループを 行ない、レコード毎に fullnameaddress フィールドを 表示する。 見ればわかるように、出力するフィールドの前後に HTML タグを付けることにより、 結果を表や望ましい形式にフォーマットすることは簡単である。 msql_connect() が呼ばれていない事に注意されたい。 msql_connect はリモートデータベースへの接続が要求された時にのみ、 呼ばれる必要がある。

この関数は PHP で mSQL がサポートされている場合のみ使用出来る。

msql_TableName($result,$i)

msql_TableName は、msql_ListTables() 関数に よって返される結果(result)ポインタとインデックス整数(i) をとり、 テーブルの名前を返す。 結果ポインタにおけるテーブルの数を定義するために msql_NumRows() 関数が用いられる。 例えば、

    <?
      $result = msql_listtables("dbname");
      $i=0;
      while($i <  msql_numrows($result));
        $tb_names[$i]=msql_tablename($result, $i);
        echo $tb_names[$i];
        echo "<BR>";
        $i++;
      endwhile;
    >

この関数は PHP で mSQL がサポートされている場合のみ使用できる。

$result = mysql($database,$query)

mysql は、mysql クエリーを送信する。 引数は、データベース名とクエリー文字列である。すなわち、 <?mysql("MyDatabase" , "select * from table")> この関数からの返り値は結果識別子であり、 他の mysql_ 関数により結果にアクセスするために用いられる。 結果識別子は、正の整数である。 関数は、結果識別子が作成されない場合、0 を返す。 これは、createupdatedropinsertdeleteのように結果を何も返さないクエリーの場合である。 エラーの場合に、この関数は、-1 を返す。 エラー内容を記述する文字列が $phperrmsg にセットされる。 関数が @mysql() のように呼ばれない限り、 このエラー文字列は出力も行なわれる。
この関数は、PHP において mysql がサポートされている場合にのみ 使用可能である。

mysql_affected_rows()

mysql_affected_rows() は、最後の INSERT,UPDATE,DELETE クエリーで 作用された行の数を返す。

mysql_close()

mysql_Close は mysql に対する開かれたソケット結合があるならば、 その結合を閉じる。

mysql_connect($hostname [,username [,password]])

mysql_Connect は、mysql データベースエンジンが動作する ホスト名または IP を指定する。 この関数は、mysql の C 言語 API における mysqlConnect() 関数と 等価である。 この関数の C API との唯一の違いは、この関数をコールしなくても mysql() 関数に対する最初のコールが行なわれた際にデフォルトで ローカルホストへの接続が行なわれるということである。 そして、同時に有効な接続は 1つだけであるので、mysql_close 関数を呼ぶ必要はない。 一つのファイル中で mysql_connect() の 2回目のコールを行なう場合には、 最初のホストに対する接続は自動的に閉じられる。 オプションでユーザー名とパスワードを与えることができる。 PHP が SAFE MODE で実行するようにコンパイルされている場合、 ユーザ名は、処理されるファイルの所有者または httpd プロセスの所有者(通常は、nobody)のどちらか と同じである必要がある。他のユーザ名は失敗する。

ローカルホストの mysql デーモンに明示的に接続する為に <?mysql_connect("localhost")> を使う。
この関数は PHP で mysql がサポートされている場合のみ利用出来る。

mysql_CreateDB($database)

mysql_CreateDB は与えられたデータベースを作成する。
この関数は PHP で mysql がサポートされている場合のみ利用出来る。

mysql_dbName($result,$i)

mysql_dbName は mysql_ListDbs() 関数から 返される結果(result)ポインタの $i 番目に格納されている データベース名を返す。 mysql_NumRows() 関数は有効な データベース名の数を調べるために使うことができる。
この関数は PHP で mysql がサポートされている場合のみ利用出来る。

mysql_DropDB($database)

mysql_DropDB は指定された mysql データベース (database)を削除する。 そのデータベース中の全てのデータを失うので注意して使用すること。
この関数は PHP で mysql がサポートされている場合のみ利用出来る。

mysql_FieldFlags($result,$i)

mysql_FieldFlags は指定されたフィールドのフィールドフラッグを返す。 現在、この返り値は "not null"、"primary key"、これら2つの結合、あるいは "" (空の文字列)のいずれかである。
この関数は PHP で mysql がサポートされている場合のみ利用出来る。

mysql_FieldLen($result,$i)

mysql_FieldLen は指定されたフィールドの長さを返す。
この関数は PHP で mysql がサポートされている場合のみ利用出来る。

mysql_FieldName($result,$i)

mysql_FieldName は指定されたフィールドの名前を返す。 関数の引数は結果識別子とフィールドインデックスである。 すなわち、mysql_FieldName($result,2); は、 結果識別子 (result) に結合された結果において 2番目のフィールド名を返す。
この関数は PHP で mysql がサポートされている場合のみ利用出来る。

mysql_FieldType($result,$i)

mysql_FieldType は mysql_FieldName() 関数と似ている。 引数は全く同じであるが、フィールドの型が返される。 これは、"int"、"char"、"real" のどれかである。
この関数は PHP で mysql がサポートされている場合のみ利用できる。

mysql_FreeResult($result)

mysql_FreeResult は、スクリプトを走らせる際のメモリー使用量が 多すぎると危惧される場合にのみコールする必要が生じる。 結果(result)を保持する全てのメモリーはスクリプト終了時に自動的に解放される。 しかし、スクリプト中でこれ以上結果のデータを必要としないことが確かならば、 結果識別子を引数として mysql_freeresult をコールし、 関連する結果を保持するメモリーを解放することが可能である。
この関数は PHP で mysql がサポートされている場合のみ利用できる。

mysql_insert_id()

mysql_insert_id() は、AUTO_INCREMENT フィールドで生成された ID を返す。 この関数は、引数を取らない。 この関数は、最後の INSERT クエリーが実行された際に、自動的に生成された ID を返す。

$result = mysql_ListDBs()

mysql_ListDBs は現在の mysql デーモンから利用できるデータベースを 含む結果(result)へのポインタを返す。 この結果ポインタの内容にアクセスするには、 mysql_dbName() 関数を使用すること。
この関数は PHP で mysql がサポートされている場合のみ利用できる。

$result = mysql_Listfields($database,$tablename)

mysql_Listfields はテーブル名(tablename)で指定されたテーブル に関する情報を調べる。引数はデータベース名とテーブル名である。 返り値である結果(result)ポインタは、 mysql_fieldflags, mysql_fieldlen, mysql_fieldname, mysql_fieldtype で使用 可能である。結果識別子は正の整数である。 エラーを生じた場合には関数は -1 を返す。 そのエラーについて記述した文字列が $phperrmsg にセットされる。 関数を @mysql() のように呼ばない限りこのエラー文字列の 出力も行なわれる。
この関数は PHP で mysql がサポートされている場合のみ利用できる。

$result = mysql_ListTables($database)

mysql_ListTables は mysql() 関数と同様に データベース名を引数、結果(result)ポインタを返り値とする。 この結果ポインタから実際のテーブル名を展開するには、 mysql_TableName() 関数を用いる必要がある。
この関数は PHP で mysql がサポートされている場合のみ利用できる。

mysql_NumFields($result)

mysql_NumFields は結果(result)の中のフィールド数を返す。 引数は mysql() 関数で返された結果識別子である。
この関数は PHP で mysql がサポートされている場合のみ利用できる。

mysql_NumRows($result)

mysql_NumRows は単に結果(result)の行数を返す。 引数 mysql() 関数から 返された結果識別子である。
この関数は PHP で mysql がサポートされている場合のみ利用できる。

mysql_Result($result,$i,field)

mysql_Result は返されたレコードからフィールド(field)を表示する。 引数は mysql() 関数によって返される結果識別子(result)、 表示するレコードのインデックスを示す整数およびフィールド名である。 フィールド名(field)引数は結合関数(join) からの結果を処理するために "table.field" 構文をサポートしている。 mSQL 1.0 と mysql の間の違いの一つは、mysql が結果データに 作用する関数をサポートしていることである。 それらの関数は、この関数において用いることができる。 この関数は以下の完全な例により最も良く説明されるであろう。

    <?
      $name = "bob";	
      $result = mysql($database,"select * from table where firstname='$name'");
      $num = mysql_numrows($result);
      echo "$num records found!<p>";
      $i=0;
      while($i<$num);
        echo mysql_result($result,$i,"lcase(fullname)");    
        echo "<br>";
        echo mysql_result($result,$i,"address");
        echo "<br>";
        $i++;
      endwhile;
    >

上のスクリプトはローカルマシン上の mysql エンジンに接続し、 name 変数に bob をセットする。 そして、table において firstname フィールドが bob である 全てのフィールドを検索するクエリーを送る。 見つかったレコードの数を表示した後、見つかったレコードにおいてループを 行ない、レコード毎に fullnameaddress フィールドを 表示する。 result 関数における lcase() のコールは、 返された文字列を小文字に変換する。 結果データに対して適用可能な関数の完全なリストについては、 mysql のドキュメントを参照のこと。 見ればわかるように、出力するフィールドの前後に HTML タグを付けることにより、 結果を表や望ましい形式にフォーマットすることは簡単である。 mysql_connect() が呼ばれていない事に注意されたい。 mysql_connect はリモートデータベースへの接続が要求された時にのみ、 呼ばれる必要がある。

この関数は PHP で mysql がサポートされている場合のみ使用出来る。

mysql_TableName($result,$i)

mysql_TableName は、mysql_ListTables() 関数によって返される結果(result)ポインタとインデックス整数(i) をとり、 テーブルの名前を返す。 結果ポインタにおけるテーブルの数を定義するために mysql_NumRows() 関数が用いられる。 例えば、

    <?
      $result = mysql_listtables("dbname");
      $i=0;
      while($i <  mysql_numrows($result));
        $tb_names[$i]=mysql_tablename($result, $i);
        echo $tb_names[$i];
        echo "<BR>";
        $i++;
      endwhile;
    >

この関数は PHP で mSQL がサポートされている場合のみ使用できる。

Next(変数)

Next は配列の内部ポインタを配列中の次の要素に移動させる。 配列がインデックス無し法($array[])を用いてアクセスされた時に この関数は自動的に呼ばれる。この関数は新しい要素の値を返す。 この関数は配列に明示的にアクセスすることなしに ポインタを前方へ移動させる事が出来る。 一つの使用法としては次のようなものがある。 この例では、連想配列を連続的にアクセスし、配列のキーのみを出力し 実際の内容は出力しない。

    <?
      Reset($array);
      $i=0;
      while($i < count($array));
        echo key($array);
        next($array);
        $i++;
      endwhile;
    >

OctDec(8進数)

OctDec は8進数を10進数に変換する。DecOct()も 参照のこと。

openDir(ディレクトリ)

openDir は指定されたディレクトリを開き、 ディレクトリの始めに内部ポインタを置く。 ディレクトリのエントリーは readDir 関数を 使って読まれ、 開かれたディレクトリは closeDir 関数で閉じる。

OpenLog(ident,options,facility)

OpenLog() は、後に行われる Syslog() コールのためにシステムを初期化する。 更に詳細な情報は、openlog(3) UNIX man ページを参照のこと。 InitSyslog()Syslog()CloseLog() も参照のこと。

Ora_Bind(カーソルID, PHP変数名, SQL変数名, サイズ)
Ora_Bind() は、PHP 変数を Oracle の変数に割付ける。

この関数パラメータは次のようなものである。:
カーソルID - _parsed_ SQL クエリーまたは PL/SQL ブロック用の Oracle カーソルID
PHP変数名 - '$' で始まる PHP スクリプトにおける変数名。
SQL変数名 - コロンで始まる SQL 変数名
サイズ - 変数割付時に考慮される最大バイト数

注意:
1) PHP 変数は、返されるだけの変数である場合でも サイズ バイトの長さ以上で初期化されなければならない
2) Ora_Bind() は、Ora_Parse の後で、かつ Ora_Exec の前に 使用されなければならない。 SQL 文を再解釈する場合には、全ての使用される変数は、元に戻されている 必要がある。

Ora_Bind() は、成功した場合に 0を、失敗した場合に -1 を返す。

以下に Ora_Bind() の使用例を示す。


        /* This is the PHP variable to be bound */
        $rc  = "12345";

        /* This is the SQL query. */
        $query = "SELECT * FROM my_table where my_index = :indiana";
        
        ........

        if (Ora_Parse($cursor, $query) < 0) {
            echo("Parse failed!\n")
            Ora_Logoff($conn);
            exit;
        } 

        if (Ora_Bind($cursor, "rc", ":indiana", strlen($rc)) < 0) {
            echo("Binding failed!\n")
            Ora_Logoff($conn);
            exit;
        } 

        /* Execute the SQL statement associated with $cursor and
        prepare storage for select-list items. */
        $ncols = Ora_Exec($cursor);
        
        ......

Ora_Close(接続ID)
Ora_Close() は、接続ID により定義された Oracle 接続を閉じる。成功した場合に 0、失敗した場合に -1 を返す。

Ora_Commit(接続ID)
カレントの処理(トランザクション)を 接続ID に引き渡す。 カレントの処理は、Ora_Logon() コール、 直近の Ora_Commit()、Ora_Rollback() から始まり、 Ora_Commit()、Ora_Rollback()Ora_Logoff() コールが発行されるまで続く。 Ora_Commit() は、失敗した場合に -1 (とエラーメッセージ)を返す。

Ora_CommitOff(接続ID)
Ora_CommitOff() は、Oracle 接続ID に関して autocommit (各 SQL データ操作命令毎に自動的に渡される。) をオフにする。

Ora_CommitOn(接続ID)
Ora_CommitOn() は、Oracle 接続ID に関して autocommit (各 SQL データ操作命令毎に自動的に渡される。) をオンにする。

Ora_Exec(カーソルID)
Ora_Exec() は、カーソルID に関連する SQL 命令を実行し、 選択リスト項目用の記憶領域を準備する。 返り値は、選択されたカラムの数である。エラーの場合 -1 を返す。

Ora_Fetch(カーソルID)
Ora_Fetch() は、データベースから1行分のデータを取り出す。 1 カラム分のデータが取り出された場合に 1、1カラムもデータが取り出せない 場合に 0 、エラーの場合に -1 を返す。

Ora_GetColumn(カーソルID, カラム)
Ora_GetColumn() は、返された行において指定したカラムのデータを 取り出す。 Ora_Fetch() が、Ora_GetColumn() の前にコールされて いなければならない。

Ora_Logoff(接続ID)
Ora_Logoff() は、接続ID に属するログオンデータエリアの 接続を切り、Oracle で使用されるリソースを開放する。

Ora_Logon(ユーザーID, パスワード)
Ora_Logon() は、指定したユーザーID とパスワードで PHP と Oracle データベースの接続を確立する。 成功した場合に 0 、失敗した場合に -1 を返す。

Ora_Open(接続ID)
Ora_Open() は、Oracle において SQL 命令の処理に関する情報を維持する カーソルを開く。 カーソルのインデックスを返す。失敗した場合には -1 を返す。

Ora_Parse(カーソルID, SQL命令 [, defer])
Ora_Parse() は、SQL 命令または PL/SQL ブロックを処理し、 それをカーソルに関連づける。オプションの 3 番目の引数は、 処理を延期する場合に 1 をセットする。 成功した場合に 0 、失敗した場合に -1 を返す。

Ora_Rollback(カーソルID)
Ora_Rollback() は、カレントの処理を元に戻す。 カレントの処理の定義については、Ora_Commit() を 参照のこと。

Ord(引数)

Ord は引数の最初の文字の ASCII 値を返す。

Parse_Str(引数)

Parse_str は、標準のURLエンコードされた文字列と同じ形式の文字列をとり、 変数とその値に展開する。
例えば、

    <? parse_str("a[]=hello+world&a[]=second+variable");
        echo $a[],"<br>";
        echo $a[],"<br>";
    >
は、以下のような出力を行なう。

hello world
second variable
PassThru(コマンド文字列 [,返り値])

The PassThru() 関数は内部で Unix コマンドを実行する Exec() 関数と似ている。 返り値引数が存在する場合には、ここに Unix コマンドの返り値が セットされる。 Unix コマンドからの出力がバイナリデータであり、ブラウザに直接渡す必要が ある場合には、Exec やSystem の代わりにこのコマンドを用いる必要がある。 通常、この関数を使用するのはイメージストリームを直接出力出来る pbmplus ユーティリティーのようなものを実行する時である。 content-type に image/gif を設定し、 gif を出力する pbmplus プログラムを呼ぶことにより、 イメージを直接出力する PHP/FI スクリプトを作る事が出来る。

pclose(fp)

Pclose は popen() 関数を使って開いたパイプを閉じる関数である。

pg_Close(接続ID)

pg_Close は指定された接続識別子で関連づけられる Postgres データベース への接続を閉じる。

この関数は PHP で Postgres がサポートされている場合のみ使用出来る。

$connection = pg_Connect(ホスト, ポート, オプション, tty, データベース名)

pg_Connect は Postgres データベースへの接続を開く。 それぞれの引数はポート番号を含めてクオートされた文字列である必要がある。 引数のうちオプションと tty はオプションであり、空の文字列とすることが 可能である。この関数は接続IDを返す。 この識別子は他の Postgres の関数を使用する場合に必要である。 同時に複数の接続も可能である。 エラーを生じた場合、この関数は 0 を返す。

この関数は PHP で Postgres がサポートされている時のみ使用できる。

pg_DBname(接続ID)

pg_DBname は、与えられた Postgres の接続IDが接続している データベースの名前を返す。

この関数は PHP で Postgres がサポートされている時のみ使用できる。

pg_ErrorMessage(接続ID)

有効な接続が存在する時に最新のデータベースの動作でエラーが生じた 場合には、この関数は back-end サーバにより作成されたエラーメッセージを 含んだ文字列を返す。

この関数は PHP で Postgres がサポートされている場合使用のみ使用できる。

$result = pg_Exec(接続ID, クエリー文字列)

pg_Exec は 接続ID にて指定された Postgres データベースに SQL 命令を送る。 この 接続ID は pg_Connect により返された有効な識別子で なければならない。 この関数の返り値は識別子であり、他の Postgres の関数が結果にアクセスする際に 用いられる。 この関数はエラーの時に 0 を返す。 コマンドが正常に実行されたがデータが返って来るのが期待できない場合 (例えば insert や update コマンド)には 1 を返す。 ただし、データ無し(no data)を返す select は 1 より大きな有効な result を返す ことに注意されたい。

この関数は PHP で Postgres がサポートされている場合のみ利用出来る。

pg_FieldName(結果ID, フィールド番号)

pg_FieldName は、Postgres の結果IDにおいて、指定した フィールド番号を有するフィールド名を返す。 フィールド番号は 0 から始まる。

この関数は PHP で Postgres がサポートされている場合のみ利用できる。

pg_FieldPrtLen(結果ID, 行番号 ,フィールド名)

pg_FieldPrtLen は Postgres の結果IDにおいて 指定された値の実際に出力された長さ(文字の数)を返す。 行数は 0 から始まる。 エラーを生じた場合にこの関数は -1 を返す。

この関数は PHP で Postgres がサポートされている場合のみ利用出来る。

pg_FieldNum(結果ID, フィールド名)

pg_FieldNum は、与えられた Postgres の結果IDにおいて フィールド名と一致するカラム位置の番号を返す。 フィールド番号は 0 から始まる。この関数はエラーの時に -1 を返す。

この関数は PHP で Postgres がサポートされている場合のみ使用出来る。

pg_FieldSize( 結果ID, フィールド名)

pg_FieldSize は、与えられた Postgres の結果IDにおいて フィールド名で指定されるフィールドの内部記憶領域の大きさを (バイト数で)返す。

この関数は PHP で Postgres がサポートされている場合のみ使用できる。

pg_FieldType( 結果ID, フィールド番号)

pg_FieldType は、与えられた Postgres の結果IDにおいて、 指定したフィールド番号の型の名前を含んだ文字列を返す。 フィールド番号は 0 から始まる。

この関数は PHP で Postgres がサポートされている場合のみ使用できる。

pg_FreeResult(結果ID)

スクリプト実行時にメモリ使用量が非常に多いと危惧される場合にのみ pg_FreeResult は呼ばれる必要を生じる。 スクリプト終了時にメモリは自動的に解放される。 しかし、スクリプトの中でこれ以上結果データを必要としないことが 確実である場合には、結果IDを引数として pg_freeresult 呼び出すことが可能である。 これにより、関連する結果を保持するメモリが解放される。

この関数は PHP で Postgres がサポートされている場合のみ使用できる。

pg_GetLastOid()

pg_GetLastOid は、 pg_Exec 経由で送られた最後のコマンドが SQL 挿入である場合に 挿入されたタプル(集合)に割り当てられた Oid を検索する事が出来る。 この関数は、有効な Oid があれば正の整数を返す。 エラーが起こったり、pg_Exec により送られた最後のコマンドが 挿入ではない場合に -1 を返す。

この関数は PHP で Postgres がサポートされている場合のみ使用できる。

pg_Host(接続ID)

pg_Host は与えられた Postgres の接続IDが 接続しているホスト名を返す。

この関数は PHP で Postgres がサポートされている場合のみ使用できる。

pg_NumFields(結果ID)

pg_NumFields は Postgres の結果のフィールド(カラム)数を返す。 引数は pg_Exec によって返された有効な結果IDである。 この関数はエラーの時には -1 を返す。

この関数は PHP で Postgres がサポートされている場合のみ使用できる。

pg_NumRows(result_id)

pg_NumRows は Postgres の結果の行数を返す。 引数は pg_Exec で返された有効な結果識別子(result_id)である。 この関数はエラーの時には -1 を返す。

この関数は PHP でPostgres がサポートされている場合のみ使用できる。

pg_Options(接続ID)

pg_Options は与えられた Postgres の接続IDにおいて 指定されたオプションを含む文字列を返す。

この関数は PHP で Postgres がサポートされている場合のみ使用できる。

pg_Port(接続ID)

pg_Port は与えられた Postgres の接続IDが接続するポート番号を返す。

この関数は PHP でPostgres がサポートされている場合のみ使用できる。

pg_Result(結果ID, 行番号, フィールド名/インデックス)

pg_Result は pg_Exec にて作成された結果IDから 実際の値を返す。 行番号とフィールド名は、返す結果のテーブルの中における セル位置を指定する。行番号は 0 から始まる。 フィールドを名前で指定する代わりに、前方引用符無しの番号で表した フィールドインデックスを使うことも可能である。 フィールドインデックスは 0 から始まる。

Postgres は多くの組み込み型を持っているが、 ここでは基本的な型だけが直接サポートされている。 整数(integer)、boolean や oid 型は全て整数値で返される。 浮動小数点(float)や実数(real) 型は全て倍精度値で返される。 配列を含む他の型は、同じくデフォルトの Postgres 形式で フォーマットされた文字列で返される。 これは、'monitor' や 'psql' プログラムにおいても同様である。

Postgres の結果から数値や文字列を含む PHP 配列を返す機能については、 今後のサポートを予定している。

この関数は PHP で Postgres がサポートされている場合のみ使用できる。

pg_tty(接続ID)

pg_tty は、与えられた Postgres の接続識別子(接続ID)において サーバ側のデバッグ情報出力が送られる tty 名を返す。

この関数は PHP で Postgres がサポートされている場合のみ使用できる。

phpInfo()

phpInfo は PHP/FI により処理される URL に "?info" を加えた時、 または php.cgi バイナリ自体を起動した時に得られるページと 同じページを出力する。 この関数は多くの有益な内部データを表示するので、Apache モジュール版において デバッグを行なう際に特に便利である。

phpVersion()

phpVersion は現在動作している PHP/FI のバージョンを返す。

fp = popen(コマンド,モード)

Popen はコマンドへのパイプを開き、ファイルのポインタインデックスを返す。 このファイルのポインタインデックスは、fgetsfputsfcloseで使う事が出来る。 引数は実行するコマンドとモードである。 このモードには読み取り用には "r" 、書き込み用には "w" のいずれかを用いる。 より詳細な情報は、UNIX の C ライブラリ中の popen の man ページを参照のこと。 popen で開いたファイルは、pclose() 関数で閉じる事が 出来る。

pos(配列)

Pos() 関数は、配列における要素の位置を数値で返す。 この関数は、通常の配列ではあまり役に立たないが、 連想配列では便利である。

pow(x,y)

x の y 乗を計算する。Exp() も参照のこと。

Prev(変数)

Prev は与えられた変数について内部配列ポインタを 配列中の前の要素に移動する。 既にリストの始めにある場合には、ポインタは最初の要素を指す。 この関数は新しい要素の値を返す。 この関数は連想配列を逆順に遡る時に有用である。 End() の定義における例を参照のこと。 また、Next() も参照のこと。

PutEnv(文字列)

PutEnv は環境変数に与えられた文字列をセットする。 あるページにおいて PHP の実行が終了するとローカルな環境変数は 消去されるので、非常に有効というわけではない。 しかし、ある PHP スクリプトからコールした他のプログラムが環境変数を チェックするような場合には、便利である。 例えば、複数の mSQL のデーモンプロセスを実行させたい場合、 異なったソケット間を行き来するために PutEnv を使う必要がある。

QuoteMeta(引数)

QuoteMeta は引数の中の正規表現の特殊文字を バックスラッシュでエスケープした文字列を返す。

Rand()

Rand は0からRANDMAXまでの間の乱数を返す。 rand() をコールする前に、srand() をコールして 乱数ジェネレータに乱数の種(seed)を与えることを覚えておくこと。 乱数ジェネレータに種を与えるのは、一度だけで良い。 RANDMAXはgetRandMax 関数で求めることができる。通常、戻り値に対して単に係数をかけることにより 特定の範囲を指定する。

readDir()

readDir は現在開いているディレクトリ構造の次のエントリーを読み込む。 一度エントリーが読み込まれると、ポインターはそのディレクトリの次のエントリーへ移動し、 次回のこの関数の呼出ではそのディレクトリの次のエントリーが返される。 この関数を呼び出す前にopenDir関数でディレクトリを 開くこと。

ReadFile(ファイル名)

$size = ReadFile(Filename) - は、ファイル Filename を読み込み、 これを単に直接出力する。この関数は、実際に読みこんだバイト数を返す。 この関数は、ファイルをメモリに保存しないという点で File() コマンドとは 異なっている。また、バイナリファイルに関しても安全に使用できる。 この関数は、通常、PassThru("cat filename") として行っていた ケースで使用される。ReadFile を使用する方がより効率的である。

ReadLink(パス)

ReadLinkはC言語関数のreadlinkと同様の動作をし、シンボリックリンクの内容または エラー時に-1を返す。LinkInfoも参照のこと。

reg_Match( 正規表現,引数文字列[,regs])

reg_Matchは引数文字列に正規表現がマッチするとゼロでない数字を返す。 例えば、<?if (reg_match("^This.*","This is an example string")> は"^This.*"がThisという語が先頭にある文字列で その後はどのような文字にもマッチするため真を返すであろう。 引数regsがある場合には、 マッチレジスタの値が引数regsという名前の配列の0〜10の位置に代入される。 レジスタ 0 には常にマッチした文字列全体が代入される。正規表現の詳細については、 この文書の正規表現の節を参照のこと。

reg_replace( 正規表現,置換文字列,引数文字列)

reg_Replace は引数の文字列を全て検索し、表現にマッチした文字列の部分を全て 置換文字列に指定されたものに置き換える。例えば、"This is an example string" という文字列について、次のようなコマンドを用いて非常に簡単に すべての空白文字をダッシュに置き換えることができる。 reg_replace(" ","-","This is an example string") 正規表現の詳細については、この文書のこの文書の正規表現の節を参照のこと。

reg_Search( 正規表現,引数文字列[,regs])

reg_Search は引数の文字列の全てについて与えられた正規表現に マッチするものを検索する。 もしマッチするものが見つかったならば、マッチが成立したところから始まる 文字列の部分を返す。 もしマッチするものが見つからない場合には、長さゼロの文字列が戻される。 引数regsがある場合には、マッチレジスタの値が引数regs という名前の配列の0〜10の位置に代入される。レジスタ 0 には常にマッチした文字列全体が代入される。 正規表現の詳細については、この文書の正規表現の節を参照のこと。

Rename(old,new)

Rename はファイルの名前を old から new に変更する。 Unix C の rename()関数と同様である。

Reset(変数)

Reset は与えられた配列変数について、内部ポインタをその配列の先頭に移動し、 そのアイテムの値を返す。この関数は連想配列または添字無し配列の内部で移動する 際に便利である。End()Next()も参照のこと。 次の例は連想配列中を移動するものである。

    <?
      Reset($array);
      $i=0;
      while($i < count($array));
        echo $array[]; /* pointer automatically moves ahead one */
        $i++;
      endwhile;
    >

return(値)

Return は現在の関数呼出を終了し、指定された値を呼出元に返す。 より詳しい情報についてはユーザ定義関数を参照のこと。

rewind(fd)

rewind() は引数 fd で指定されたファイルポインタをリセットする。 引数 fd は fopen()の戻り値である。 ファイルポインタはファイルの先頭に置かれる。 ftell()fseek()も参照のこと。

rewindDir()

rewindDir は現在のディレクトリポインタをそのディレクトリの先頭に戻す。 この関数を使用する前にopenDir関数でディレクトリを 開かなくてはならない。

RmDir(ディレクトリ)

RmDir() は与えられたディレクトリを削除する。通常のファイルについては Unlink()関数を参照のこと。

SetCookie(name,value,expire,path,domain,secure)

SetCookie() はヘッダー情報に付随して送られるクッキー(cookie)を定義する。 name 引数以外の引数はすべてオプションである。もし name 引数のみが与えられた場合、 name で指定されたクッキー(cookie)はリモートのクライアントから削除される。 また特定の引数を空文字列("")に替えることにより、 その引数をスキップすることもできる。 引数 expire と secure は整数であり、空文字列でスキップすることはできない。 ゼロ(0)を代わりに使用する。引数 expire はtime()またはmktime() 関数の戻り値である通常の Unix の時間整数である。幾つかの例を次に挙げる。

    SetCookie("TestCookie","Test Value");
    SetCookie("TestCookie",$value,time()+3600);  /* 1 時間で期限切れとする */
    SetCookie("TestCookie",$value,time()+3600,"/~rasmus/",".utoronto.ca",1);

クッキー(cookie)の値の部分は、送るときには自動的に URLエンコードされ、受け取る時には 自動的に URLデコードされて、クッキー(cookie)の名前と同じ名前の変数に格納される。 すなわち、上記スクリプト中の test cokkie の内容を見るには、次のようにするだけで良い。

    echo $TestCookie;
SetErrorReporting(引数)

SetErrorReporting は現在のエラーレポート状態を引数の値にセットする。 もしゼロでない値が与えられた場合エラーは表示され、0の場合表示されない。 関数の戻り値はそれまでのエラーレポート状態である。 これは個々の関数に'@'文字を先頭につけるよりも、より一般的な エラーレポートをしないようにするための手続きである。 より詳しい情報については関数呼出時のエラー抑制の章を参照のこと。

SetLogging(引数)

SetLogging() はページについてのアクセス統計のログを有効または無効にする。 引数がゼロでない場合にはログは有効になり、ゼロの場合には無効になる。

SetShowInfo(引数)

SetShowInfo() は PHP を通してロードされたページの下部にある フッター情報を有効または無効にする。引数がゼロでない場合、 フッターは有効になり、ゼロの場合無効になる。

SetType(変数,型)

SetType は変数の型をセットする。引数の型は、 "整数(integer)"、"倍精度小数(double)" もしくは"文字列(string)"のいずれかである。 GetType()関数も参照のこと。

shl(n,b)

n を左に b ビット分シフトする。

shr(n,b)

n を右に b ビット分シフトする。

Sin(引数)

Sin は引数のサイン値をラジアンで返す。Cos()Tan()も参照のこと。

Sleep(secs)

Sleep は secs 秒の遅延を行なう。Unix C の sleep()関数と同様である。 USleep() 関数も参照のこと。

Solid_Close(接続ID)

Solid_Close は、与えられた接続識別子(接続ID) に関連する Solid サーバーへの結合を閉じる。

この関数は、PHP において Solid がサポートされている場合にのみ 使用可能である。

$connection = Solid_Connect(データソース名, ユーザー名, パスワード)

Solid_Connect は、Solid サーバーへの結合を開く。 各引数は、前方引用符で囲まれた文字列でなければならない。 最初のパラメータ(データソース名)は、空の文字列とすることが可能である。 この場合、localhost 上のデフォルトのサーバーに結合される。 この関数は、接続IDを返す。 この識別子は、他の Solid 関数の実行時に必要である。 複数の接続を同時に開くことが可能である。 エラーの場合に、この関数は 0 を返す。

この関数は、PHP において Solid がサポートされている場合にのみ 使用可能である。

$result = Solid_Exec( 接続ID, クエリー文字列)

Solid_Exec は、SQL 文を 接続ID で指定された Solid サーバーに送る。 接続ID は、Solid_Connect により返された有効な識別子でなければならない。 この関数の返り値は識別子であり、他の Solid 関数が結果にアクセスする際に用いる。 エラーの際に、この関数は0 を返す。 コマンドは正しく実行されたが、返り値データが期待できない場合 (例えば、insert や update)には、1 を返す。 データを返さない selects は、1 より大きな有効な結果を返すことに注意されたい。

この関数は、PHP において Solid がサポートされている場合にのみ 使用可能である。

Solid_FetchRow(結果ID)

Solid_FetchRow は、Solid_Exec より返されたデータから1行を取り出す。 Solid_FetchRow が呼ばれた後、その行のフィールドは、Solid_Result により アクセス可能である。 Solid_FetchRow が成功した場合には、(新たに1行が作成される)1 が返される。 行がもう存在しない場合には、Solid_FetchRow は、0 を返す。 Solid_FetchRow の返り値は、while ループの条件として用いることが可能である。

この関数は、PHP において Solid がサポートされている場合にのみ 使用可能である。

Solid_FieldName( 結果ID, フィールド番号)

Solid_FieldName は、Solid の結果IDにおいて、指定した フィールド番号を有するフィールド名を返す。 フィールド番号は 0 から始まる。

この関数は PHP で Solid がサポートされている場合のみ利用できる。

Solid_FieldNum( 結果ID, フィールド名)

Solid_FieldNum は、与えられた Solid 結果IDにおいて フィールド名が一致するカラム位置の番号を返す。 フィールド番号は 0 から始まる。この関数はエラーの時に -1 を返す。

この関数は PHP で Solid がサポートされている場合のみ使用出来る。

Solid_FreeResult(結果ID)

スクリプト実行時にメモリ使用量が非常に多いと危惧される場合にのみ Solid_FreeResult は呼ばれる必要を生じる。 スクリプト終了時にメモリは自動的に解放される。 しかし、スクリプトの中でこれ以上結果データを必要としないことが 確実である場合には、結果IDを引数として Solid_FreeResult 呼び出すことが可能である。 これにより、関連する結果を保持するメモリが解放される。

この関数は PHP で Solid がサポートされている場合のみ使用できる。

Solid_NumFields(結果ID)

Solid_NumFields は Solid の結果のフィールド(カラム)数を返す。 引数は Solid_Exec によって返された有効な結果IDである。 この関数はエラーの時には -1 を返す。

この関数は PHP で Solid がサポートされている場合のみ使用できる。

Solid_NumRows(結果ID)

Solid_NumRows は Solid の結果の行数を返す。 引数は Solid_Exec で返された有効な結果IDである。 この関数はエラーの時には -1 を返す。 重要な注意点: SOLID SQL サーバーは、ODBC をプライマリインターフェース(そして、唯一の) として用いている。 SolidNumRows() は、行の数を得るために低位の関数として SQLRowCount を用いている。 SQLRowCount は、マイクロソフトの古くさい伝統にしたがっており、 不必要な制限、奇妙な例外、その他の妙な現象を生じる。 このような現象とは、次のようなものである。 この関数は、INSERT、UPDATE、DELETE 構文により作用された行の数を 返すが、SELECT については返さない! 実用面では、 SQL の count() 命令や行の数を数える while-loop を試すことが可能である。 SELECT 構文の実行により読み込まれたレコードの数を表示するために Solid_NumRows() を必要とする場合には、代わりに Solid_FetchRow() からの返り値を チェックしてみること。 つまり、以下の代わりに:

     $num = Solid_NumRows();
    $i=0;
    while ($i < $num) {
        /* 結果の表示... */
        $i++;
    }

次を試してみる良い。:

    while(Solid_FetchRow($result)) {
        /* 結果の表示... */
    }

この関数は PHP で Solid がサポートされている場合のみ使用できる。

Solid_Result( 結果ID, フィールド名/インデックス)

Solid_Result は Solid_Exec にて作成された結果IDから 実際の値を返す。 フィールド名は、行の中でどのセルを返すかを指定する。 フィールドを名前で指定する代わりに、前方引用符無しの番号で表した フィールドインデックスを使うことも可能である。 フィールドインデックスは 0 から始まる。

この関数は PHP で Solid がサポートされている場合のみ使用できる。

Sort(配列)

Sort は PHP の配列を昇順にソートする。 降順にソートする場合は、RSort()関数を使用のこと。 3 種の変数型を理解し、 文字列型ならアルファベット順に、また配列が数値ならば数値的にソートする。 配列にいろいろな型が混ざっている場合には、 配列の一番先頭の型がソートの手段として用いられる。

連想配列のソートを行う場合には、ASort()関数を用いる必要が あることに注意されたい。

Soundex(文字列)

この関数は、文字列引数をとり、soundex キーを文字列 として返す。soundex キーには、同じように発音される単語は 同じ soundex キーとなるという特性がある。これにより、 発音は知っているがスペルは知らない場合にデータベースを検索する ことを簡単化するために使用することが可能である。 この soundex 関数は、ある文字で始まる 4 文字の長さの文字列を返す。
このタイプの soundex 関数は、Donald Knuth により "The Art Of Computer Programming, vol. 3: Sorting And Searching", Addison-Wesley (1973), pp. 391-392 で記述されている。
例:

   Euler と Ellery は、E460 にマップされる。
   Gauss と Ghosh は、G200 にマップされる。
   Hilbert と Heilbronn は、H416 にマップされる。
   Knuth と Kant は、K530 にマップされる。
   Lloyd と Ladd は、L300 にマップされる。
   Lukasiewicz と Lissajous は、L222 にマップされる。
     

Sprintf(format,arg [,arg,arg,arg,arg])

Sprintf は、引数 format と arg によって定義されたフォーマット済み出力の 文字列を返す。この関数は、フォーマット指定付きの echo コマンド と似ているが、echo がそれを表示するのに対して、これは単に文字列を返すだけである。 また、これは C 言語の同名の関数にも似ている。 違いは、このバージョンでは 6 つ以上の arg 引数をとることができないと いう点である。一つの文字列において 6 つ以上の引数をフォーマットする 必要がある場合には、単純に引数の各グループについて sprintf() を複数回コール すること。引数の型は、出力に対して何の影響も与えないところに注目されたい。 引数の型は、自動的に(かつ魔法の様に) フォーマット文字列に指定された型に一致するように変換される。

Sqrt(引数)

Sqrt は引数の平方根を返す。

Srand(整数)

Srand は乱数発生のシード(seed)を行なう。 この関数は引数にどのような整数でも取る。 シードの値としての一つの選択は、date関数で現在の秒を使うことである。 この関数は戻り値を持たないことに注目されたい。 この関数は単に、後のrand()関数の呼び出しのための乱数発生のシードを行なうのみである。 例として以下のようになる。

	<?srand(date("s"))>

strchr(文字列,引数)

strchr と strstr はまったく同一の関数である。 両者は交換可能であり、両者とも完全性のために導入されている。 第二引数が見つかった場所から始まる引数 string の部分が返される。 例えば、上記の"This is an example string" という文字列において、 <echo strctr($string,"an ")>という呼び出しは "an example string"という文字列を返す。

strtr(input,set1,set2)
strtr() は、"string" 中の各文字において "set1" にある文字を対応する"set2" にある文字 に変換する。 set1 にない文字は、変更されない。 ある文字が "set1" に2度以上現れ、対応する文字が全て同じでない 場合には、最後に指定された文字で置換される。 "set1" または "set2"のどちらかが長い場合には、 短い側の長さまで短かくされる。

StripSlashes(引数)

StripSlashes は、文字引数よりエスケープ文字を取り除く。 AddSlashes()も参照のこと

strlen(文字列)

strlen は文字列の長さを返す。

strrchr(文字列,引数)

strrchr は引数の終りから始めて逆向きに 1文字を検索する。 検索文字が見つかればその文字から始まる文字列を返し、 見つからなければ空の文字列を返す。

strstr(文字列,引数)

strstr と strchr はまったく同一の関数である。 両者は交換可能であり、両者とも互換性のために導入されている。 第二引数が見つかった場所から始まる引数文字列の部分が返される。 例えば、上記の"This is an example string" という文字列において、 <echo strstr($string,"an ")>という呼び出しは "an example string"という文字列を返す。

strtok(文字列,トークン)

strtok は文字列をトークン毎に分けるのに使用する。つまり、 "This is an example string"という文字列を持ち、 それらを個々の単語のトークン毎に分けたい場合には、空白文字をトークン として用いる。 次のようなスクリプトコードを使うことを考える。

	<?
	  $string = "This is an example string";
	  $tok = strtok($string," ");
	  while($tok);
		  echo "Word=$tok<br>";
		  $tok = strtok(" ");
	  endwhile;
	>

一番最初の strtok の呼び出し時にのみ引数 string が使用されることに 注目されたい。 その後の strtok の呼び出しには、現在までの文字列上の軌跡を保持しているため、 トークン毎の区切りのみが必要となるだけである。再度始める場合や 新しい文字列をトークン毎に分けたい場合には、単に strtok に引数 string を 再度付けて呼び出し初期化する。 arg パラメータにおいて複数のトークンを送る可能性が あることに注意されたい。 引数においてトークンのどれか一つが見出された時に、 文字列はトークン毎に分割される。

strtolower(文字列)

strtolower は引数文字列のすべてを小文字に変換する。

strtoupper(文字列)

strtoupper は引数文字列のすべてを大文字に変換する。

strval(変数)

strval はその変数の文字列としての値を返す。 関数intval()doubleval()も参照のこと

substr(文字列, start, length)

substr は与えられた文字列の一部を返す。スタート位置は引数 start で与える。 文字列の一番先頭は位置 0 である。 そして、引数 length にはスタート位置から何文字を 返すかを指定する。

sybSQL_CheckConnect()

この関数は、データベースへの接続が確立されている時に1、そうでない時 に0を返す。

sybSQL_DBuse(データベース)

この関数は、指定したデータベースについて Sybase Transact-SQL の use コマンドを発生する。 関数の唯一の引数は、使用するデータベース名(database)である。 例えば、: sybsql_dbuse("pubs2");

この関数は、成功した場合に 1、失敗した場合に 0 を返す。

sybSQL_Connect()

この関数は、sybase サーバーに対するネットワーク結合をオープンする。 この関数は、コールする前に呼出す側によりセットされる幾つかの環境変数に 依存する。

この環境変数を以下に示す。:

DSQUERY - sybase インターフェースファイルにおいて定義された sybase サーバーの別名(エイリアス)。
DBUSER - このユーザー名で sybase サーバーに接続する。
DBPW - そのユーザーのパスワード。

これらの変数は、幾つかの手段でセットすることができる。 php/fi が CGI プログラムとして実行されている場合には、 これらの変数をセットするために shell ラッパーを 用いることができる。 あるいは、PHP/FI の組み込み関数 putenv() を用いて、これらの変数を HTML ページにおいて直接セットすることができる。 putenv() によりそれらの値を直接使う 代わりに、値をフォーム入力から得ることも可能である。 変数をファイルに定義して、PHP/FI の include 命令で html ファイルに 読み込むことも可能である。

この関数は、成功した場合に 1、失敗した場合に 0 を返す。

sybSQL_Exit()

この関数は、Sybase 接続を強制的にシャットダウンする。 この関数がコールされない場合には、 PHPページは完全に実行された時に自動的に接続が閉じられる。 よって、この関数の呼び出しはオプションである。

sybSQL_Fieldname(フィールド番号)

この関数は、通常の結果の列のフィールド名を返す。 関数の引数は、フィールド番号である。 例: sybsql_fieldname(0); 注意: フィールド番号は 0 から始まる。

結果の列は、いかなる名前も持たない場合には、この関数は 空の文字列("")を返す。

sybSQL_GetField(フィールド)

この関数は、結果のカレント行において指定した列の値を取り出す。 この関数の引数は、フィールドを指定する文字列のみである。 例: $value=sybsql_getfield("@10"); 注意: この関数をコールする前に sybsql_nextrow() をコールしなければならない。 この関数は行バッファにおいてカレント行のみを読むため、 行ポインタを増やす必要がある場合には sybsql_nextrow() を呼ぶ必要がある。

指定した列がある値を有する場合には、この関数はその値を文字列として返す。 そうでない場合は、空の文字列 ("") を返す。

sybSQL_IsRow()

この関数は、カレント SQL コマンドが行を返したかどうかを示す。 この関数は、SQL コマンドが行を返した場合は 1 を返す。 また、このコマンドがいかなる行を返さなかった場合は、0 を返す。

sybSQL_NextRow()

この関数は、行ポインタを次の結果の行に増やす。

この関数は、読むことが可能な行がある限り 1 を返す。 読むことが可能な行がもうない場合や、関数がエラーとなった場合は 0 を返す。

sybSQL_NumFields()

この関数は、カレントの結果行におけるフィールドの数を返す。

関数は、カレントの結果行における行の数を返す。 フィールドがない場合には、この関数は、0 を返す。

sybSQL_NumRows()

この関数は、カレントの結果バッファにおける行の数を返す。 注意: この関数がコールされる際、最初の行を直ちに探索する。 続いて、もうこれ以上行がないところまで dbnextrow() をコール する。 この際、 結果バッファにおける行の数を計算するために内部カウンタを増やしていく。 そして、最初の行へポインタは戻る。 そこで、この関数をコールした後、行カウンタは最初の行をいつも 指すことになる。 これは、汚い仕方だが、現在、他の手段を見出していない。

結果バッファに行がない場合、この関数は、0 を返す。

sybSQL_Query(文字列)

この関数は、Sybase SQL クエリーのリクエストをサーバーに送る。 この関数に対する引数はクエリー文字列のみである。 例: $rc=sybsql_query("select * from authors");

この関数は、クエリーの解釈が成功した成功した場合に 1、 リクエストが失敗した場合に 0 を返す。

sybSQL_Result(string)

この関数は、カレントの結果の行において、指定したフィールドを出力する。 この関数に対する唯一の引数は、出力するフィールドに関する情報を保持する 文字列(string)のみである。 フィールドは、@ とその後に続く数字で指定される。 例えば、@0 は最初の行を表し、@10 は 11 行目を表す。 フィールド番号は 0 から始まることに注意されたい。 この関数は、おそらく次の完全な例で最もうまく説明できるであろう。:

<?
    /*
    ** コネクションに必要な全ての変数は既にセットされていると仮定する。 
    ** 注意して欲しいのは、エラーチェックを行っていないことである。
    ** 関数のリターンコードは常にチェックする必要がある。
    */

    /* コネクト */
    $rc=sybsql_connect();

    /* pub2 データベースを使用する。 */
    $rc=sybsql_dbuse("pubs2");

    /* SQL リクエストを送信する。 */
    $rc=sybsql_query("select * from authors");
    $i=0;

    /* 返された行の数を得る。 */
    $nrows=sybsql_numrows();

    /* テーブルを始める。 */
    echo "<table border>\n";
    /*
    ** 最初と2番目のフィールドのみを表示
    */
    while($i<$nrows) {
        sybsql_result("<tr><td>@0</td>@1</td></tr>\n");
        $i++;
    }
    /* テーブルを終る。 */
    echo "</table>\n";
>

上の例では、出力をフォーマットするために HTML テーブルを用いている。 もちろん、他のあらゆる有効な HTML タグを使用することが可能である。

sybSQL_Result_All()

この関数は、カレントの結果バッファにおいて全ての行を表示する。 結果は、ハードコードされた HTML テーブルフォーマットで出力される。 この関数をループの内部で呼び出してはならないことに注意されたい。 この関数は、出力に列のヘッダーがある場合には、列の名前を出力する。

sybSQL_Seek(row)

この関数は、行バッファにおけるカレント行として指定された行番号(row)を セットする。この関数の引数は、行番号のみである。例: $rc=sybsql_seek(10); 行番号は、0 から始まることに 注意されたい。

この関数は、探索に成功した場合は 1 、探索に失敗した場合は 0 を返す。 カレント結果バッファの全ての行を見終った時、行ポインタは最後の行を指す。 後戻りしたり、更にいくつかの行を見る必要がある場合、 この関数はこの目的のために使用することができる。

Symlink(target,link)

Symlink() はシンボリックリンクを作る。ハードリンクを作るには Link()を参照のこと。

Syslog(level,message)

Syslog() は、UNIX の syslog(3) 関数を用いてメッセージをシステムに記録する。 更に詳細な情報は、UNIX マニュアルを参照されたい。 InitSyslog()OpenLog()CloseLog() も参照のこと。

System( コマンド文字列 [,返り値])

System は C のsystem()コマンドと同様であり、与えられた unix コマンドを実行し、 その結果を出力する。第二引数として変数が与えられた場合には、 その実行された unix コマンドのリターンステータスが格納される。 但し、ユーザーからの入力をこの System 関数に渡す際には、 EscapeShellCmd()関数を使用し、 ユーザーがシステムを欺いて任意のコマンドを実行することを防止する必要がある。 System() コールは、PHP が Apache モジュールとして実行されている場合、 自動的に Apache 出力バッファのフラッシュも行う。 あるコマンドを実行し、なんらかのインターフェース無しにコマンドから 全てのデータを直接受け取る必要がある場合には、 PassThru() を使用すること。 Exec関数も参照のこと。

Tan(引数)

Tan は引数のタンジェント値をラジアンで返す。 Sin()Cos()も参照のこと。

TempNam(パス, プレフィックス)

TempNam は、パスで示されたディレクトリに置かれる、 プレフィックスで始まる 一意なファイル名を返す。これは、Unix C の tempnam() 関数と同一である。

Time()

Time は単純に Unix の epoch (00:00:00 Jan. 1 1970)から ローカルタイムで何秒経過しているかを返す。これはDate("U") と同義である。秒単位よりも正確なものが必要ならば、Microtime 関数を使用のこと。

Umask([mask])

Umask(mask) は、PHP の umask を mask & 0777 に セットし、古い umask を返す。 PHP/FI が Apache モジュールの場合、PHP/FI が終了した際に Apache の古い umask に戻される。 mask は、ChMod() と同様に 8 進表記で指定しなければならない。 引数無しの Umask() は、単に現在の umask を返す。

UniqId()

UniqId は、マイクロ秒で表された現在の時刻に基づいて 接頭辞付きのユニークな識別子を返す。 例えば、幾つかのホストで同時に同じマイクロ秒において 識別子を作成する場合には、接頭辞(prefix)は便利である。 接頭辞は、最大 114 文字の長さとすることができる。

Unlink(ファイル名)

Unlink はファイル名で与えられたファイルを削除する。Unix C の unlink()関数と同様である。 ディレクトリを削除するには、RmDir()関数を参照のこと。

UnSet($var)

UnSet 与えられた変数を未定義にする。配列の場合には、配列のすべての要素がクリアされる。 このコマンドで個々の配列要素を未定義にすることも可能である。

UrlDecode(引数)

UrlDecode はUrlEncode関数でエンコードされた 文字列をデコードする。典型的な使用においては、URL エンコードされた文字列が ページ間を移動した場合には自動的にデコードされるため、デコードは必要ない。 しかしながら、完全性のためにこの関数は採り入れられた。

UrlEncode(引数)

UrlEncode は引数の "a-zA-Z0-9_-." に含まれない文字を ASCIIコードの16進数 xx で表示される %xx に変換してエンコードする。 エンコードされた文字列が戻り値となる。

USleep(マイクロ秒)

USleep は与えられた数ぶんのマイクロ秒の遅延を行なう。 Unix C の usleep()関数と同様である。Sleep()関数も参照のこと

Virtual(ファイル名)

Virtual は Apache サーバー専用の関数で、mod_include での <!--#include virtual...--> と同義である。Apache のサブリクエスト として動作する。これは CGI スクリプトを取り込む時や、.shtml ファイル、または その他の Apache を介して解釈を行ないたい場合に有用である。 (.phtml ファイルについては、<?Include> を使いたいところであろう。)


自作の内部関数を PHP/FI に加える方法

PHP/FI により提供される一連の関数の中に自分が必要とする特定の関数が 含まれていないということは充分ありえることである。 以下に記述される手順を注意深く実践することにより、 自作の関数を PHP/FI に加えることが可能である。

PHP/FI の内部をハックする前に、最新版の Bison を用意しておく必要がある。 Bison は YACC (Yet Another Compiler Compiler) の GNU 版である。 システムにもともとある YACC でもあるいは充分かもしれないが、 念のため Bison を手にいれておくこと。 Bison は、 ftp://prep.ai.mit.edu/pub/gnu で見つけることができる。

Makefile を見て、デバッグをオンにすること。 これを行なうには、 Makefile 中の DEBUG がある行の コメントを無効とするだけで良い。 デバッグ情報の出力ファイル は、php.h の中の DEBUG_FILE で指定されている。 デフォルトは、/tmp/php.err にセットされている。 必要に応じてこれは変更可能である。

最後の注意点は、setuid ビットをセットして実行しない限り php は自分のシステムにおける httpd と同じユーザーID で実行されるが、この httpd を実行するユーザーは通常様々なディレクトリに 書き込む権限を有さないということである。 このことは、php がコアダンプを生じるようなことを行なった場合に、 コアファイルを得ることができないことを意味する。 簡単な解決策は、test.html を置くディレクトリを 全てに対して書き込み可能とすることである。 PHP は、カレントディレクトリを読み込み中の .html ファイルのあるディレクトリに変更するので、 可能ならばそこにコアをダンプする。

関数を加える方法について Time() 関数を用いて 以下に順をおって説明を行なう。

手順 1 - 関数の文法を定義する

関数の引数が 0 から 6 である場合には、 あらかじめ定義された文法が使用可能である。 この場合には、次の手順を飛ばすことができる。

関数の文法は、parse.raw ファイルで定義される。 最初に加えるのは、トークンである。 トークンは大文字のキーワードであり、通常は関数名と同じである。 全てのトークンは、parse.raw ファイルの最初の方で定義される。 順序は問わない。 次に実際の YACC 文法ルールを構築する必要がある。 記述済みのルールを見て自分が加える関数に似たものを見つけること。 最も一般的な関数は引数を表現スタックから読む標準的関数であることを 覚えておくこと。 parse.raw ファイルをいじる必要がない場合には、 あなたの関数はたいていこのグループに分類されるであろう。

手順 2 - 関数を字句解析用ハッシュテーブルに加える

これを行なうには、lex.c を編集し、 ファイルの先頭付近のハッシュテーブルを見つけること。 このテーブルを見つけるには、ハッシュテーブルの始まりを定義する static cmd_table_t cmd_table[22][30] = { の行を探すこと。 [22][30] はハッシュテーブルを保持する2次元配列の大きさを 定義する。 22 は関数名の長さの最大値に1を加えたものである。 30 は各々のハッシュリストにおける関数の最大数を表す。 もし、これらの制限のどちらかを越えたい場合には、 これらの値を増やせば良い。

このハッシュテーブルは恐らく世界一簡単なハッシュテーブルとして 記録されるだろう。 ハッシュ値はハッシュされる関数名の文字列の長さである。 つまり、Time() の例においては、 ハッシュ値 4 のエントリを加える必要がある。 そこで、4 のハッシュリストに次の行を加える。:

      { "time",INTFUNC0,UnixTime },

このエントリは、(クオートで囲われた)文字列を INTFUNC0 トークンに割り付ける。 INTFUNC0 トークンについての文法は parse.raw で見つけることが できる。これより、INTFUNC0 トークンは 引数が 0 個の内部関数に関する一般的文法であることがわかるだろう。 上でクオートで囲われた文字列は、 .html ファイル中で関数を呼ぶ際に用いる実際の文字列である。 PHP/FI の関数名は大文字と小文字を区別 しない ということ に注意すること。 そして、リストの最後の要素 UnixTime は、 コールされる実際の関数である。

手順 3 - 実際の関数の記述

標準的なC関数の呼び出し規約を通じて呼び出し可能であり、 システム上のリンカーが取り扱うことが可能な オブジェクトファイルかライブラリファイルのどちらかを作成する手段を 有している限り、関数を好きな言語で書くことができる。 一般的な例として、ここでは C 言語で関数を書くと仮定する。 PHP/FI の組み込み関数は全て C 言語で書かれている。 Time() 関数、あるいは PHP において内部的にコールされる UnixTime() は、date.c 中に見つけることができるが、 これは次のようなものである。:

void UnixTime(void) {
    char temp[32];

    sprintf(temp,"%ld",(long)time(NULL));
    Push(temp,LNUMBER);
}

この関数は、void 型である。 これは、この関数が戻り値を持たないことを意味する。 この関数は当然時間を返す手段を有していなければならないので、 このことは、混乱を招くかもしれない。 時間は返されるが、関数の戻り値としてではない。 時間は、辞句スタック (expression stack) と呼ばれるものにプッシュされる。 辞句スタックは、単に文字列のスタックであり、連想型である。 PHP/FI は、3 つの基本的な変数型のみを理解する。: これらは、STRING, LNUMBER と DNUMBER である。 STRING は文字列、LNUMBER は long 整数、DNUMBER は倍精度実数もしくは、 浮動小数点数である。 この Time() の例では、戻り値は Unix フォーマット (1970 年 1 月 1 日からの秒数)で表現された時間であり、 よって整数である。 式スタックは、文字列のみを受け入れるので、long 整数を sprintf 関数 により文字列に変換し、スタックへとプッシュする。 その際、次のように実際には long 整数であることを示す。 : Push(temp,LNUMBER);

手順 4 - 関数プロトタイプを php.h へ加える

php.h ファイルの後半部に、php 関数全部のプロトタイプの完全な リストを見つけることができる。 これらは、存在するファイル毎にグループ化されている。 プロトタイプをこのファイル中の適当な場所に加えるだけである。 Time() の例では、次のような行を加える。:

void UnixTime(void);

手順 5 - コンパイル

parse.raw ファイルを変更した場合には、忘れずに パーサを再構築する必要がある。 これを行なうには、次のように入力する。
: make parser
PHP パーサを作成するためには、BISON バージョン 1.25 以上が 必要である。 この後、続いて次のように入力し通常のコンパイルを行なう。
:make

手順 6 - 加えた関数を送って下さい!

自分の関数を PHP/FI の次の版に加えたい時は、私に送って下さい。 送る際の最良の手法は、多分、文脈依存型の差分 (context-sensitive diff) を作ることであろう。 これを作るには、修正前の配布ファイルが必要である。 変更したファイルについて diff -c を実行し、 元のファイルと変更後のファイルを比較する。 parse.c は自動的に作成されるので、 このファイルに関する変更の差分ファイルを私に送らないこと。 代わりに、parse.raw からの差分を送ること。

Time() の例では関数を加える際に必要な手順を説明した。 加えたい関数がこの例よりも多少複雑な場合もあるだろう。 多くの場合、自分の関数に引数を渡し、 なんらかの方法で操作可能であることが望まれるであろう。 異なった手法で関数を呼び出し可能であることも 望まれるであろう。 この概念をPHP/FI の crypt() 関数で説明しよう。 PHP/FI のコードを書く際のより技術的な詳細については、 コードハックに関する記述という 節も参照のこと。

parse.rawにおける Crypt() の文法は、:

%token CRYPT
        .
        .
        .
    | CRYPT '(' expr ',' expr ')'
        {
            if(GetCurrentState(NULL) || inCase || inElseIf) Crypt(1);
        }
    | CRYPT '(' expr ')'
        {
            if(GetCurrentState(NULL) || inCase || inElseIf) Crypt(0);
        }

ここには、引数が 1 つか 2 つのどちらかである関数を呼び出すための 文法を定義する仕方が示されている。 これら 2 つのケースを扱うために別の関数を書くことができる。 あるいは、ここで行なわれているように関数が呼び出されたモードを示す モードパラメーターを単純に送ることもできる。 この場合は、関数が引数の数を変数とすることができるので、 あらかじめ定義された INTFUNCn 文法のうちの一つを使うと いうことはできない。

この例では、実際の関数における引数の表現法についても示されている。 多くの場合、expr 定義子の使用が望まれるであろう。 この定義子は、引数が表現式(expression)であることを意味する。 表現式は、リテラル値、関数コールあるいはいくつかの表現式の組み合わせとする ことができる。 表現式に用いる yacc 文法定義の詳細は parse.raw を参照のこと。

lex.cにおけるハッシュテーブルのエントリは 次のようなものである。:

      { "crypt",CRYPT,NULL },

この場合、 関数の呼び出しは直接 parse.raw で取り扱われるので、 最後の項は NULL である。 INTFUNCn 文法を使用している場合には、 この NULL のある場所にその関数名を書く。 crypt.c における実際の Crypt() 関数を次に示す。:

/*
 * If mode is non-zero, a salt is expected.
 * If mode is zero, a pseudo-random salt will be selected.
 */
void Crypt(int mode) {
#if HAVE_CRYPT
	Stack *s;
	char salt[8];
	char *enc;
	
	salt[0] = '\0';
	if(mode) {
		s = Pop();
		if(!s) {
			Error("Stack error in crypt");
			return;
		}
		if(s->strval) strncpy(salt,s->strval,2);
	}
	s = Pop();
	if(!s) {
		Error("Stack error in crypt");
		return;
	}
	if(!salt[0]) {
		salt[0] = 'A' + (time(NULL) % 26);
		salt[1] = 'a' + (time(NULL) % 26);
		salt[2] = '\0';
	}
	enc = (char *)crypt(s->strval,salt);
#if DEBUG
	Debug("Crypt returned [%s]\n",enc);
#endif
	Push(enc,STRING);	

#else
	Error("No crypt support compiled into this version");
#endif
}

この関数の最も重要な部分は、s = Pop() を呼び出しているところである。 関数に対する引数は、式スタックから一つずつポップすることにより 取得しなければならない。 複数の引数をとるような関数を書く際には、 式スタックは、後入先出(LAST-IN,FIRST-OUT)であるということを 覚えておかねばならない。 このことは、引数を式スタックから逆順で除くことを意味する。 最後の引数は最初に除かれる。 上記の例では、2 個の引数を有するモードかどうかをチェックしている。 もし、そうであるならば、式スタックから引数を取り除き保存する。 つづいて次の引数を式スタックから取り除く。 Pop() は、スタック構造体へのポインタを返す。 スタック構造体は、次のような形式である。 (php.hによる):

/* Expression Stack */
typedef struct Stack {
    short type;
    unsigned char *strval;
    long intval;
    double douval;
    VarTree *var;
    struct Stack *next;
} Stack;

は、通常 STRING, LNUMBER もしくは DNUMBER のどれかである。 strvalintvaldouval 部 は、値をそれぞれ文字列、整数、倍精度実数で表現したものである。 表現式が実際に定義された変数であるならば、var 部は この変数を定義する変数構造体へのポインタを保持している。

Crypt() 関数においては引数の文字列として値のみに注目し、 s->strval を用いる。 多くの PHP/FI 関数においては、 s->type をチェックし、s->strvals->intval または、s->douval を適当に用いることにより、 変数の型に応じて異なった処理を行なうことが可能である。

実際の crypt() 関数を呼び出し、 暗号化された文字列を得た後に、 Crypt() 関数は Push(enc,STRING);を呼び出し、 戻り値を式スタックへプッシュする。 式スタックは PHP/FI の各行の実行後クリアされる。 このため、このスタックに式をプッシュし、どこでもポップしなかったとしても 問題は生じない。

Crypt() の例における Debug() 関数の呼び出しは 関数にデバッグ用出力を付加する仕方を示している。 Debug() は printf と同じく varags (可変引数リスト)関数 である。

ソースコード改造について

PHP/FI 内部のメモリー管理は、厳格に行なわれる。 PHP/FI は、サーバーモジュールとして実行可能であるため、 メモリーリソースに関して、細心の注意を払う必要がある。 再入可能(リエントラント)である必要があるばかりでなく、 モジュールの処理から抜ける時は常に時間切れ(timeout)シグナルを 受けることが可能であるように処理が行なわれる必要がある。 この際には、警告はなく、確保したメモリーを解放する間もない。 このメモリーは解放されなければならない。 さもなくば、モジュールを結合した httpd プロセスのデータ領域は 無限に増えていくであろう。 PHP を CGI モードで実行する際にも、 FastCGI 永続プロセスとして実行するように設定することが可能なので、 同様の注意が必要である。

解決策は、メモリーのサブプールを用いることである。 このプールは、セッション終了時に Apache により自動的にクリアされる。 ただし、FastCGI 永続プロセスの場合には、 FactCGI ラッパーのループが実行される度に main.c の中の処理によりクリアされる。 3つのこのようなプールが同時に使用される。 これらには、0,1,2 の番号がふられている。 このサブプール番号は、関数 emalloc および estrdup に対する 最初の引数である。

プール 0 - セッションの寿命
このプールから割り当てられたメモリーの寿命は、 セッション全体の長さとなる。 このプールの使用は可能な限り抑えることが望ましい。 例えば、while ループを 1000 回反復し、この while ループの中で プール 0 からメモリーを割り当てるコールを行なう 関数を作成した場合には、メモリーは 1000 回割り当てられることになる。 この方法によると、割り当てられたデータ領域を簡単に全て使い切ってしまう。
プール 1 - 一時記憶 (最短の寿命)
関数の内部で一時的に機能するバッファが必要である場合には、 このプールからメモリーを割り当てなければならない。 このプールは、yylex() をコールする度にクリアーされる。 すなわち、メモリーは関数の処理が終わると同時に失われる。
プール 2 - 式領域 (中間の長さの寿命)
このプールは、式の保持のために存在する。 ここでの式とは、PHP/FI の完全なコマンド行である。 このプールは関数の内部ではクリアされない。 なぜなら、関数をコールしたより高レベルの式に関する処理が 関数が返るまで完全に終わっていないからである。 このプールをクリアしても安全な時に yylex() 関数の ClearIt フラグを真とする。

サブプールの使用により、コードのどこかで 明示的にメモリーを解放する必要が全くなくなる。 ただし、 PHP にリンクされた様々なライブラリからの要求を受けた場合は、 例外的に標準の malloc コールを用いてメモリーを割り当てる。 gdbm ライブラリは、この例である。