このセクションにはPHPスクリプトを書くにあたってよく問題となる事柄が 集められています。
function myfunc($argument) { echo $argument + 10; } $variable = 10; echo "myfunc($variable) = " . myfunc($variable); |
pre ?php echo "これは1行目"; ? ?php echo "この行は改行に続いて出力されるはず"; ? /pre |
まず、
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"; } |
まずはじめに、
addslashes()
を見てみてください。 この関数はまさにこの通りのことを行ってくれます。それと、
php.ini
ファイルの設定値
magic_quotes_gpc
も参照し てください。
3.
次のようなコードを実行すると、思った通りの順番で出力が表示されま せん。
function myfunc($argument) { echo $argument + 10; } $variable = 10; echo "myfunc($variable) = " . myfunc($variable); |
式の中で関数の実行結果を使用する(例えば上の例の様に他の文字列と
連結する)ためには、
echo()
するのではなく、その 値を
return
しなければいけません。
PHPでは、"? "か"? \n"(\nは改行を表します)をPHPのコードブロッ
クの終端と見なします。このため、コードブロック終端の改行記号は省
略され、表示される文は1行になります。つまり、改行をさせるために
は、PHPのコードブロックの終端の後にもう1つ改行を挿入する必要があ るということです。
なぜPHPはこのようなことをするのでしょうか?なぜならHTMLを出力する
場合にはこの方が都合のよいことが多いからです。もしとても長い1行を
出力しなければならない場合に、改行が解釈されてしまうとしたらどう
でしょう。ソースコードの1行もとても読めないくらい長いものになって しまいます。
5.
'Warning: Cannot send session cookie - headers
already sent...'や 'Cannot add header information -
headers already set...'といった メッセージが出力されるのですが。
sent...'.
header()
,
set_cookie()
や セッション関数は出力ストリームにヘッダを付加する関数で、ヘッダを
送信できるのは本文の出力を開始する前のみです。これはApacheモジュール
版のPHPを実行している場合は以下のようなコードで貴方が送信している
全てのリクエストヘッダを表示することが出来ます。
$headers = getallheaders(); foreach ($headers as $name = $content) { echo "headers[$name] = $content br \n"; } |
もしPHPがApacheモジュールとして動作しているなら、
getallheaders()
を使えば全てのヘッダを取得する ことができます。下のちょっとしたコードで全てのリクエストヘッダを
表示することができます。
$headers = getallheaders(); foreach ($headers as $name = $content) { echo "headers[$name] = $content br \n"; } |
これはIISのセキュリティモデルの欠点で、IISで動作するCGIに共通する
問題です。これを回避策するには、認証のかかったディレクトリに(PHP
が解釈しない)HTMLファイルを作成します。そしてMETAタグを使ってPHP
を使用したページにリダイレクトするか、リンクを張ります。こうすれ
ばPHPは認証済みかどうかを正しく認識することが出来ます。ISAPIモジュー
ルの場合はこの問題は起きません。また、これは他のNTウェブサーバに は影響ありません。詳しくは
http://support.microsoft.com/support/kb/articles/q160/4/22.asp
を参照してください。
8.
私が書いたPHPスクリプトはIEとLynxでは動作するのですが、Netscapeを
使うと出力の一部が失われてしまいます。"ソースの表示"をするとIEには
あるがNetscapeにはない内容があります。
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文字を見つけるとその行の文字を一切出力 しません。
php.ini
ファイルの
short_tags
を0に設定するか、 Apacheディレクティブを使ってショートタグを無効にしなければなりま せん。また、
File セクションを使ってファイルごとに選択的に 設定を行うことも出来ます。
最も簡単なのはASPタグを使う方法です。こうすればASPの様に %と %
をコード区切りとして使用することが出来ます。有名なHTMLエディ
タは(今のところ)ASPタグを賢く扱ってくれます。ASPスタイルのタグを 有効にするには
php.ini
ファイルで
asp_tags
を設定するか、Apacheディレ クティブを使用します。
一番良い方法はHTMLに
?php phpinfo(); ?
と書いてそのページをロードすることです。そこには環境変数やウェブ
サーバが設定した特殊な変数の一覧を含む、PHPの設定に関するあらゆ
る情報が表示されます。こうしたリストがPHPのドキュメントに無いの
は、各々のサーバによりその項目と内容が異なるからです。