<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >PHP 和 HTML</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="PHP 手册" HREF="index.html"><LINK REL="UP" TITLE="FAQ:常见问题" HREF="faq.html"><LINK REL="PREVIOUS" TITLE="使用 PHP" HREF="faq.using.html"><LINK REL="NEXT" TITLE="PHP 和 COM" HREF="faq.com.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="chapter" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >PHP 手册</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="faq.using.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="faq.com.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="chapter" ><H1 ><A NAME="faq.html" >章 56. PHP 和 HTML</A ></H1 ><P > PHP 和 HTML 有很多相互作用:PHP 能生成 HTML,HTML 可以向 PHP 传递信息。在阅读这些常见问题之前,先学会怎样<A HREF="language.variables.external.html" >从 PHP 之外取得变量</A >很重要。此主题的手册页也包括很多例子。还要仔细留意 <TT CLASS="literal" >register_globals</TT > 对你意味着什么。 </P ><DIV CLASS="qandaset" ><DL ><DT >1. <A HREF="faq.html.html#faq.html.encoding" > 当我通过表单/URL 传值时需要用什么编码/解码方法? </A ></DT ><DT >2. <A HREF="faq.html.html#faq.html.form-image" > 我在试用 <input type="image"> 标记,但是没有 <CODE CLASS="varname" >$foo.x</CODE > 和 <CODE CLASS="varname" >$foo.y</CODE > 变量,它们哪去了? </A ></DT ><DT >3. <A HREF="faq.html.html#faq.html.arrays" >怎样在 HTML 的 <form> 中建立数组?</A ></DT ><DT >4. <A HREF="faq.html.html#faq.html.select-multiple" > 怎样从可多选的 HTML 的 select multiple 标记中得到所有结果? </A ></DT ><DT >5. <A HREF="faq.html.html#faq.html.javascript-variable" > 怎样从 Javascript 传递一个变量到 PHP? </A ></DT ></DL ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.html.encoding" ></A ><B >1. </B > 当我通过表单/URL 传值时需要用什么编码/解码方法? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 在几个环节上编码方式很重要。假定有 <A HREF="language.types.string.html" ><B CLASS="type" >string</B ></A > <CODE CLASS="varname" >$data</CODE >,其中包含了想通过非编码方式传递的字符串,那这是相关步骤: <P ></P ><UL ><LI ><P > HTML 解析。要指定一个任意的字符串,<SPAN CLASS="emphasis" ><I CLASS="emphasis" >必须</I ></SPAN >将其放在双引号中,并用 <A HREF="function.htmlspecialchars.html" ><B CLASS="function" >htmlspecialchars()</B ></A > 处理整个值。 </P ></LI ><LI ><P > URL:URL 由几部分组成。如果希望自己的数据被当作其中一项来解释,<SPAN CLASS="emphasis" ><I CLASS="emphasis" >必须</I ></SPAN >用 <A HREF="function.urlencode.html" ><B CLASS="function" >urlencode()</B ></A > 对其编码。 </P ></LI ></UL > </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN288857" ></A ><P ><B >例 56-1. 隐藏的 HTML 表单单元</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /> </font><font color="#007700">echo </font><font color="#DD0000">"<input type='hidden' value='" </font><font color="#007700">. </font><font color="#0000BB">htmlspecialchars</font><font color="#007700">(</font><font color="#0000BB">$data</font><font color="#007700">) . </font><font color="#DD0000">"' />\n"</font><font color="#007700">;<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > <DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 用 <A HREF="function.urlencode.html" ><B CLASS="function" >urlencode()</B ></A > 来处理 <CODE CLASS="varname" >$data</CODE > 是错误的,因为是浏览器的责任来 <A HREF="function.urlencode.html" ><B CLASS="function" >urlencode()</B ></A > 数据。所有流行的浏览器都能正确处理。注意不论何种方法(例如 GET 或 POST)都会这样。不过只会在用 GET 请求时注意到这一点,因为 POST 请求通常是隐藏的。 </P ></BLOCKQUOTE ></DIV > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN288865" ></A ><P ><B >例 56-2. 等待用户编辑的数据</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /> </font><font color="#007700">echo </font><font color="#DD0000">"<textarea name='mydata'>\n"</font><font color="#007700">;<br /> echo </font><font color="#0000BB">htmlspecialchars</font><font color="#007700">(</font><font color="#0000BB">$data</font><font color="#007700">).</font><font color="#DD0000">"\n"</font><font color="#007700">;<br /> echo </font><font color="#DD0000">"</textarea>"</font><font color="#007700">;<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > <DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 数据会按照预期的显示在浏览器中,因为浏览器会解释 HTML 转义符号。 </P ><P > 当提交时,不论是 GET 或者 POST 方法,数据都会被浏览器进行 urlencode 来传输,并直接被 PHP urldecode。所以最终不需要自己处理任何 urlencoding/urldecoding,全都是自动处理的。 </P ></BLOCKQUOTE ></DIV > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN288871" ></A ><P ><B >例 56-3. URL 中的例子</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /> </font><font color="#007700">echo </font><font color="#DD0000">"<a href='" </font><font color="#007700">. </font><font color="#0000BB">htmlspecialchars</font><font color="#007700">(</font><font color="#DD0000">"/nextpage.php?stage=23&data=" </font><font color="#007700">.<br /> </font><font color="#0000BB">urlencode</font><font color="#007700">(</font><font color="#0000BB">$data</font><font color="#007700">)) . </font><font color="#DD0000">"'>\n"</font><font color="#007700">;<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > <DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 事实上这在编造一个 HTML 的 GET 请求,因此需要手工对数据进行 <A HREF="function.urlencode.html" ><B CLASS="function" >urlencode()</B ></A >。 </P ></BLOCKQUOTE ></DIV > <DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 需要对整个 URL 进行 <A HREF="function.htmlspecialchars.html" ><B CLASS="function" >htmlspecialchars()</B ></A >,因为 URL 是作为 HTML 属性的一个值出现的。在本例中,浏览器会首先对值进行 un-<A HREF="function.htmlspecialchars.html" ><B CLASS="function" >htmlspecialchars()</B ></A >,然后再传递此 URL。PHP 将能正确理解 URL,因为对数据进行了 <B CLASS="function" >urlencoded()</B >。 </P ><P > 要注意到 URL 中的 <TT CLASS="literal" >&</TT > 被替换成了 <TT CLASS="literal" >&amp;</TT >。如果忘了这一步,尽管大多数浏览器都能恢复,但也不总是这样。因此即使 URL 不是动态的,也<SPAN CLASS="emphasis" ><I CLASS="emphasis" >需要</I ></SPAN >对 URL 进行 <A HREF="function.htmlspecialchars.html" ><B CLASS="function" >htmlspecialchars()</B ></A >。 </P ></BLOCKQUOTE ></DIV > </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.html.form-image" ></A ><B >2. </B > 我在试用 <input type="image"> 标记,但是没有 <CODE CLASS="varname" >$foo.x</CODE > 和 <CODE CLASS="varname" >$foo.y</CODE > 变量,它们哪去了? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 当提交表单时,可以用图片代替标准的提交按钮,用类似这样的标记: <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="html" ><input type="image" src="image.gif" name="foo" /></PRE ></TD ></TR ></TABLE > 当用户点击了图片的任何部分,该表单会被发送到服务器并加上两个额外的变量:<CODE CLASS="varname" >foo.x</CODE > 和 <CODE CLASS="varname" >foo.y</CODE >。 </P ><P > 因为 <CODE CLASS="varname" >foo.x</CODE > 和 <CODE CLASS="varname" >foo.y</CODE > 在 PHP 中会成为非法的变量名,它们被自动转换成了 <CODE CLASS="varname" >foo_x</CODE > 和 <CODE CLASS="varname" >foo_y</CODE >。也就是用下划线代替了点。因此,可以按照在<A HREF="language.variables.external.html" >来自 PHP 之外的变量</A >这一节中说明的那样访问这些变量。例如,<CODE CLASS="varname" >$_GET['foo_x']</CODE >。 <DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 请求变量名中的空格被转换为下划线。 </P ></BLOCKQUOTE ></DIV > </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.html.arrays" ></A ><B >3. </B >怎样在 HTML 的 <form> 中建立数组?</P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 要使你的 <form> 结果被当成 <A HREF="language.types.array.html" >array</A > 发送到 PHP 脚本,要对 <input>,<select> 或者 <textarea> 单元这样命名: <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="html" ><input name="MyArray[]" /> <input name="MyArray[]" /> <input name="MyArray[]" /> <input name="MyArray[]" /></PRE ></TD ></TR ></TABLE > 注意变量名后的方括号,这使其成为一个数组。可以通过给不同的单元分配相同的名字来把单元分组到不同的数组里: <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="html" ><input name="MyArray[]" /> <input name="MyArray[]" /> <input name="MyOtherArray[]" /> <input name="MyOtherArray[]" /></PRE ></TD ></TR ></TABLE > 这将产生两个数组,MyArray 和 MyOtherArray,并发送给 PHP 脚本。还可以给数组分配指定的键名: <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="html" ><input name="AnotherArray[]" /> <input name="AnotherArray[]" /> <input name="AnotherArray[email]" /> <input name="AnotherArray[phone]" /></PRE ></TD ></TR ></TABLE > AnotherArray 数组将包含键名 0,1,email 和 phone。 </P ><P > <DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 指定数组的键名是 HTML 的可选项。如果不指定键名,则数组被按照单元在表单中出现的顺序填充。第一个例子将包含键名 0,1,2 和 3。 </P ></BLOCKQUOTE ></DIV > </P ><P > 参见<A HREF="ref.array.html" >数组函数</A >和<A HREF="language.variables.external.html" >来自 PHP 之外的变量</A >。 </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.html.select-multiple" ></A ><B >4. </B > 怎样从可多选的 HTML 的 select multiple 标记中得到所有结果? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 可多选的 select multiple 标记是 HTML 的一个构造,允许用户从一个列表中选择多个项目。这些项目接着被传递给该表单 action 中指定的处理程序。问题是它们都会被用同样的名字传递。例如: <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="html" ><select name="var" multiple="yes"></PRE ></TD ></TR ></TABLE > 每个被选项将这样被传递到表单处理程序: <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="programlisting" >var=option1 var=option2 var=option3</PRE ></TD ></TR ></TABLE > 每个选项将覆盖前面一个 <CODE CLASS="varname" >$var</CODE > 变量的内容。解决方案是用 PHP 的“表单单元数组”特性。使用方法如下: <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="html" ><select name="var[]" multiple="yes"></PRE ></TD ></TR ></TABLE > 这将告诉 PHP 将 <CODE CLASS="varname" >$var</CODE > 当成数组对待,每个对 var[] 的赋值都会给数组增加一项。第一项将成为 <CODE CLASS="varname" >$var[0]</CODE >,下一个是 <CODE CLASS="varname" >$var[1]</CODE >,等等。可以用 <A HREF="function.count.html" ><B CLASS="function" >count()</B ></A > 函数来测定选择了多少个项目,必要时可以用 <A HREF="function.sort.html" ><B CLASS="function" >sort()</B ></A > 函数来对选项的数组进行排序。 </P ><P > 注意如果在 JavaScript 中通过名字来引用单元,单元名字中的 <TT CLASS="literal" >[]</TT > 可能会造成问题。用表单单元中的数字序号来替代,或者将变量名用单引号括起来并用其作为单元数组的索引,例如: <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="programlisting" >variable = documents.forms[0].elements['var[]'];</PRE ></TD ></TR ></TABLE > </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.html.javascript-variable" ></A ><B >5. </B > 怎样从 Javascript 传递一个变量到 PHP? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 由于 Javascript (通常情况下)是客户端技术,而 PHP (通常情况下)是服务器端技术,而且 HTTP 是一种“无状态”协议,因此两种语言之间不能直接共享变量。 </P ><P > 但是,有可能在二者之间传递变量。一种实现的方法是用 PHP 生成 Javascript 代码,并让浏览器自动刷新,将特定的变量传递回 PHP 脚本。以下例子显示了如何这样做――让 PHP 代码取得显示屏幕的高度和宽度,通常只能在客户端这么做。 </P ><P > <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">if (isset(</font><font color="#0000BB">$_GET</font><font color="#007700">[</font><font color="#DD0000">'width'</font><font color="#007700">]) AND isset(</font><font color="#0000BB">$_GET</font><font color="#007700">[</font><font color="#DD0000">'height'</font><font color="#007700">])) {<br /> </font><font color="#FF8000">// output the geometry variables<br /> </font><font color="#007700">echo </font><font color="#DD0000">"Screen width is: "</font><font color="#007700">. </font><font color="#0000BB">$_GET</font><font color="#007700">[</font><font color="#DD0000">'width'</font><font color="#007700">] .</font><font color="#DD0000">"<br />\n"</font><font color="#007700">;<br /> echo </font><font color="#DD0000">"Screen height is: "</font><font color="#007700">. </font><font color="#0000BB">$_GET</font><font color="#007700">[</font><font color="#DD0000">'height'</font><font color="#007700">] .</font><font color="#DD0000">"<br />\n"</font><font color="#007700">;<br />} else {<br /> </font><font color="#FF8000">// pass the geometry variables<br /> // (preserve the original query string<br /> // -- post variables will need to handled differently)<br /><br /> </font><font color="#007700">echo </font><font color="#DD0000">"<script language='javascript'>\n"</font><font color="#007700">;<br /> echo </font><font color="#DD0000">" location.href=</font><font color="#007700">\"${</font><font color="#DD0000">_SERVER</font><font color="#007700">[</font><font color="#DD0000">'SCRIPT_NAME'</font><font color="#007700">]}</font><font color="#DD0000">?</font><font color="#007700">${</font><font color="#DD0000">_SERVER</font><font color="#007700">[</font><font color="#DD0000">'QUERY_STRING'</font><font color="#007700">]}</font><font color="#DD0000">"<br /> </font><font color="#007700">. </font><font color="#DD0000">"&width=\" + screen.width + \"&height=\" + screen.height;\n"</font><font color="#007700">;<br /> echo </font><font color="#DD0000">"</script>\n"</font><font color="#007700">;<br /> exit();<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE > </P ></DIV ></DIV ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="faq.using.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >起始页</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="faq.com.html" ACCESSKEY="N" >下一页</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >使用 PHP</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="faq.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >PHP 和 COM</TD ></TR ></TABLE ></DIV ></BODY ></HTML >