<?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 => 'zh',
  ),
  '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' => 'zh',
    '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
   传递信息。在阅读这些常见问题之前，先学会怎样<a href="language.variables.external.php" class="link">从
   PHP 之外取得变量</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变量，它们哪去了？
      </a></li><li><a href="#faq.html.arrays">
        怎样在 HTML 的 &lt;form&gt; 中建立数组？
      </a></li><li><a href="#faq.html.select-multiple">
        怎样从可多选的 HTML 的 select multiple 标记中得到所有结果？
      </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>将其放在双引号中，并用 
            <span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span>处理整个值。</p>
          </li>
          <li class="listitem">
            <p class="para">URL：URL 由几部分组成。如果希望自己的数据被当作其中一项来解释，
            <em>必须</em>用 <span class="function"><a href="function.urlencode.php" class="function">urlencode()</a></span> 对其编码。
        </p>
       </li>
      </ul>
     </p>
     <p class="para">
      <div class="example" id="example-1">
       <p><strong>示例 #1 隐藏的 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: #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">
        用 
            <span class="function"><a href="function.urlencode.php" class="function">urlencode()</a></span>来处理 
            <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">数据会按照预期的显示在浏览器中，因为浏览器会解释 HTML 转义符号。</span>
            <span class="simpara">当提交时，不论是 GET 或者 POST 方法，数据都会被浏览器进行 urlencode 来传输，并直接被 PHP urldecode。所以最终不需要自己处理任何 urlencoding/urldecoding，全都是自动处理的。</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">事实上这在编造一个 HTML 的 GET 请求，因此需要手工对数据进行 
            <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 属性的一个值出现的。在本例中，浏览器会首先对值进行 un-
            <span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span>，然后再传递此 URL。PHP 将能正确理解 URL，因为对数据进行了 
            <span class="function"><a href="function.urlencode.php" class="function">urlencode()</a></span>。</span>
            <span class="simpara">要注意到 URL 中的 
            <code class="literal">&amp;</code>被替换成了 
            <code class="literal">&amp;amp;</code>。如果忘了这一步，尽管大多数浏览器都能恢复，但也不总是这样。因此即使 URL 不是动态的，也
            <em>需要</em>对 URL 进行 
            <span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span>。</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>变量，它们哪去了？
      </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>。</p>
        <p class="para">因为 
        <var class="varname">foo.x</var>和 
        <var class="varname">foo.y</var>在 PHP 中会成为非法的变量名，它们被自动转换成了 
        <var class="varname">foo_x</var>和 
        <var class="varname">foo_y</var>。也就是用下划线代替了点。因此，可以按照在
        <a href="language.variables.external.php" class="link">来自 PHP 之外的变量</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 的 &lt;form&gt; 中建立数组？
      </strong></dt>
      <dd class="answer">
        <p class="para">要使你的 &lt;form&gt; 结果被当成 
        <a href="language.types.array.php" class="link">array</a>发送到 PHP 脚本，要对 &lt;input&gt;，&lt;select&gt; 或者 &lt;textarea&gt; 单元这样命名： 
        <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>
这将产生两个数组，MyArray 和 MyOtherArray，并发送给 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">来自 PHP 之外的变量</a>。</p>
      </dd>
    </dl>
    <dl class="qandaentry" id="faq.html.select-multiple">
      <dt><strong>
        怎样从可多选的 HTML 的 select multiple 标记中得到所有结果？
      </strong></dt>
      <dd class="answer">
        <p class="para">可多选的 select multiple 标记是 HTML 的一个构造，允许用户从一个列表中选择多个项目。这些项目接着被传递给该表单 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>
每个被选项将这样被传递到表单处理程序： 
        <div class="example-contents"><div class="cdata"><pre>var=option1 var=option2 var=option3</pre></div></div>
每个选项将覆盖前面一个 
        <var class="varname">$var</var>变量的内容。解决方案是用 PHP 的“表单单元数组”特性。使用方法如下： 
        <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>当成数组对待，每个对 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 中通过名字来引用单元，单元名字中的 
        <code class="literal">[]</code>可能会造成问题。用表单单元中的数字序号来替代，或者将变量名用单引号括起来并用其作为单元数组的索引，例如： 
      <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 是一种“无状态”协议，因此两种语言之间不能直接共享变量。</p>
        <p class="para">但是，有可能在二者之间传递变量。一种实现的方法是用 PHP 生成 Javascript 代码，并让浏览器自动刷新，将特定的变量传递回 PHP 脚本。以下例子显示了如何这样做——让 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">// output the geometry variables<br />  </span><span style="color: #007700">echo </span><span style="color: #DD0000">"Screen width is: "</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">"Screen height is: "</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">// pass the geometry variables<br />  // (preserve the original query string<br />  //   -- post variables will need to handled differently)<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); ?>