このセクションにはPHPスクリプトを書くにあたってよく問題となる事柄が 集められています。
PHP は、さまざまな外部ライブラリの間を取り持つ糊のような存在です。 そのため、時にはちょっとごちゃごちゃすることもあります。 しかし、経験上、以下のような規則があるようです。
配列関数 のパラメータは "needle, haystack" の順だけれども、 文字列関数 はその逆で "haystack, needle" の順となります。
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;
}
?>
もしデータベースに格納するためにそんなことをしようとしているのなら、 データベース自身が持つエスケープの仕組みを使うようにしましょう。 MySQL なら mysql_real_escape_string()、 PostgreSQL なら pg_escape_string() などです。 汎用的な関数 addslashes() や stripslashes() もありますが、 これはさらに古い時代の PHP コードで使われていたものです。
function myfunc($argument)
{
echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
式の中で関数の実行結果を使用する(例えば上の例の様に他の文字列と 連結する)ためには、echo するのではなく、その 値を return しなければいけません。
<pre>
<?php echo "これは1行目"; ?>
<?php echo "この行は改行に続いて出力されるはず"; ?>
</pre>
PHPでは、"?>"か"?>\n"(\nは改行を表します)をPHPのコードブロッ クの終端と見なします。このため、コードブロック終端の改行記号は省 略され、表示される文は1行になります。つまり、改行をさせるために は、PHPのコードブロックの終端の後にもう1つ改行を挿入する必要があ るということです。
なぜPHPはこのようなことをするのでしょうか?なぜならHTMLを出力する 場合にはこの方が都合のよいことが多いからです。もしとても長い1行を 出力しなければならない場合に、改行が解釈されてしまうとしたらどう でしょう。ソースコードの1行もとても読めないくらい長いものになって しまいます。
header(), set_cookie()や セッション関数は出力ストリームに ヘッダを付加する関数で、ヘッダを送信できるのは本文の出力を 開始する前のみです。headers_sent()を使って 既にヘッダが送信済みでないかチェックすることができます。 出力制御関数もご覧ください。
もしPHPがApacheモジュールとして動作しているなら、 getallheaders()を使えば全てのヘッダを取得する ことができます。下のちょっとしたコードで全てのリクエストヘッダを 表示することができます。
$headers = getallheaders();
foreach ($headers as $name => $content) {
echo "headers[$name] = $content<br />\n";
}
apache_lookup_uri(), apache_response_headers(), fsockopen()も参照してください。
これはIISのセキュリティモデルの欠点で、IISで動作するCGIに共通する 問題です。これを回避策するには、認証のかかったディレクトリに(PHP が解釈しない)HTMLファイルを作成します。そしてMETAタグを使ってPHP を使用したページにリダイレクトするか、リンクを張ります。こうすれ ばPHPは認証済みかどうかを正しく認識することが出来ます。 また、これは他のNTウェブサーバーに は影響ありません。詳しくは» http://support.microsoft.com/kb/q160422/ とHTTP 認証を 参照してください。
Go to Internet Information
Services
を変更する必要があります。PHP ファイルを選択して
プロパティを開き、セキュリティ
タブに移動し、
Edit -< Anonymous access and authentication control
。
この問題を解決するには Anonymous
Access
のチェックをはずして Integrated Window
Authentication
をチェックしたままにしておきか、
あるいは Anonymous
Access
をチェックしてアクセスできないユーザーを別途指定します。
<?xml を直接PHPコードに埋め込むには、
PHPディレクティブのshort_tags
を 0
に設定しなければなりません。
このディレクティブはini_set()でセットすることは
できません。short_open_tags
のオン/オフに関わらず、次のようにもできます:
<?php echo '<?xml'; ?>
このディレクティブはデフォルトでオンです。
マニュアルの 定義済みの変数 のページを読んでください。スクリプト上で有効な定義済み変数のリストの 一部があります。有効な変数の完全なリスト(とその詳しい情報)は phpinfo()をコールすることで見ることができます。 マニュアルの PHPの外部から来る変数 のセクションも読んでください。HTMLフォームやCookie、URL等から 来る外部変数に関するシナリオが説明されています。
有効なオプションは K(キロバイト)、M(メガバイト)および G(ギガバイト)
です。これらはすべて、大文字小文字を区別しません。
これ以外の文字はバイト値と判断されます。
1M
は、1 メガバイトあるいは 1048576
バイトと等しくなります。1K
は、1 キロバイトあるいは
1024
バイトです。この表記法は、 php.ini
や ini_set() 関数で使えます。
ここで、数値の値は、int
型にキャストされることに注意して下さい。
たとえば、0.5M
は 0
と解釈されます。
注意: キロバイト? キビバイト?
PHP の記法では 1 キロバイト = 1024 バイトとしていますが、 IEC の標準規格では 1024 バイトのことを 1 キビバイト (kibibyte) と呼ぶことになっています。 まとめ: PHP での k および K = 1024 バイト。