hirokawa Fri Nov 23 20:55:32 2001 EDT
Added files:
/phpdoc/ja/faq using.xml
Log:
added faq.using.xml in japanese manual.
Index: phpdoc/ja/faq/using.xml
+++ phpdoc/ja/faq/using.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision: 1.1 $ -->
<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では、"?>"か"?>\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の
<?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
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
-->