<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/faq.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'faq.using.php',
    1 => 'PHP の使いかた',
    2 => 'PHP の使いかた',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'FAQ',
  ),
  'prev' => 
  array (
    0 => 'faq.build.php',
    1 => '構築時の問題',
  ),
  'next' => 
  array (
    0 => 'faq.passwords.php',
    1 => 'パスワードのハッシュ',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'faq/using.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="faq.using" class="chapter">
  <h1 class="title">PHP の使いかた</h1>

  

  <p class="para">
   このセクションにはPHPスクリプトを書くにあたってよく問題となる事柄が
   集められています。
  </p>

  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.using.parameterorder">
     
      PHP の関数のパラメータの順番を覚えられません。だって関数によってばらばらなんだもん。
     
    </a></li><li><a href="#faq.using.anyform">
     
      あらゆるフォームから送信されたデータを扱うことができる汎用的な
      PHPスクリプトを書きたいのですが、POSTメソッドでどのようなデータ
      が送信されたかを知るにはどうするのですか？
     
    </a></li><li><a href="#faq.using.singlequotes">
     
      シングルクオート(&#039;)をバックスラッシュでエスケープされた
      シングルクオート(\&#039;)に変換しなければならないのですが、
      正規表現を用いてこれを行うにはどの様にするのですか？
      同様に &quot; を \&quot; に、\ を \\ に変換したいのです。
     
    </a></li><li><a href="#faq.using.wrong-order">
     
      次のようなコードを実行すると、思った通りの順番で出力が表示されません。
     

function myfunc($argument)
{
    echo $argument + 10;
}
$variable = 10;
echo &quot;myfunc($variable) = &quot; . myfunc($variable);

    
      なぜですか？
     
    </a></li><li><a href="#faq.using.newlines">
     
      改行されないのですが？
      

&lt;pre&gt;
&lt;?php echo &quot;これは1行目&quot;; ?&gt;
&lt;?php echo &quot;この行は改行に続いて出力されるはず&quot;; ?&gt;
&lt;/pre&gt;

      
     
    </a></li><li><a href="#faq.using.headers-sent">
     
      &#039;Warning: Cannot send session cookie - headers already sent...&#039;や
      &#039;Cannot add header information - headers already set...&#039;といった
      メッセージが出力されるのですが。
      sent...&#039;.
     
    </a></li><li><a href="#faq.using.header">
     
      リクエストヘッダに直接アクセスしたいのですが、どうすればよいですか？
     
    </a></li><li><a href="#faq.using.authentication">
     
      IISで認証を行おうとすると&#039;No Input file specified&#039;というエラーが
      発生します。
     
    </a></li><li><a href="#faq.using.iis.sharing">
     
      Windows: 他のコンピュータと共有しているファイルに、IIS
      でアクセスできません。
     
    </a></li><li><a href="#faq.using.mixml">
     
     どうすればXMLとPHPは共存することが出来るのですか？XMLの
     &lt;?xml&gt;タグがPHPでエラーになります。
     
    </a></li><li><a href="#faq.using.variables">
     
      あらかじめ設定されている変数を全て網羅したリストはどこにあるので
      すか？なぜPHPのドキュメントにはその一覧がないのですか？
     
    </a></li><li><a href="#faq.using.freepdf">
     
      フリーではない商用ライブラリである
      PDFLib を使わずに
      PDFファイルを生成するにはどうしたらよいでしょうか？
      フリーのもので、外部のPDFライブラリが不要なものがいいのですが。
     
    </a></li><li><a href="#faq.using.shorthandbytes">
     
      いくつかの PHP ディレクティブでは、バイト値を int 
      ではなく省略形で設定できます。この省略形で使えるオプションを教えてください。
     
    </a></li></ol></div>

   <dl class="qandaentry" id="faq.using.parameterorder">
    <dt><strong>
     
      PHP の関数のパラメータの順番を覚えられません。だって関数によってばらばらなんだもん。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      PHP は、さまざまな外部ライブラリの間を取り持つ糊のような存在です。
      そのため、時にはちょっとごちゃごちゃすることもあります。
      しかし、経験上、以下のような規則があるようです。
     </p>
     <p class="para">
      <a href="book.array.php" class="link">配列関数</a> のパラメータは
      &quot;<em>needle, haystack</em>&quot; の順だけれども、
      <a href="book.strings.php" class="link">文字列関数</a> はその逆で
      &quot;<em>haystack, needle</em>&quot; の順となります。
     </p>
     <p class="para">
      PHP 8.0 以降では、<a href="functions.arguments.php#functions.named-arguments" class="link">名前付き引数</a>
      によってパラメータ名で引数を渡すことができるため、パラメータの順序をそれほど気にする必要はありません。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.anyform">
    <dt><strong>
     
      あらゆるフォームから送信されたデータを扱うことができる汎用的な
      PHPスクリプトを書きたいのですが、POSTメソッドでどのようなデータ
      が送信されたかを知るにはどうするのですか？
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      PHPは<var class="varname"><a href="reserved.variables.post.php" class="classname">$_POST</a></var>のような
      <a href="language.variables.predefined.php" class="link">定義済みの変数</a>
      を沢山提供しています。<var class="varname"><a href="reserved.variables.post.php" class="classname">$_POST</a></var> を連想配列として
      ループすることでPOSTされた全ての値にアクセスできます。例えば、
      <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> で単純にループして <span class="function"><a href="function.empty.php" class="function">empty()</a></span> で値をチェックし、
      結果を出力します。
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$empty </span><span style="color: #007700">= </span><span style="color: #0000BB">$post </span><span style="color: #007700">= array();<br />foreach (</span><span style="color: #0000BB">$_POST </span><span style="color: #007700">as </span><span style="color: #0000BB">$varname </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$varvalue</span><span style="color: #007700">) {<br />    if (empty(</span><span style="color: #0000BB">$varvalue</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">$empty</span><span style="color: #007700">[</span><span style="color: #0000BB">$varname</span><span style="color: #007700">] = </span><span style="color: #0000BB">$varvalue</span><span style="color: #007700">;<br />    } else {<br />        </span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #0000BB">$varname</span><span style="color: #007700">] = </span><span style="color: #0000BB">$varvalue</span><span style="color: #007700">;<br />    }<br />}<br /><br />print </span><span style="color: #DD0000">"&lt;pre&gt;"</span><span style="color: #007700">;<br />if (empty(</span><span style="color: #0000BB">$empty</span><span style="color: #007700">)) {<br />    print </span><span style="color: #DD0000">"None of the POSTed values are empty, posted:\n"</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$post</span><span style="color: #007700">);<br />} else {<br />    print </span><span style="color: #DD0000">"We have " </span><span style="color: #007700">. </span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$empty</span><span style="color: #007700">) . </span><span style="color: #DD0000">" empty values\n"</span><span style="color: #007700">;<br />    print </span><span style="color: #DD0000">"Posted:\n"</span><span style="color: #007700">; </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$post</span><span style="color: #007700">);<br />    print </span><span style="color: #DD0000">"Empty:\n"</span><span style="color: #007700">;  </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$empty</span><span style="color: #007700">);<br />    exit;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>

    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.singlequotes">
    <dt><strong>
     
      シングルクオート(&#039;)をバックスラッシュでエスケープされた
      シングルクオート(\&#039;)に変換しなければならないのですが、
      正規表現を用いてこれを行うにはどの様にするのですか？
      同様に &quot; を \&quot; に、\ を \\ に変換したいのです。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      もしデータベースに格納するためにそんなことをしようとしているのなら、
      データベース自身が持つエスケープの仕組みを使うようにしましょう。
      MySQL なら <span class="function"><a href="function.mysql-real-escape-string.php" class="function">mysql_real_escape_string()</a></span>、
      PostgreSQL なら <span class="function"><a href="function.pg-escape-string.php" class="function">pg_escape_string()</a></span> などです。
      汎用的な関数 <span class="function"><a href="function.addslashes.php" class="function">addslashes()</a></span> や
      <span class="function"><a href="function.stripslashes.php" class="function">stripslashes()</a></span> もありますが、
      これはさらに古い時代の PHP コードで使われていたものです。
     </p>
     <p class="para">
      手動で値をエスケープする方法はエラーが発生しやすく、コンテキストに依存します。
      エスケープした文字列を連結してクエリを組み立てるのではなく、
      プリペアドステートメントとパラメータバインディングをサポートする
      データベース API を使うようにしてください。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.wrong-order">
    <dt><strong>
     
      次のようなコードを実行すると、思った通りの順番で出力が表示されません。
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">function myfunc($argument)<br />{<br />    echo $argument + 10;<br />}<br />$variable = 10;<br />echo "myfunc($variable) = " . myfunc($variable);</span></code></div>
    </div>

      なぜですか？
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      式の中で関数の実行結果を使用する(例えば上の例の様に他の文字列と
      連結する)ためには、<span class="function"><a href="function.echo.php" class="function">echo</a></span> するのではなく、その
      値を <span class="function"><a href="function.return.php" class="function">return</a></span> しなければいけません。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.newlines">
    <dt><strong>
     
      改行されないのですが？
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">&lt;pre&gt;<br /><span style="color: #0000BB">&lt;?php </span><span style="color: #007700">echo </span><span style="color: #DD0000">"これは1行目"</span><span style="color: #007700">; </span><span style="color: #0000BB">?&gt;<br />&lt;?php </span><span style="color: #007700">echo </span><span style="color: #DD0000">"この行は改行に続いて出力されるはず"</span><span style="color: #007700">; </span><span style="color: #0000BB">?&gt;<br /></span>&lt;/pre&gt;</span></code></div>
      </div>

     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      PHPでは、&quot;?&gt;&quot;か&quot;?&gt;\n&quot;(\nは改行を表します)をPHPのコードブロッ
      クの終端と見なします。このため、コードブロック終端の改行記号は省
      略され、表示される文は1行になります。つまり、改行をさせるために
      は、PHPのコードブロックの終端の後にもう1つ改行を挿入する必要があ
      るということです。
     </p>
     <p class="para">
     なぜPHPはこのようなことをするのでしょうか？なぜならHTMLを出力する
     場合にはこの方が都合のよいことが多いからです。もしとても長い1行を
     出力しなければならない場合に、改行が解釈されてしまうとしたらどう
     でしょう。ソースコードの1行もとても読めないくらい長いものになって
     しまいます。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.headers-sent">
    <dt><strong>
     
      &#039;Warning: Cannot send session cookie - headers already sent...&#039;や
      &#039;Cannot add header information - headers already set...&#039;といった
      メッセージが出力されるのですが。
      sent...&#039;.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      <span class="function"><a href="function.header.php" class="function">header()</a></span>, <span class="function"><strong>set_cookie()</strong></span>や
      <a href="ref.session.php" class="link">セッション関数</a>は出力ストリームに
      ヘッダを付加する関数で、ヘッダを送信できるのは本文の出力を
      開始する前のみです。<span class="function"><a href="function.headers-sent.php" class="function">headers_sent()</a></span>を使って
      既にヘッダが送信済みでないかチェックすることができます。
      <a href="ref.outcontrol.php" class="link">出力制御関数</a>もご覧ください。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.header">
    <dt><strong>
     
      リクエストヘッダに直接アクセスしたいのですが、どうすればよいですか？
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
     もしPHPがApacheモジュールとして動作しているなら、
     <span class="function"><a href="function.getallheaders.php" class="function">getallheaders()</a></span>を使えば全てのヘッダを取得する
     ことができます。下のちょっとしたコードで全てのリクエストヘッダを
     表示することができます。
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">$headers = getallheaders();<br />foreach ($headers as $name =&gt; $content) {<br />    echo "headers[$name] = $content&lt;br /&gt;\n";<br />}</span></code></div>
      </div>

     </p>
      <p class="para">
      <span class="function"><a href="function.apache-lookup-uri.php" class="function">apache_lookup_uri()</a></span>,
      <span class="function"><a href="function.apache-response-headers.php" class="function">apache_response_headers()</a></span>,
      <span class="function"><a href="function.fsockopen.php" class="function">fsockopen()</a></span>も参照ください。
     </p>
   </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.authentication">
    <dt><strong>
     
      IISで認証を行おうとすると&#039;No Input file specified&#039;というエラーが
      発生します。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      これはIISのセキュリティモデルの欠点で、IISで動作するCGIに共通する
      問題です。これを回避策するには、認証のかかったディレクトリに(PHP
      が解釈しない)HTMLファイルを作成します。そしてMETAタグを使ってPHP
      を使用したページにリダイレクトするか、リンクを張ります。こうすれ
      ばPHPは認証済みかどうかを正しく認識することが出来ます。
      また、これは他のNTウェブサーバーに
      は影響ありません。詳しくは<a href="http://support.microsoft.com/kb/q160422/" class="link external">&raquo;&nbsp;http://support.microsoft.com/kb/q160422/</a>
      と<a href="features.http-auth.php" class="link">HTTP 認証</a>を
      参照ください。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.iis.sharing">
    <dt><strong>
     
      Windows: 他のコンピュータと共有しているファイルに、IIS
      でアクセスできません。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      <code class="literal">Go to Internet Information
      Services</code> を変更する必要があります。PHP ファイルを選択して
      プロパティを開き、<code class="literal">セキュリティ</code> タブに移動し、
      <code class="literal">Edit -&lt; Anonymous access and authentication control</code> 。
     </p>
     <p class="para">
      この問題を解決するには <code class="literal">Anonymous
      Access</code> のチェックをはずして <code class="literal">Integrated Window
      Authentication</code> をチェックしたままにしておきか、
      あるいは <code class="literal">Anonymous
      Access</code> をチェックしてアクセスできないユーザーを別途指定します。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.mixml">
    <dt><strong>
     
     どうすればXMLとPHPは共存することが出来るのですか？XMLの
     &lt;?xml&gt;タグがPHPでエラーになります。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      &lt;?xml を直接PHPコードに埋め込むには、
      PHPディレクティブの<a href="ini.core.php#ini.short-open-tag" class="link">short_tags</a>
      を <code class="literal">0</code> に設定しなければなりません。
      このディレクティブは<span class="function"><a href="function.ini-set.php" class="function">ini_set()</a></span>でセットすることは
      できません。<a href="ini.core.php#ini.short-open-tag" class="link">short_open_tags</a>
      のオン/オフに関わらず、次のようにもできます: 
      <code class="literal">&lt;?php echo &#039;&lt;?xml&#039;; ?&gt;</code>
      このディレクティブはデフォルトでオンです。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.variables">
    <dt><strong>
     
      あらかじめ設定されている変数を全て網羅したリストはどこにあるので
      すか？なぜPHPのドキュメントにはその一覧がないのですか？
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      マニュアルの
      <a href="language.variables.predefined.php" class="link">定義済みの変数</a>
      のページを読んでください。スクリプト上で有効な定義済み変数のリストの
      一部があります。有効な変数の完全なリスト（とその詳しい情報）は
      <span class="function"><a href="function.phpinfo.php" class="function">phpinfo()</a></span>をコールすることで見ることができます。
      マニュアルの
      <a href="language.variables.external.php" class="link">PHPの外部から来る変数</a>
      のセクションも読んでください。HTMLフォームやCookie、URL等から
      来る外部変数に関するシナリオが説明されています。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.freepdf">
    <dt><strong>
     
      フリーではない商用ライブラリである
      PDFLib を使わずに
      PDFファイルを生成するにはどうしたらよいでしょうか？
      フリーのもので、外部のPDFライブラリが不要なものがいいのですが。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      PHPで書かれている代替手段がいくつかあります。
      <a href="http://www.fpdf.org/" class="link external">&raquo;&nbsp;FPDF</a> や
      <a href="http://www.tcpdf.org/" class="link external">&raquo;&nbsp;TCPDF</a> などです。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.shorthandbytes">
    <dt><strong>
     
      いくつかの PHP ディレクティブでは、バイト値を <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> 
      ではなく省略形で設定できます。この省略形で使えるオプションを教えてください。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      有効なオプションは K（キロバイト）、M（メガバイト）および G（ギガバイト)
      です。これらはすべて、大文字小文字を区別しません。
      これ以外の文字はバイト値と判断されます。
      <code class="literal">1M</code> は、1 メガバイトあるいは <code class="literal">1048576</code>
      バイトと等しくなります。<code class="literal">1K</code> は、1 キロバイトあるいは
      <code class="literal">1024</code> バイトです。この表記法は、 <var class="filename">php.ini</var>
      や <span class="function"><a href="function.ini-set.php" class="function">ini_set()</a></span> 関数で使えます。
      ここで、数値の値は、<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>
      型にキャストされることに注意して下さい。
      たとえば、<code class="literal">0.5M</code> は <code class="literal">0</code>
      と解釈されます。
     </p>
     <blockquote class="note"><p><strong class="note">注意</strong>: 
      <strong>キロバイト? キビバイト?</strong><br />
      <p class="para">
       PHP の記法では 1 キロバイト = 1024 バイトとしていますが、
       <abbr>IEC</abbr> の標準規格では 1024 バイトのことを
       1 キビバイト (kibibyte) と呼ぶことになっています。
       まとめ: PHP での k および K = 1024 バイト。
      </p>
     </p></blockquote>
    </dd>
   </dl>

  
 </div>
<?php manual_footer($setup); ?>