1.
あらゆるフォームから送信されたデータを扱うことができる汎用的な
PHPスクリプトを書きたいのですが、POSTメソッドでどのようなデータ
が送信されたかを知るにはどうするのですか?
PHPは$_POSTのような
定義済みの変数
を沢山提供しています。$_POSTを連想配列として
ループすることでPOSTされた全ての値にアクセスできます。例えば、
foreachで
単純にループしてempty()で値をチェックし、
結果を出力します。
<?php
$empty = $post = array();
foreach ($_POST as $varname => $varvalue) {
if (empty($varvalue)) {
$empty[$varname] = $varvalue;
} else {
$post[$varname] = $varvalue;
}
}
print "<pre>";
if (empty($empty)) {
print "None of the POSTed values are empty, posted:\n";
var_dump($post);
} else {
print "We have " . count($empty) . " empty values\n";
print "Posted:\n"; var_dump($post);
print "Empty:\n"; var_dump($empty);
exit;
}
?>
|
スーパーグローバル:
使用可能なバージョンに関する注意: PHP 4.1.0以降、
$_GET, $_POST,
$_SERVER等のスーパーグローバル配列が使用可能となっ
ています。詳細な情報については、マニュアルのsuperglobals
の節を参照して下さい。
2.
シングルクオート(')をバックスラッシュでエスケープされた
シングルクオート(\')に変換しなければならないのですが、
正規表現を用いてこれを行うにはどの様にするのですか?
同様に " を \" に、\ を \\ に変換したいのです。
3.
" は \" に、また ' は \' に全て変換されているのですが、
これら無用なバックスラッシュを除去するにはどうしたらよいですか?
どうやって、そしてなぜ、こんなことになっているのでしょう?
4.
次のようなコードを実行すると、思った通りの順番で出力が表示されま
せん。
function myfunc($argument)
{
echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
|
なぜですか?
式の中で関数の実行結果を使用する(例えば上の例の様に他の文字列と
連結する)ためには、echo()するのではなく、その
値をreturnしなければいけません。
5.
改行されないのですが?
<pre>
<?php echo "これは1行目"; ?>
<?php echo "この行は改行に続いて出力されるはず"; ?>
</pre>
|
PHPでは、"?>"か"?>\n"(\nは改行を表します)をPHPのコードブロッ
クの終端と見なします。このため、コードブロック終端の改行記号は省
略され、表示される文は1行になります。つまり、改行をさせるために
は、PHPのコードブロックの終端の後にもう1つ改行を挿入する必要があ
るということです。
なぜPHPはこのようなことをするのでしょうか?なぜならHTMLを出力する
場合にはこの方が都合のよいことが多いからです。もしとても長い1行を
出力しなければならない場合に、改行が解釈されてしまうとしたらどう
でしょう。ソースコードの1行もとても読めないくらい長いものになって
しまいます。
6.
'Warning: Cannot send session cookie - headers already sent...'や
'Cannot add header information - headers already set...'といった
メッセージが出力されるのですが。
sent...'.
7.
リクエストヘッダに直接アクセスしたいのですが、どうすればよいですか?
8.
IISで認証を行おうとすると'No Input file specified'というエラーが
発生します。
これはIISのセキュリティモデルの欠点で、IISで動作するCGIに共通する
問題です。これを回避策するには、認証のかかったディレクトリに(PHP
が解釈しない)HTMLファイルを作成します。そしてMETAタグを使ってPHP
を使用したページにリダイレクトするか、リンクを張ります。こうすれ
ばPHPは認証済みかどうかを正しく認識することが出来ます。ISAPIモジュー
ルの場合はこの問題は起きません。また、これは他のNTウェブサーバに
は影響ありません。詳しくは
とHTTP 認証を
参照してください。
9.
私が書いたPHPスクリプトはIEとLynxでは動作するのですが、Netscapeを
使うと出力の一部が失われてしまいます。"ソースの表示"をするとIEには
あるがNetscapeにはない内容があります。
NetscapeはHTMLタグの扱いがIEに比べて厳密になっています(テーブル等)。
スクリプトが出力したHTMLをなどのHTMLバリデータに掛けてみると良いでしょう。
例えば</table>が無いとこのような現象が発生します。
また、IEとLynxは共にHTMLストリーム中のNULL文字(\0)を
無視しますがNetscapeは無視しません。この問題をチェックする一番の方法
はコマンドライン版の
PHP(つまりCGIバージョン)をコンパイルして、コマンドラインからその
スクリプトを実行することです。*nix上では、その出力を od
-c にパイプして\0があるかどうかを
チェックしてください。もしWindowsを使っている場合は、バイナリファ
イルを扱えるエディタかそれに類するソフトウェアが必要です。IEや
Lynxと異なりNetscapeはNULL文字を見つけるとその行の文字を一切出力
しません。
10.
どうすればXMLとPHPは共存することが出来るのですか?XMLの
<?xml>タグがPHPでエラーになります。
<?xml を直接PHPコードに埋め込むには、
PHPディレクティブのshort_tags
を0に設定しなければなりません。
このディレクティブはini_set()でセットすることは
できません。short_open_tags
のオン/オフに関わらず、次のようにもできます:
<?php echo '<?xml'; ?>
このディレクティブはデフォルトでオンです。
11.
FrontPageやその他のHTMLエディタを使うと、書いたPHPのコードが勝手
にあちこちに移動されてしまいます。どうしたらいいですか?
最も簡単なのはASPタグを使う方法です。こうすればASPの様に<%と
%>をコード区切りとして使用することが出来ます。有名なHTMLエディ
タは(今のところ)ASPタグを賢く扱ってくれます。ASPスタイルのタグを
有効にするにはphp.iniファイルでasp_tagsを設定するか、適切なApacheディレ
クティブを使用します。
12.
あらかじめ設定されている変数を全て網羅したリストはどこにあるので
すか?なぜPHPのドキュメントにはその一覧がないのですか?
マニュアルの
定義済みの変数
のページを読んで下さい。スクリプト上で有効な定義済み変数のリストの
一部があります。有効な変数の完全なリスト(とその詳しい情報)は
phpinfo()をコールすることで見ることができます。
マニュアルの
PHPの外部から来る変数
のセクションも読んで下さい。HTMLフォームやCookie、URL等から
来る外部変数に関するシナリオが説明されています。
register_globals: 重要な注
意: PHP 4.2.0以降、PHPディレクティブ
register_globalsのデフォルト値
はoffとなっています。PHPコミュニティは、ユーザが
このディレクティブの設定に依存せず、superglobalsのような
他の手段を使用することを推奨します。
13.
フリーではない商用ライブラリである
ClibPDFや
PDFLibを使わずに
PDFファイルを生成するにはどうしたらよいでしょうか?
フリーのもので、外部のPDFライブラリを必要としない
ものがいいのです。
PHPで書かれている代替手段がいくつかあります。
,
,
,
等です。
モジュールもあります。
14.
ユーザ定義関数の中で、標準的な($DOCUMENT_ROOTや$HTTP_REFERER等の)
CGI変数にアクセスしたいのですが、PHPはそれらの変数を見つけること
ができていないようです。何がおかしいのですか?
PHPディレクティブの
register_globals
がサーバと環境変数に与える影響を認識することは重要なことです。
register_globals = off (PHP4.2.0以降デフォルトでoff)の場合、
$DOCUMENT_ROOTは存在しません。代わりに
$_SERVER['DOCUMENT_ROOT']を使用してください。
register_globals = on の場合は $DOCUMENT_ROOTも
$GLOBALS['DOCUMENT_ROOT']も存在します。
スーパーグローバル:
使用可能なバージョンに関する注意: PHP 4.1.0以降、
$_GET, $_POST,
$_SERVER等のスーパーグローバル配列が使用可能となっ
ています。詳細な情報については、マニュアルのsuperglobals
の節を参照して下さい。