<?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.html.php',
    1 => 'PHP と HTML',
    2 => 'PHP と HTML',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'FAQ',
  ),
  'prev' => 
  array (
    0 => 'faq.passwords.php',
    1 => 'パスワードのハッシュ',
  ),
  'next' => 
  array (
    0 => 'faq.com.php',
    1 => 'PHP と COM',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'faq/html.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="faq.html" class="chapter">
  <h1 class="title">PHP と HTML</h1>

  
  
  <p class="para">
   PHP と HTML は深く関係しています。PHP は HTML を生成し、HTML には PHP に
   送信される情報が記述されています。
   以下の FAQ を読む前に、どうやって <a href="language.variables.external.php" class="link">
   外部から来る変数</a>を取得するかを読んでおくことは重要です。
   このマニュアルにはこのトピックに関するよい例があります。
  </p>

  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.html.encoding">
     
      フォームから、もしくは URL から値を渡す場合にはどういった
      エンコード/デコードが必要なのですか？
     
    </a></li><li><a href="#faq.html.form-image">
     
      &lt;input type=&quot;image&quot;&gt; タグを使おうとしているのですが、変数
      $foo.x と $foo.y が使えません。
      $_GET[&#039;foo.x&#039;] も存在していません。どうすればよいのですか?
     
    </a></li><li><a href="#faq.html.arrays">
     HTML フォームで配列を使用するにはどうすればよいですか？
    </a></li><li><a href="#faq.html.select-multiple">
     
      &quot;select multiple&quot; タグで選択された全ての結果を取得するには
      どうすればよいですか?
     
    </a></li><li><a href="#faq.html.javascript-variable">
     
      JavaScript から PHP に変数を渡すには?
     
    </a></li></ol></div>
   <dl class="qandaentry" id="faq.html.encoding">
    <dt><strong>
     
      フォームから、もしくは URL から値を渡す場合にはどういった
      エンコード/デコードが必要なのですか？
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      エンコードが重要になる場面はいくつかあります。
      <span class="type"><a href="language.types.string.php" class="type string">string</a></span> <var class="varname">$data</var> という
      エンコードされていない文字列データを渡す場合について考えてみると、
      <ul class="itemizedlist">
       <li class="listitem">
        <p class="para">
         HTML を通じて渡す場合： 文字列にはどのような値が含まれるか分からないので、
         データは<em>必ず</em> htmlspecialchars を行い、
         ダブルクオートで囲まなければなりません。
        </p>
       </li>
       <li class="listitem">
        <p class="para">
         URL を通じて渡す場合: URL はいくつかのパーツから成り立ちます。
         このデータをそのパーツのうちの一つであると解釈させたいならば、
         <span class="function"><a href="function.urlencode.php" class="function">urlencode()</a></span> でエンコード
         <em>しなければなりません。</em>
        </p>
       </li>
      </ul>
     </p>
     <p class="para">
      <div class="example" id="example-1">
       <p><strong>例1 HTML の hidden 要素</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: #DD0000">'&lt;input type="hidden" value="' </span><span style="color: #007700">. </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">) . </span><span style="color: #DD0000">'" /&gt;'</span><span style="color: #007700">.</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
       </div>

      </div>
      <blockquote class="note"><p><strong class="note">注意</strong>: 
       <span class="simpara">
        <var class="varname">$data</var> を <span class="function"><a href="function.urlencode.php" class="function">urlencode()</a></span> をしては
        いけません。なぜなら、その作業はブラウザに任されているからです。
        一般に普及している全てのブラウザは正しくこの処理を行ってくれます。
        ただ、この処理はメソッド(GET や POST)が何であるかにかかわらずに
        行われるということに気をつけてください。この処理に気づくのは
        GET リクエストのときだけになるでしょう。なぜなら POST
        リクエストの内容は通常目に触れることは無いからです。
       </span>
      </p></blockquote>
      <div class="example" id="example-2">
       <p><strong>例2 ユーザーによって編集するデータ</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: #DD0000">"&lt;textarea name='mydata'&gt;\n"</span><span style="color: #007700">;<br />    echo </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">).</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />    echo </span><span style="color: #DD0000">"&lt;/textarea&gt;"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
       </div>

      </div>
      <blockquote class="note"><p><strong class="note">注意</strong>: 
       <span class="simpara">
        ブラウザはエスケープされたシンボルを解釈するので、data は
        意図したとおりに表示されます。
       </span>
       <span class="simpara">
        フォームの内容を送信するとき、GET か POST かにかかわらず data は
        ブラウザによって URL エンコードされ、PHP によって URL デコードされます。
        要は、URL エンコード/デコードを自分で行う必要はなく、これらの処理は
        すべて自動的に行われると言うことです。
       </span>
      </p></blockquote>
      <div class="example" id="example-3">
       <p><strong>例3 URL 中の場合</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: #DD0000">'&lt;a href="' </span><span style="color: #007700">. </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #DD0000">"/nextpage.php?stage=23&amp;data=" </span><span style="color: #007700">.<br />        </span><span style="color: #0000BB">urlencode</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">)) . </span><span style="color: #DD0000">'"&gt;'</span><span style="color: #007700">.</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
       </div>

      </div>
      <blockquote class="note"><p><strong class="note">注意</strong>: 
       <span class="simpara">
        この例では、実は GET リクエストを摸擬しています。このため、data
        を手動で <span class="function"><a href="function.urlencode.php" class="function">urlencode()</a></span> する必要があります。
       </span>
      </p></blockquote>
      <blockquote class="note"><p><strong class="note">注意</strong>: 
       <span class="simpara">
        全ての URL を <span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span> する必要があります。
        なぜなら、この URL は HTML の value 属性として扱われるからです。
        この場合は、ブラウザはまず <span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span> された
        データを元に戻し、それから URL を渡します。URL は
        <span class="function"><a href="function.urlencode.php" class="function">urlencode()</a></span> されているので、PHP はこれを正しく
        解釈することができます。
       </span>
       <span class="simpara">
        URL 中の <code class="literal">&amp;</code> が <code class="literal">&amp;amp;</code>
        に置き換えられていることに気づくでしょう。もしあなたがこれを忘れても
        ほとんどのブラウザは元に戻してくれますが、必ずそうしてくれるとは
        限りませんので、URL が動的に変更されるものでなくても
        URL は <span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span> される<em>べき
        </em>です。
       </span>
      </p></blockquote>
     </p>
     
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.html.form-image">
    <dt><strong>
     
      &lt;input type=&quot;image&quot;&gt; タグを使おうとしているのですが、変数
      <var class="varname">$foo.x</var> と <var class="varname">$foo.y</var> が使えません。
      <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET['foo.x']</a></var> も存在していません。どうすればよいのですか?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      以下のようなタグを使えば、標準のボタンの代わりに画像を使用して
      フォームを送信することができます。
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;input type=&quot;image&quot; src=&quot;image.gif&quot; name=&quot;foo&quot; /&gt;</pre>
</div>
      </div>

      ユーザーが画像のどこかをクリックすると、そのフォームの内容に <var class="varname">foo.x</var>
      と <var class="varname">foo.y</var> という 2 つの変数が追加され、サーバーに送信されます。
     </p>
     <p class="para">
      PHP では <var class="varname">foo.x</var> と <var class="varname">foo.y</var> という名前は変数名として正しくないので、
      自動的に <var class="varname">foo_x</var> と <var class="varname">foo_y</var> という名前に変換されます。要は、ピリオドが
      アンダースコアに置き換えられる、と言うことです。そのため、これらの
      変数にアクセスする際には
      <a href="language.variables.external.php" class="link">外部から来る変数
      </a> の取得についてのセクションで記述されているのと同様な方法を
      とります。たとえば <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET['foo_x']</a></var> などです。
      <blockquote class="note"><p><strong class="note">注意</strong>: 
       <p class="para">
         リクエスト変数名の中のスペースは、アンダースコアに置き換えられます。
       </p>
      </p></blockquote>
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.html.arrays">
    <dt><strong>
     HTML フォームで配列を使用するにはどうすればよいですか？
    </strong></dt>
    <dd class="answer">
     <p class="para">
      フォームの内容を PHP スクリプトで<a href="language.types.array.php" class="link">配列</a>として受け取るには、
      &lt;input&gt;、&lt;select&gt; あるいは &lt;textarea&gt; といった要素の name
      を以下のように指定します：
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;input name=&quot;MyArray[]&quot; /&gt;
&lt;input name=&quot;MyArray[]&quot; /&gt;
&lt;input name=&quot;MyArray[]&quot; /&gt;
&lt;input name=&quot;MyArray[]&quot; /&gt;</pre>
</div>
      </div>

      変数名の最後にある括弧に注意してください。これにより、フォー
      ムの内容が配列として扱われます。異なる要素に同じ名前をつけること
      で要素を配列にグループ分けすることができます。
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;input name=&quot;MyArray[]&quot; /&gt;
&lt;input name=&quot;MyArray[]&quot; /&gt;
&lt;input name=&quot;MyOtherArray[]&quot; /&gt;
&lt;input name=&quot;MyOtherArray[]&quot; /&gt;</pre>
</div>
      </div>

      上記の HTML の場合、MyArray と MyOtherArray という 2 つの配列が生成され、
      PHP スクリプトに送信されます。また、配列に特定のキーを設定する
      こともできます。
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;input name=&quot;AnotherArray[]&quot; /&gt;
&lt;input name=&quot;AnotherArray[]&quot; /&gt;
&lt;input name=&quot;AnotherArray[email]&quot; /&gt;
&lt;input name=&quot;AnotherArray[phone]&quot; /&gt;</pre>
</div>
      </div>

      この場合、配列 AnotherArray のキーは 0、1、email そして phone となります。
     </p>
     <p class="para">
      <blockquote class="note"><p><strong class="note">注意</strong>: 
       <p class="para">
         HTML に配列のキーを指定するかどうかは自由です。キーを指定しなかった
         場合はフォームに現れる順番に番号がつけられます。最初の例だと、
         キーは 0、1、2、3 となります。
       </p>
      </p></blockquote>
     </p>
     <p class="para">
      <a href="ref.array.php" class="link">配列関数</a>と
      <a href="language.variables.external.php" class="link">外部から来る変数
      </a>も参照ください。
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.html.select-multiple">
    <dt><strong>
     
      &quot;select multiple&quot; タグで選択された全ての結果を取得するには
      どうすればよいですか?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      &quot;select multiple&quot; タグを使うと、ユーザーはリストから複数の項目を
      選択することができるようになります。選択された項目はフォームの
      action で指定されたハンドラに渡されます。問題は、これらの値が全て
      同じ名前で渡されることです。つまり、
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;select name=&quot;var&quot; multiple=&quot;yes&quot;&gt;</pre>
</div>
      </div>

      選択されたそれぞれの項目は action のハンドラに次のように渡されます：
      <div class="example-contents"><div class="cdata"><pre>
var=option1
var=option2
var=option3
      </pre></div></div>

      それぞれの項目は前の変数 <var class="varname">$var</var> の値を上書きして
      しまいます。この問題を解決するには、PHPの &quot;フォームの値を配列にする&quot;
      機能を使います。以下のようにするとよいでしょう。
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;select name=&quot;var[]&quot; multiple=&quot;yes&quot;&gt;</pre>
</div>
      </div>

      こうすれば PHP に <var class="varname">$var</var> を配列として扱うように
      知らせることができ、各項目の value の値は配列の要素として var[] に
      追加されます。最初の項目は <var class="varname">$var[0]</var> になり、
      次の項目は <var class="varname">$var[1]</var>... というようになります。
      <span class="function"><a href="function.count.php" class="function">count()</a></span> 関数を使えば選択された項目の数を知る
      ことができます。またもし必要なら <span class="function"><a href="function.sort.php" class="function">sort()</a></span> 関数を
      使ってソートを行うこともできます。
     </p>
     <p class="para">
      JavaScript を使っている場合、フォーム要素に要素名を使って(訳注：
      document.myform.myelement.value 等の様に)アクセスしようとすると、
      要素名に含まれる <code class="literal">[]</code> が問題となることがあるので
      気をつけてください。この場合は、数字で表されるフォーム要素の ID を
      使用するか、シングルクオートで要素名を囲んでフォーム要素の配列の
      インデックスとしてアクセスしてください。例えば、以下のようにします：
      <div class="example-contents"><div class="cdata"><pre>
variable = document.forms[0].elements[&#039;var[]&#039;];
      </pre></div></div>

     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.html.javascript-variable">
    <dt><strong>
     
      JavaScript から PHP に変数を渡すには?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      JavaScript は（普通は）クライアントサイド技術であり、一方 PHP は（普通は）
      サーバーサイド技術です。また HTTP は&quot;ステートレスな&quot;プロトコルです。
      そのため、この二つの言語はダイレクトに変数を共有することができません。
     </p>
     <p class="para">
      しかしながら、この二つの言語の間で変数を渡すことは可能です。
      一つの方法は PHP と一緒に JavaScript のコードを生成し、
      ブラウザに自動的にリフレッシュ（再ロード）させることです。
      以下の例はまさにそれで、PHP に画面の高さと幅を認識させています。
      これは通常はクライアントサイドでしかできないことです。
     </p>
     <p class="para">
      <div class="example" id="example-4">
       <p><strong>例4 PHP による JavaScript の生成</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">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'width'</span><span style="color: #007700">]) AND isset(</span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'height'</span><span style="color: #007700">])) {<br />  </span><span style="color: #FF8000">// ジオメトリ値を出力する<br />  </span><span style="color: #007700">echo </span><span style="color: #DD0000">"画面の幅: "</span><span style="color: #007700">. </span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'width'</span><span style="color: #007700">] .</span><span style="color: #DD0000">"&lt;br /&gt;\n"</span><span style="color: #007700">;<br />  echo </span><span style="color: #DD0000">"画面の高さ: "</span><span style="color: #007700">. </span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'height'</span><span style="color: #007700">] .</span><span style="color: #DD0000">"&lt;br /&gt;\n"</span><span style="color: #007700">;<br />} else {<br />  </span><span style="color: #FF8000">// ジオメトリ変数を渡す<br />  // (元のクエリ文字列を保持する<br />  //   -- POST 変数は別の方法で扱う必要がある)<br /><br />  </span><span style="color: #007700">echo </span><span style="color: #DD0000">"&lt;script language='javascript'&gt;\n"</span><span style="color: #007700">;<br />  echo </span><span style="color: #DD0000">"  location.href=\"</span><span style="color: #007700">{</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'SCRIPT_NAME'</span><span style="color: #007700">]}</span><span style="color: #DD0000">?</span><span style="color: #007700">{</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'QUERY_STRING'</span><span style="color: #007700">]}</span><span style="color: #DD0000">"<br />            </span><span style="color: #007700">. </span><span style="color: #DD0000">"&amp;width=\" + screen.width + \"&amp;height=\" + screen.height;\n"</span><span style="color: #007700">;<br />  echo </span><span style="color: #DD0000">"&lt;/script&gt;\n"</span><span style="color: #007700">;<br />  exit();<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
       </div>

      </div>
     </p>
    </dd>
   </dl>

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