[PHP-doc 20] Re: FAQ和訳(using.xml)

Masaki Fujimoto php-doc@php.gr.jp
Tue, 20 Nov 2001 11:32:04 +0900


ふじもとです。

using.xmlのドラフトです。(http://www.studio-m.com/php/xml/using.xml
にも置いておきます。)

# 一応一通り終了したっぽいですが、マルチバイトにとりかかりましょうか?

--- ここから ---
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision: 1.11 $ -->
<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">
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.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>
     とてもよい質問です! ;) これは厄介な問題で、これを書いていた先月にも2件も
     報告されています。これら2件の問題の原因を突き止めるために私は20分もの時間を
     費やしてしまいました。答えは、IEとLynxは共にHTMLストリーム中のNULL文字
     (<literal>\0</literal>)を無視しますがNetscapeは違う、ということです。
     この問題をチェックする一番の方法はコマンドライン版のPHP(つまりCGIバージョン)
     をコンパイルして、コマンドラインからそのスクリプトを実行することです。その出力を
     'od -c'にパイプして<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
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
-->
--- ここまで ---

--
藤本 真樹

アストラザスタジオ
fujimoto@studio.co.jp