第 50 章 PHPを使う

このセクションにはPHPスクリプトを書くにあたってよく問題となる事柄が 集められています。

1. あらゆるフォームから送信されたデータを扱うことができる汎用的な PHPスクリプトを書きたいのですが、POSTメソッドでどのようなデータ が送信されたかを知るにはどうするのですか?
2. シングルクオート(')をバックスラッシュでエスケープされた シングルクオート(\')に変換しなければならないのですが、 正規表現を用いてこれを行うにはどの様にするのですか?
3. 次のようなコードを実行すると、思った通りの順番で出力が表示されま せん。
function myfunc($argument)
{
    echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
なぜですか?
4. 改行されないのですが?
 pre 
 ?php echo "これは1行目"; ? 
 ?php echo "この行は改行に続いて出力されるはず"; ? 
 /pre 
5. 'Warning: Cannot send session cookie - headers already sent...'や 'Cannot add header information - headers already set...'といった メッセージが出力されるのですが。 sent...'.
6. リクエストヘッダに直接アクセスしたいのですが、どうすればよいですか?
7. IISで認証を行おうとすると'No Input file specified'というエラーが 発生します。
8. 私が書いたPHPスクリプトはIEとLynxでは動作するのですが、Netscapeを 使うと出力の一部が失われてしまいます。"ソースの表示"をするとIEには あるがNetscapeにはない内容があります。
9. どうすればXMLとPHPは共存することが出来るのですか?XMLの ?xml タグがPHPでエラーになります。
10. FrontPageやその他のHTMLエディタを使うと、書いたPHPのコードが勝手 にあちこちに移動されてしまいます。どうしたらいいですか?
11. あらかじめ設定されている変数を全て網羅したリストはどこにあるので すか?なぜPHPのドキュメントにはその一覧がないのですか?
12. ユーザ定義関数の中で、標準的な($DOCUMENT_ROOTや$HTTP_REFERER等の) CGI変数にアクセスしたいのですが、PHPはそれらの変数を見つけること ができていないようです。何がおかしいのですか?

まず、 php.ini track_vars が有効になっていること を確認してください。PHP 4.0.3以降ではこの設定値は常にonです。 track_vars がonになっているとPHPはいくつかの連 想配列を生成します。このうち最も重要なのが $HTTP_POST_VARS です。と言うわけで、POSTメソッ ドにより送信されたデータを扱う汎用的なスクリプトを書くには、以下 のようにします。

foreach ($HTTP_POST_VARS as $var =  $value) {
    echo "$var = $value br \n";
}


header() , set_cookie() や セッション関数は出力ストリームにヘッダを付加する関数で、ヘッダを 送信できるのは本文の出力を開始する前のみです。これはApacheモジュール 版のPHPを実行している場合は以下のようなコードで貴方が送信している 全てのリクエストヘッダを表示することが出来ます。

$headers = getallheaders();
foreach ($headers as $name =  $content) {
    echo "headers[$name] = $content br \n";
}


6. リクエストヘッダに直接アクセスしたいのですが、どうすればよいですか?

もしPHPがApacheモジュールとして動作しているなら、 getallheaders() を使えば全てのヘッダを取得する ことができます。下のちょっとしたコードで全てのリクエストヘッダを 表示することができます。

$headers = getallheaders();
foreach ($headers as $name =  $content) {
    echo "headers[$name] = $content br \n";
}


NetscapeはHTMLタグの扱いがIEに比べて厳密になっています(テーブル等)。 スクリプトが出力したHTMLを validator.w3.org などのHTMLバリデータに掛けてみると良いでしょう。 例えば /table が無いとこのような現象が発生します。

また、IEとLynxは共にHTMLストリーム中のNULL文字( \0 )を 無視しますがNetscapeは無視しません。この問題をチェックする一番の方法 は コマンドライン版 の PHP(つまりCGIバージョン)をコンパイルして、コマンドラインからその スクリプトを実行することです。その出力を od -c にパイプして \0 があるかどうかを チェックしてください。もしWindowsを使っている場合は、バイナリファ イルを扱えるエディタかそれに類するソフトウェアが必要です。IEや Lynxと異なりNetscapeはNULL文字を見つけるとその行の文字を一切出力 しません。

9. どうすればXMLとPHPは共存することが出来るのですか?XMLの ?xml タグがPHPでエラーになります。

php.ini ファイルの short_tags を0に設定するか、 Apacheディレクティブを使ってショートタグを無効にしなければなりま せん。また、 File セクションを使ってファイルごとに選択的に 設定を行うことも出来ます。

10. FrontPageやその他のHTMLエディタを使うと、書いたPHPのコードが勝手 にあちこちに移動されてしまいます。どうしたらいいですか?

最も簡単なのはASPタグを使う方法です。こうすればASPの様に %と % をコード区切りとして使用することが出来ます。有名なHTMLエディ タは(今のところ)ASPタグを賢く扱ってくれます。ASPスタイルのタグを 有効にするには php.ini ファイルで asp_tags を設定するか、Apacheディレ クティブを使用します。