<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.variables.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'language.variables.external.php',
    1 => '外部から来る変数',
    2 => '外部から来る変数',
  ),
  'up' => 
  array (
    0 => 'language.variables.php',
    1 => '変数',
  ),
  'prev' => 
  array (
    0 => 'language.variables.variable.php',
    1 => '可変変数',
  ),
  'next' => 
  array (
    0 => 'language.constants.php',
    1 => '定数',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'language/variables.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.variables.external" class="sect1">
   <h2 class="title">外部から来る変数</h2>
   
   <div class="sect2" id="language.variables.external.form">
    <h3 class="title">HTML フォーム (GET と POST)</h3>
    
    <p class="simpara">
     フォームが PHP スクリプトに投稿された時、フォームから渡された全て
     の変数は PHP により自動的にスクリプトから使用可能となります。
     この情報にアクセスする手段は複数あります。例を以下に示します。
    </p>

    <p class="para">
     <div class="example" id="example-1">
      <p><strong>例1 簡単なHTMLフォーム</strong></p>
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;form action=&quot;foo.php&quot; method=&quot;post&quot;&gt;
    Name:  &lt;input type=&quot;text&quot; name=&quot;username&quot; /&gt;&lt;br /&gt;
    Email: &lt;input type=&quot;text&quot; name=&quot;email&quot; /&gt;&lt;br /&gt;
    &lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Submit me!&quot; /&gt;
&lt;/form&gt;</pre>
</div>
      </div>

     </div>
    </p>

    <p class="para">
     HTML フォームからデータにアクセスする方法は二種類だけしかありません。
     現在使える方法を、以下にまとめます。
    </p>

    <p class="para">
     <div class="example" id="example-2">
      <p><strong>例2 簡単なPOST HTMLフォームからのデータにアクセスする</strong></p>
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php <br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">];<br />echo </span><span style="color: #0000BB">$_REQUEST</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
    </p>

    <p class="para">
     GETフォームを使用した場合も同じですが、かわりに適当な定義済みの
     GET変数を使用するところが異なります。
     GETは、<code class="literal">QUERY_STRING</code> (URLの&#039;?&#039;の後の情報)にも代入されます。
     例えば、
     <code class="literal">http://www.example.com/test.php?id=3</code>には、
     <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET['id']</a></var>によりアクセス可能なGETデータ
     が含まれます。
     <var class="varname"><a href="reserved.variables.request.php" class="classname">$_REQUEST</a></var> も参照ください。
    </p>

    <blockquote class="note"><p><strong class="note">注意</strong>: 
     <p class="para">
      変数名のドットやスペースはアンダースコアに変換されます。
      たとえば <code class="literal">&lt;input name=&quot;a.b&quot; /&gt;</code> は
      <code class="literal">$_REQUEST[&quot;a_b&quot;]</code> となります。
     </p>
    </p></blockquote>

    <p class="simpara">
     PHPではフォーム変数のコンテキスト内で配列が使用可能です(<a href="faq.html.php" class="link">FAQの関連箇所</a>も参照ください)。
     例えば、関連する変数をグループ化したり、select inputで複数の値を
     取得するといったことが可能です。フォームを同じスクリプトに投稿し、
     投稿したデータを表示する例を示します。
    </p>

    <p class="para">
     <div class="example" id="example-3">
      <p><strong>例3 より複雑なフォーム変数</strong></p>
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">'&lt;pre&gt;'</span><span style="color: #007700">;<br />    echo </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">));<br />    echo </span><span style="color: #DD0000">'&lt;/pre&gt;'</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;<br /></span>&lt;form action="" method="post"&gt;<br />    Name:  &lt;input type="text" name="personal[name]" /&gt;&lt;br /&gt;<br />    Email: &lt;input type="text" name="personal[email]" /&gt;&lt;br /&gt;<br />    Beer: &lt;br /&gt;<br />    &lt;select multiple name="beer[]"&gt;<br />        &lt;option value="warthog"&gt;Warthog&lt;/option&gt;<br />        &lt;option value="guinness"&gt;Guinness&lt;/option&gt;<br />        &lt;option value="stuttgarter"&gt;Stuttgarter Schwabenbrau&lt;/option&gt;<br />    &lt;/select&gt;&lt;br /&gt;<br />    &lt;input type="submit" value="submit me!" /&gt;<br />&lt;/form&gt;</span></code></div>
      </div>

     </div>
    </p>

    <blockquote class="note"><p><strong class="note">注意</strong>: 
     <span class="simpara">
      外部の変数の名前が、正しい配列の文法で始まっていた場合、
      後に続く文字は黙って無視されます。
      たとえば、<code class="literal">&lt;input name=&quot;foo[bar]baz&quot;&gt;</code>
      は <code class="literal">$_REQUEST[&#039;foo&#039;][&#039;bar&#039;]</code> になります。
     </span>
    </p></blockquote>

    <div class="sect3" id="language.variables.external.form.submit">
     <h4 class="title">IMAGE SUBMIT 変数名</h4>

     <p class="simpara">
      フォームを投稿する際、次のタグのように標準の投稿ボタンの代わりに
      画像を使用することができます。
     </p>

     <div class="informalexample">
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;input type=&quot;image&quot; src=&quot;image.gif&quot; name=&quot;sub&quot; /&gt;</pre>
</div>
      </div>

     </div>

     <p class="simpara">
      画像のどこかがクリックされた場合、二つの変数 <var class="varname">sub_x</var> および <var class="varname">sub_y</var>
      が付け加えられてこのフォームはサーバーに転送されます。これらの変
      数は、ユーザーがこの画像をクリックした座標を示しています。経験の
      ある人は、ブラウザにより送られた変数の名前においてアンダースコア
      がピリオドになってしまっていることを心配するかもしれません。
      しかし、PHP はピリオドをアンダースコアに自動的に変換します。
     </p>
    </div>

   </div>

   <div class="sect2" id="language.variables.external.cookies">
    <h3 class="title">HTTP Cookie</h3>

    <p class="simpara">
     PHP は、<a href="https://datatracker.ietf.org/doc/html/rfc6265" class="link external">&raquo;&nbsp;RFC 6265</a>
     に定義されたHTTP Cookieを完全にサポートします。Cookieは、リモート
     ブラウザにデータを保持し、再訪するユーザーを追跡し、特定する機構
     です。<span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span> 関数によりCookieをセットす
     ることができます。Cookieは、HTTP ヘッダの一部なので、SetCookie
     関数をブラウザに何かを出力する前にコールする必要があります。
     この制約は、<span class="function"><a href="function.header.php" class="function">header()</a></span> 関数のものと同じです。
     Cookieのデータは、<var class="varname"><a href="reserved.variables.cookies.php" class="classname">$_COOKIE</a></var> のような適当なCookieデータ
     配列で参照可能です。また、 <var class="varname"><a href="reserved.variables.request.php" class="classname">$_REQUEST</a></var>でも
     参照可能です。詳細および例については、
     <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span>のマニュアルページを参照ください。
    </p>

    <blockquote class="note"><p><strong class="note">注意</strong>: 
     <span class="simpara">
      セキュリティ上の理由により、
      PHP 7.2.34, 7.3.23, 7.4.11 以降では、外部から入力される Cookie の <em>名前</em>
      はurlデコードされなくなりました。
     </span>
    </p></blockquote>

    <p class="simpara">
     単一のCookieに複数の値を代入したい場合は、配列として
     代入することが可能です。以下に例を示します。
    </p>

    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />  setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">"MyCookie[foo]"</span><span style="color: #007700">, </span><span style="color: #DD0000">'Testing 1'</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br />  </span><span style="color: #0000BB">setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">"MyCookie[bar]"</span><span style="color: #007700">, </span><span style="color: #DD0000">'Testing 2'</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>

    <p class="simpara">
     上記スクリプトにおいては、2つの異なるCookieを生成されますが、
     この場合、スクリプトでは <var class="varname">MyCookie</var> という単一の配列になります。
     一つのCookieに複数の値を設定したい場合、最初の値に
     <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span>または
     <span class="function"><a href="function.explode.php" class="function">explode()</a></span>を用いることを考えてください。
    </p>

    <p class="simpara">
     Cookieは、パスまたはドメインが異ならない限り、
     以前のクッキーをブラウザ上の同じ名前の変数に置き換えることに
     注意してください。
     さて、買い物かご(Shopping Cart) プログラムの場合、カウンタを保持し、
     受け渡したいと思うかもしれません。
     これは、次のようになります。
    </p>

    <div class="example" id="example-4">
     <p><strong>例4 <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span>の例</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">if (isset(</span><span style="color: #0000BB">$_COOKIE</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">])) {<br />    </span><span style="color: #0000BB">$count </span><span style="color: #007700">= </span><span style="color: #0000BB">$_COOKIE</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">] + </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />} else {<br />    </span><span style="color: #0000BB">$count </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">'count'</span><span style="color: #007700">, </span><span style="color: #0000BB">$count</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">"Cart[</span><span style="color: #0000BB">$count</span><span style="color: #DD0000">]"</span><span style="color: #007700">, </span><span style="color: #0000BB">$item</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>

   </div>

   <div class="sect2" id="language.variables.external.dot-in-names">
    <h3 class="title">外部変数名のドット</h3>
    
    <p class="para">
     通常、PHP はスクリプトに渡された変数の名前を変更しません。しかし、
     ドット(ピリオド、終止符)はPHPの変数名で有効な文字ではないというこ
     とに注意する必要があります。次の例を見てみましょう。
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$varname</span><span style="color: #007700">.</span><span style="color: #0000BB">ext</span><span style="color: #007700">;  </span><span style="color: #FF8000">/* 無効な変数名 */<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     ここで、パーサーは、<var class="varname">$varname</var>という名前の変数の後に
     文字列結合演算子があり、その後に、裸の文字列(すなわち、既知のキー
     または予約語にマッチしない引用符無しの文字列) &#039;ext&#039; が続くとして
     解釈します。この場合、明らかに意図する結果にはなりません。
    </p>

    <p class="para">
     重要なことを記述しておくと、このため、外部変数に含まれるドットを
     PHP は自動的にアンダースコアに変換します。
    </p>
    
   </div>
 
   <div class="sect2" id="language.variables.determining-type-of">
    <h3 class="title">変数の型の定義</h3>

    <p class="para">
     PHPは、変数の型を定義し、必要に応じて変換します。このため、ある変
     数の型がある時点で常に明らかであるわけではありません。PHPは、変数
     の型を調べる複数の関数をサポートしています。それらは、
    <span class="function"><a href="function.gettype.php" class="function">gettype()</a></span>, <span class="function"><a href="function.is-array.php" class="function">is_array()</a></span>,
     <span class="function"><a href="function.is-float.php" class="function">is_float()</a></span>, <span class="function"><a href="function.is-int.php" class="function">is_int()</a></span>,
     <span class="function"><a href="function.is-object.php" class="function">is_object()</a></span>,
     <span class="function"><a href="function.is-string.php" class="function">is_string()</a></span> です。
     <a href="language.types.php" class="link">型</a>の章も参照ください。
    </p>

    <p class="para">
     HTTP はテキストプロトコルなので、
     <var class="varname"><a href="reserved.variables.post.php" class="classname">$_POST</a></var> および <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET</a></var>
     のような
     <a href="language.variables.superglobals.php" class="link">スーパーグローバル配列</a>
     に入ってくる内容は、全てとは言えないまでも、ほとんどは文字列のままです。
     PHP は決して値を特定の型に変換したりはしません。
     以下の例では、<var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET["var1"]</a></var> 
     は &quot;null&quot; という文字列を含みますし、
     <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET["var2"]</a></var> は、文字列 &quot;123&quot; を含みます。
     <div class="example-contents">
<div class="cdata"><pre>
/index.php?var1=null&amp;var2=123
</pre></div>
     </div>

    </p>
   </div>

   <div class="sect2" id="language.variables.external.changelog">
    <h3 class="title">変更履歴</h3>

    <p class="para">
     <table class="doctable informaltable">
      
       <thead>
        <tr>
         <th>バージョン</th>
         <th>説明</th>
        </tr>

       </thead>

       <tbody class="tbody">
        <tr>
         <td>7.2.34, 7.3.23, 7.4.11</td>
         <td>
          セキュリティ上の理由により、外部から入力される Cookie の
          <em>名前</em> はurlデコードされなくなりました。
         </td>
        </tr>

       </tbody>
      
     </table>

    </p>
   </div>

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