File: using.xml

package info (click to toggle)
phpdoc 20020310-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 35,272 kB
  • ctags: 354
  • sloc: xml: 799,767; php: 1,395; cpp: 500; makefile: 200; sh: 140; awk: 51
file content (318 lines) | stat: -rw-r--r-- 12,471 bytes parent folder | download
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では、"?&gt;"か"?&gt;\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バリデータに掛けてみると良いでしょう。
      例えば&lt;/table&gt;が無いとこのような現象が発生します。
     </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の
     &lt;?xml&gt;タグがPHPでエラーになります。
     </para>
    </question>
    <answer>
     <para>
      <filename>php.ini</filename>ファイルの<link
      linkend="ini.short-open-tag">short_tags</link>を0に設定するか、
      Apacheディレクティブを使ってショートタグを無効にしなければなりま
      せん。また、&lt;File&gt;セクションを使ってファイルごとに選択的に
      設定を行うことも出来ます。
     </para>
    </answer>
   </qandaentry>

   <qandaentry id="faq.using.editor">
    <question>
     <para>
      FrontPageやその他のHTMLエディタを使うと、書いたPHPのコードが勝手
      にあちこちに移動されてしまいます。どうしたらいいですか?
     </para>
    </question>
    <answer>
     <para>
      最も簡単なのはASPタグを使う方法です。こうすればASPの様に&lt;%と
      %&gt;をコード区切りとして使用することが出来ます。有名な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>&lt;?php phpinfo(); ?&gt;</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
-->