1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
|
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision: 1.4 $ -->
<chapter id="faq.using">
<title>PHPを使う</title>
<titleabbrev>PHPを使う</titleabbrev>
<para>
このセクションにはPHPスクリプトを書くにあたってよく問題となる事柄が
集められています。
</para>
<qandaset>
<qandaentry id="faq.using.anyform">
<question>
<para>
あらゆるフォームから送信されたデータを扱うことができる汎用的な
PHPスクリプトを書きたいのですが、POSTメソッドでどのようなデータ
が送信されたかを知るにはどうするのですか?
</para>
</question>
<answer>
<para>
まず、<filename>php.ini</filename>で<link
linkend="ini.track-vars">track_vars</link>が有効になっていること
を確認してください。PHP 4.0.3以降ではこの設定値は常にonです。
<literal>track_vars</literal>がonになっているとPHPはいくつかの連
想配列を生成します。このうち最も重要なのが
<literal>$HTTP_POST_VARS</literal>です。と言うわけで、POSTメソッ
ドにより送信されたデータを扱う汎用的なスクリプトを書くには、以下
のようにします。
<programlisting role="php">
<![CDATA[
foreach ($HTTP_POST_VARS as $var => $value) {
echo "$var = $value<br>\n";
}
]]>
</programlisting>
</para>
</answer>
</qandaentry>
<qandaentry id="faq.using.singlequotes">
<question>
<para>
シングルクオート(')をバックスラッシュでエスケープされた
シングルクオート(\')に変換しなければならないのですが、
正規表現を用いてこれを行うにはどの様にするのですか?
</para>
</question>
<answer>
<para>
まずはじめに、<function>addslashes</function>を見てみてください。
この関数はまさにこの通りのことを行ってくれます。それと、
<filename>php.ini</filename>ファイルの設定値<link
linkend="ini.magic-quotes-gpc">magic_quotes_gpc</link> も参照し
てください。
</para>
</answer>
</qandaentry>
<qandaentry id="faq.using.wrong-order">
<question>
<para>
次のようなコードを実行すると、思った通りの順番で出力が表示されま
せん。
<programlisting role="php">
<![CDATA[
function myfunc($argument)
{
echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
]]>
</programlisting>
なぜですか?
</para>
</question>
<answer>
<para>
式の中で関数の実行結果を使用する(例えば上の例の様に他の文字列と
連結する)ためには、<function>echo</function>するのではなく、その
値を<emphasis>return</emphasis>しなければいけません。
</para>
</answer>
</qandaentry>
<qandaentry id="faq.using.newlines">
<question>
<para>
改行されないのですが?
<programlisting role="php">
<![CDATA[
<pre>
<?php echo "これは1行目"; ?>
<?php echo "この行は改行に続いて出力されるはず"; ?>
</pre>
]]>
</programlisting>
</para>
</question>
<answer>
<para>
PHPでは、"?>"か"?>\n"(\nは改行を表します)をPHPのコードブロッ
クの終端と見なします。このため、コードブロック終端の改行記号は省
略され、表示される文は1行になります。つまり、改行をさせるために
は、PHPのコードブロックの終端の後にもう1つ改行を挿入する必要があ
るということです。
</para>
<para>
なぜPHPはこのようなことをするのでしょうか?なぜならHTMLを出力する
場合にはこの方が都合のよいことが多いからです。もしとても長い1行を
出力しなければならない場合に、改行が解釈されてしまうとしたらどう
でしょう。ソースコードの1行もとても読めないくらい長いものになって
しまいます。
</para>
</answer>
</qandaentry>
<qandaentry id="faq.using.headers-sent">
<question>
<para>
'Warning: Cannot send session cookie - headers already sent...'や
'Cannot add header information - headers already set...'といった
メッセージが出力されるのですが。
sent...'.
</para>
</question>
<answer>
<para>
<function>header</function>, <function>set_cookie</function>や
セッション関数は出力ストリームにヘッダを付加する関数で、ヘッダを
送信できるのは本文の出力を開始する前のみです。これはApacheモジュール
版のPHPを実行している場合は以下のようなコードで貴方が送信している
全てのリクエストヘッダを表示することが出来ます。
<programlisting role="php">
<![CDATA[
$headers = getallheaders();
foreach ($headers as $name => $content) {
echo "headers[$name] = $content<br>\n";
}
]]>
</programlisting>
</para>
</answer>
</qandaentry>
<qandaentry id="faq.using.header">
<question>
<para>
リクエストヘッダに直接アクセスしたいのですが、どうすればよいですか?
</para>
</question>
<answer>
<para>
もしPHPがApacheモジュールとして動作しているなら、
<function>getallheaders</function>を使えば全てのヘッダを取得する
ことができます。下のちょっとしたコードで全てのリクエストヘッダを
表示することができます。
<programlisting role="php">
<![CDATA[
$headers = getallheaders();
foreach ($headers as $name => $content) {
echo "headers[$name] = $content<br>\n";
}
]]>
</programlisting>
</para>
</answer>
</qandaentry>
<qandaentry id="faq.using.authentication">
<question>
<para>
IISで認証を行おうとすると'No Input file specified'というエラーが
発生します。
</para>
</question>
<answer>
<para>
これはIISのセキュリティモデルの欠点で、IISで動作するCGIに共通する
問題です。これを回避策するには、認証のかかったディレクトリに(PHP
が解釈しない)HTMLファイルを作成します。そしてMETAタグを使ってPHP
を使用したページにリダイレクトするか、リンクを張ります。こうすれ
ばPHPは認証済みかどうかを正しく認識することが出来ます。ISAPIモジュー
ルの場合はこの問題は起きません。また、これは他のNTウェブサーバに
は影響ありません。詳しくは<ulink
url="&faqurl.iis;">&faqurl.iis;</ulink>を参照してください。
</para>
</answer>
</qandaentry>
<qandaentry id="faq.using.netscape">
<question>
<para>
私が書いたPHPスクリプトはIEとLynxでは動作するのですが、Netscapeを
使うと出力の一部が失われてしまいます。"ソースの表示"をするとIEには
あるがNetscapeにはない内容があります。
</para>
</question>
<answer>
<para>
NetscapeはHTMLタグの扱いがIEに比べて厳密になっています(テーブル等)。
スクリプトが出力したHTMLを<ulink url="&faqurl.w3.validator;">
validator.w3.org</ulink>などのHTMLバリデータに掛けてみると良いでしょう。
例えば</table>が無いとこのような現象が発生します。
</para>
<para>
また、IEとLynxは共にHTMLストリーム中のNULL文字(<literal>\0</literal>)を
無視しますがNetscapeは無視しません。この問題をチェックする一番の方法
は<link linkend="commandline">コマンドライン版</link>のPHP(つまりCGI
バージョン)をコンパイルして、コマンドラインからそのスクリプトを実行する
ことです。その出力を <literal>od -c</literal> にパイプして<literal>\0
</literal>があるかどうかをチェックしてください。もしWindowsを使っている
場合は、バイナリファイルを扱えるエディタかそれに類するソフトウェアが
必要です。IEやLynxと異なりNetscapeはNULL文字を見つけるとその行の文字を
一切出力しません。
</para>
</answer>
</qandaentry>
<qandaentry id="faq.using.mixml">
<question>
<para>
どうすればXMLとPHPは共存することが出来るのですか?XMLの
<?xml>タグがPHPでエラーになります。
</para>
</question>
<answer>
<para>
<filename>php.ini</filename>ファイルの<link
linkend="ini.short-open-tag">short_tags</link>を0に設定するか、
Apacheディレクティブを使ってショートタグを無効にしなければなりま
せん。また、<File>セクションを使ってファイルごとに選択的に
設定を行うことも出来ます。
</para>
</answer>
</qandaentry>
<qandaentry id="faq.using.editor">
<question>
<para>
FrontPageやその他のHTMLエディタを使うと、書いたPHPのコードが勝手
にあちこちに移動されてしまいます。どうしたらいいですか?
</para>
</question>
<answer>
<para>
最も簡単なのはASPタグを使う方法です。こうすればASPの様に<%と
%>をコード区切りとして使用することが出来ます。有名なHTMLエディ
タは(今のところ)ASPタグを賢く扱ってくれます。ASPスタイルのタグを
有効にするには<filename>php.ini</filename>ファイルで<link
linkend="ini.asp-tags">asp_tags</link>を設定するか、Apacheディレ
クティブを使用します。
</para>
</answer>
</qandaentry>
<qandaentry id="faq.using.variables">
<question>
<para>
あらかじめ設定されている変数を全て網羅したリストはどこにあるので
すか?なぜPHPのドキュメントにはその一覧がないのですか?
</para>
</question>
<answer>
<para>
一番良い方法はHTMLに<literal><?php phpinfo(); ?></literal>
と書いてそのページをロードすることです。そこには環境変数やウェブ
サーバが設定した特殊な変数の一覧を含む、PHPの設定に関するあらゆ
る情報が表示されます。こうしたリストがPHPのドキュメントに無いの
は、各々のサーバによりその項目と内容が異なるからです。
</para>
</answer>
</qandaentry>
<qandaentry id="faq.using.cgi-vars">
<question>
<para>
ユーザ定義関数の中で、標準的な($DOCUMENT_ROOTや$HTTP_REFERER等の)
CGI変数にアクセスしたいのですが、PHPはそれらの変数を見つけること
ができていないようです。何がおかしいのですか?
</para>
</question>
<answer>
<para>
環境変数は通常のグローバル変数と同じ様に扱われるので、(例えば
<literal>global $DOCUMENT_ROOT;</literal>のように)ユーザ定義関数
の中でグローバル変数として宣言するか、グローバル変数の配列を使っ
て(つまり、<literal>$GLOBALS["DOCUMENT_ROOT"]</literal>として)ア
クセスしてください。
</para>
</answer>
</qandaentry>
</qandaset>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
|