<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >使用 PHP</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="编译问题" HREF="faq.build.html"><LINK REL="NEXT" TITLE="PHP 和 HTML" HREF="faq.html.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.build.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="faq.html.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="chapter" ><H1 ><A NAME="faq.using" >章 55. 使用 PHP</A ></H1 ><P > 本节汇集了你在写 PHP 脚本时可能碰到的大多数普通错误。 </P ><DIV CLASS="qandaset" ><DL ><DT >1. <A HREF="faq.using.html#faq.using.anyform" > 我想写一个可以处理任何表单来的数据的通用 PHP 脚本。我怎么知道哪个 POST 方法变量可用呢? </A ></DT ><DT >2. <A HREF="faq.using.html#faq.using.addslashes" > 我需要在所有的单引号(')前加一个反斜线(\),使它们变成(\'),我如何能够通过正则表达式来实现?我同样希望能够将(")转换成(\"),将(\)转换成(\\)。 </A ></DT ><DT >3. <A HREF="faq.using.html#faq.using.stripslashes" > 我所有的(")和(')都被变成了(\")和(\'),我如何才能去掉这些不必要的反斜线?它们为什么及如何出现? </A ></DT ><DT >4. <A HREF="faq.using.html#faq.using.wrong-order" > 当我这样做时,输出显示的次序是错的: <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">function </font><font color="#0000BB">myfunc</font><font color="#007700">(</font><font color="#0000BB">$argument</font><font color="#007700">)<br />{<br /> echo </font><font color="#0000BB">$argument </font><font color="#007700">+ </font><font color="#0000BB">10</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">$variable </font><font color="#007700">= </font><font color="#0000BB">10</font><font color="#007700">;<br />echo </font><font color="#DD0000">"myfunc($variable) = " </font><font color="#007700">. </font><font color="#0000BB">myfunc</font><font color="#007700">(</font><font color="#0000BB">$variable</font><font color="#007700">);<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE > 这是怎么回事? </A ></DT ><DT >5. <A HREF="faq.using.html#faq.using.newlines" > 下面代码怎么没有分成两行显示? <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <pre><br /><font color="#0000BB"><?php </font><font color="#007700">echo </font><font color="#DD0000">"This should be the first line."</font><font color="#007700">; </font><font color="#0000BB">?><br /><?php </font><font color="#007700">echo </font><font color="#DD0000">"This should show up after the new line above."</font><font color="#007700">; </font><font color="#0000BB">?><br /></font></pre></font> </code></TD ></TR ></TABLE > </A ></DT ><DT >6. <A HREF="faq.using.html#faq.using.headers-sent" > 我得到消息“Warning: Cannot send session cookie - headers already sent...”或者“Cannot add header information - headers already sent...”。 </A ></DT ><DT >7. <A HREF="faq.using.html#faq.using.header" > 我需要直接访问请求报头中的信息,怎么能办到? </A ></DT ><DT >8. <A HREF="faq.using.html#faq.using.authentication" > 当我用 IIS 进行 HTTP 认证时得到“No Input file specified”消息。 </A ></DT ><DT >9. <A HREF="faq.using.html#faq.using.iis.sharing" > Windows:不能访问另一台电脑上用 IIS 共享的文件。 </A ></DT ><DT >10. <A HREF="faq.using.html#faq.using.netscape" > 我的 PHP 脚本在 IE 和 Lynx 下能工作,但是在 Netscape 中有的输出丢失了。当我用“查看源文件”时可以在 IE 中看到内容,但是 Netscape 中不能。 </A ></DT ><DT >11. <A HREF="faq.using.html#faq.using.mixml" > 我怎样混合使用 XML 和 PHP?它不认我的 <?xml 标记! </A ></DT ><DT >12. <A HREF="faq.using.html#faq.using.editor" > 怎样用 FrontPage 或者其它非要把我的代码移来移去的 HTML 编辑器来编辑 PHP? </A ></DT ><DT >13. <A HREF="faq.using.html#faq.using.variables" > 哪里可以找到所有可用的 PHP 预定义变量的完整列表? </A ></DT ><DT >14. <A HREF="faq.using.html#faq.using.freepdf" > 怎样才能不用非免费的商业库 <A HREF="ref.cpdf.html" >ClibPDF</A > 和 <A HREF="ref.pdf.html" >PDFLib</A > 来生成 PDF 文档?我想要个免费的并且不需要再连接别的 PDF 库。 </A ></DT ><DT >15. <A HREF="faq.using.html#faq.using.cgi-vars" > 我试着在用户自定义函数中访问一个标准的 CGI 变量(例如 $DOCUMENT_ROOT 或 $HTTP_REFERER),但是找不到,哪里出了错? </A ></DT ><DT >16. <A HREF="faq.using.html#faq.using.shorthandbytes" > 有些 PHP 选项可以接受缩写的字节值,与仅能接受 <A HREF="language.types.integer.html" ><B CLASS="type" >integer</B ></A > 字节值相反。都有哪些缩写字节值?可以将其用于 <TT CLASS="filename" >php.ini</TT > 之外吗? </A ></DT ></DL ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.anyform" ></A ><B >1. </B > 我想写一个可以处理任何表单来的数据的通用 PHP 脚本。我怎么知道哪个 POST 方法变量可用呢? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > PHP 提供很多“<A HREF="language.variables.predefined.html" >预定义变量</A >”,例如超全局变量 <CODE CLASS="varname" >$_POST</CODE >。可以遍历 <CODE CLASS="varname" >$_POST</CODE > 变量,因为它是一个和所有通过 POST 方法传递数据相联系的数组。例如,可以用 <A HREF="control-structures.foreach.html" >foreach</A > 简单地遍历它,检查 <A HREF="function.empty.html" ><B CLASS="function" >empty()</B ></A > 值,以及将它们输出。 <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$empty </font><font color="#007700">= </font><font color="#0000BB">$post </font><font color="#007700">= array();<br />foreach (</font><font color="#0000BB">$_POST </font><font color="#007700">as </font><font color="#0000BB">$varname </font><font color="#007700">=> </font><font color="#0000BB">$varvalue</font><font color="#007700">) {<br /> if (empty(</font><font color="#0000BB">$varvalue</font><font color="#007700">)) {<br /> </font><font color="#0000BB">$empty</font><font color="#007700">[</font><font color="#0000BB">$varname</font><font color="#007700">] = </font><font color="#0000BB">$varvalue</font><font color="#007700">;<br /> } else {<br /> </font><font color="#0000BB">$post</font><font color="#007700">[</font><font color="#0000BB">$varname</font><font color="#007700">] = </font><font color="#0000BB">$varvalue</font><font color="#007700">;<br /> }<br />}<br /><br />print </font><font color="#DD0000">"<pre>"</font><font color="#007700">;<br />if (empty(</font><font color="#0000BB">$empty</font><font color="#007700">)) {<br /> print </font><font color="#DD0000">"None of the POSTed values are empty, posted:\n"</font><font color="#007700">;<br /> </font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$post</font><font color="#007700">);<br />} else {<br /> print </font><font color="#DD0000">"We have " </font><font color="#007700">. </font><font color="#0000BB">count</font><font color="#007700">(</font><font color="#0000BB">$empty</font><font color="#007700">) . </font><font color="#DD0000">" empty values\n"</font><font color="#007700">;<br /> print </font><font color="#DD0000">"Posted:\n"</font><font color="#007700">; </font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$post</font><font color="#007700">);<br /> print </font><font color="#DD0000">"Empty:\n"</font><font color="#007700">; </font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$empty</font><font color="#007700">);<br /> exit;<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE > </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Superglobals 可用性说明: </B >自 PHP 4.1.0 起,可以使用超全局数组变量例如 <CODE CLASS="varname" >$_GET</CODE >,<CODE CLASS="varname" >$_POST</CODE > 和 <CODE CLASS="varname" >$_SERVER</CODE > 等等。更多信息请阅读手册中的 <A HREF="language.variables.predefined.html" >superglobals</A >。</P ></BLOCKQUOTE ></DIV ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.addslashes" ></A ><B >2. </B > 我需要在所有的单引号(')前加一个反斜线(\),使它们变成(\'),我如何能够通过正则表达式来实现?我同样希望能够将(")转换成(\"),将(\)转换成(\\)。 </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 函数 <A HREF="function.addslashes.html" ><B CLASS="function" >addslashes()</B ></A > 能够实现这种操作。请参阅函数 <A HREF="function.mysql-escape-string.html" ><B CLASS="function" >mysql_escape_string()</B ></A >。另外,还可以用函数 <A HREF="function.stripslashes.html" ><B CLASS="function" >stripslashes()</B ></A > 来去掉反斜线。 </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >magic_quotes_gpc 设置选项说明: </B >PHP 的设置选项 <A HREF="ref.info.html#ini.magic-quotes-gpc" >magic_quotes_gpc</A > 的默认值为 <TT CLASS="literal" >on</TT >。这相当于自动对所有的 GET、POST、COOKIE 数据使用了 <A HREF="function.addslashes.html" ><B CLASS="function" >addslashes()</B ></A > 函数。可以用 <A HREF="function.stripslashes.html" ><B CLASS="function" >stripslashes()</B ></A > 函数来去掉它们。</P ></BLOCKQUOTE ></DIV ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.stripslashes" ></A ><B >3. </B > 我所有的(")和(')都被变成了(\")和(\'),我如何才能去掉这些不必要的反斜线?它们为什么及如何出现? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > PHP 函数 <A HREF="function.stripslashes.html" ><B CLASS="function" >stripslashes()</B ></A > 能够从 <A HREF="language.types.string.html" ><B CLASS="type" >string</B ></A > 中去掉所有的反斜线。这些反斜线出现最有可能的原因是 PHP 设置项 <A HREF="ref.info.html#ini.magic-quotes-gpc" >magic_quotes_gpc</A > 被开启。 </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >magic_quotes_gpc 设置选项说明: </B >PHP 的设置选项 <A HREF="ref.info.html#ini.magic-quotes-gpc" >magic_quotes_gpc</A > 的默认值为 <TT CLASS="literal" >on</TT >。这相当于自动对所有的 GET、POST、COOKIE 数据使用了 <A HREF="function.addslashes.html" ><B CLASS="function" >addslashes()</B ></A > 函数。可以用 <A HREF="function.stripslashes.html" ><B CLASS="function" >stripslashes()</B ></A > 函数来去掉它们。</P ></BLOCKQUOTE ></DIV ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.wrong-order" ></A ><B >4. </B > 当我这样做时,输出显示的次序是错的: <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">function </font><font color="#0000BB">myfunc</font><font color="#007700">(</font><font color="#0000BB">$argument</font><font color="#007700">)<br />{<br /> echo </font><font color="#0000BB">$argument </font><font color="#007700">+ </font><font color="#0000BB">10</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">$variable </font><font color="#007700">= </font><font color="#0000BB">10</font><font color="#007700">;<br />echo </font><font color="#DD0000">"myfunc($variable) = " </font><font color="#007700">. </font><font color="#0000BB">myfunc</font><font color="#007700">(</font><font color="#0000BB">$variable</font><font color="#007700">);<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE > 这是怎么回事? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 要在一个表达式中(例如在上面的例子中和其它字符串连接)使用函数的结果,需要 <A HREF="function.return.html" ><B CLASS="function" >return()</B ></A > 这个值,而不是 <A HREF="function.echo.html" ><B CLASS="function" >echo()</B ></A > 它。 </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.newlines" ></A ><B >5. </B > 下面代码怎么没有分成两行显示? <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <pre><br /><font color="#0000BB"><?php </font><font color="#007700">echo </font><font color="#DD0000">"This should be the first line."</font><font color="#007700">; </font><font color="#0000BB">?><br /><?php </font><font color="#007700">echo </font><font color="#DD0000">"This should show up after the new line above."</font><font color="#007700">; </font><font color="#0000BB">?><br /></font></pre></font> </code></TD ></TR ></TABLE > </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 在 PHP 中,一段代码的结束标记要么是“?>”要么是“?>\n”(\n 表示换行)。因此在上面的例子中,输出的句子将显示在同一行中,因为 PHP 忽略了代码结束标记后面的换行。这意味着如果要输出一个换行符,需要在每段 PHP 代码的结束标记后面多加一个换行。 </P ><P > PHP 为什么这么做呢?因为在格式化正常的 HTML 时,这样通常会更容易。假如输出了换行而你不需要这个换行时,就不得不用一个非常长的行来达到这样的效果,或者让产生的 HTML 页面的源文件的格式很难读。 </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.headers-sent" ></A ><B >6. </B > 我得到消息“Warning: Cannot send session cookie - headers already sent...”或者“Cannot add header information - headers already sent...”。 </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 函数 <A HREF="function.header.html" ><B CLASS="function" >header()</B ></A >,<A HREF="function.setcookie.html" ><B CLASS="function" >setcookie()</B ></A > 和 <A HREF="ref.session.html" >session 函数</A >需要在输出流中添加头信息。但是头信息只能在其它任何输出内容之前发送。在使用这些函数前不能有任何(如 HTML)的输出。函数 <A HREF="function.headers-sent.html" ><B CLASS="function" >headers_sent()</B ></A > 能够检查脚本是否已经发送了头信息。请参阅<A HREF="ref.outcontrol.html" >输出控制函数</A >。 </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.header" ></A ><B >7. </B > 我需要直接访问请求报头中的信息,怎么能办到? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 如果以 Apache 的模块方式运行 PHP,那么函数 <A HREF="function.getallheaders.html" ><B CLASS="function" >getallheaders()</B ></A > 可以做这件事。因此下面的代码可以显示所有的请求报头: <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$headers </font><font color="#007700">= </font><font color="#0000BB">getallheaders</font><font color="#007700">();<br />foreach (</font><font color="#0000BB">$headers </font><font color="#007700">as </font><font color="#0000BB">$name </font><font color="#007700">=> </font><font color="#0000BB">$content</font><font color="#007700">) {<br /> echo </font><font color="#DD0000">"headers</font><font color="#007700">[</font><font color="#DD0000">$name</font><font color="#007700">]</font><font color="#DD0000"> = $content<br /></font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE > </P ><P > 请参阅函数 <A HREF="function.apache-lookup-uri.html" ><B CLASS="function" >apache_lookup_uri()</B ></A >、<A HREF="function.apache-response-headers.html" ><B CLASS="function" >apache_response_headers()</B ></A > 和 <A HREF="function.fsockopen.html" ><B CLASS="function" >fsockopen()</B ></A >。 </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.authentication" ></A ><B >8. </B > 当我用 IIS 进行 HTTP 认证时得到“No Input file specified”消息。 </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > IIS 的安全模型这里有毛病。这是所有 IIS 下运行的 CGI 程序所共有的问题。一个解决办法是建立一个纯 HTML 文件(不经过 PHP 解析)作为要进入认证目录的登录页面,然后用 META 标记来重定向到 PHP 页面,或者用一个连接到 PHP 页面。然后 PHP 就可以正确识别认证信息了。如果是用 ISAPI 模块,那没有这个问题。其它 NT 下的 web 服务器不受此影响。更多信息见 <A HREF="http://support.microsoft.com/kb/q160422/" TARGET="_top" >http://support.microsoft.com/kb/q160422/</A >及 <A HREF="features.http-auth.html" >HTTP 认证</A >一章。 </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.iis.sharing" ></A ><B >9. </B > Windows:不能访问另一台电脑上用 IIS 共享的文件。 </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 必须要做些修改。打开 <TT CLASS="literal" >Internet 信息服务</TT >,找到你的 PHP 文件并打开属性页,选择<TT CLASS="literal" >文件安全性</TT >标签,点击<TT CLASS="literal" >匿名访问和身份验证控制</TT >的“编辑”按钮。 </P ><P > 解决此问题有两个方法,一是不要选中<TT CLASS="literal" >匿名访问</TT >并且选中<TT CLASS="literal" >集成 Windows 身份验证</TT >,二是选中<TT CLASS="literal" >匿名访问</TT >并编辑匿名访问使用的帐户,改成一个有权限的。 </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.netscape" ></A ><B >10. </B > 我的 PHP 脚本在 IE 和 Lynx 下能工作,但是在 Netscape 中有的输出丢失了。当我用“查看源文件”时可以在 IE 中看到内容,但是 Netscape 中不能。 </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > Netscape 在关于 HTML 标记(例如 table)上比 IE 更严格。用一个 HTML 验证器,例如 <A HREF="http://validator.w3.org/" TARGET="_top" >validator.w3.org</A > 来验证你的 HTML 输出可能会有帮助。例如漏了 </table> 可能会导致这样的结果。 </P ><P > 同样,IE 和 Lynx 都忽略了 HTML 流中的任何 NULs(<TT CLASS="literal" >\0</TT >),Netscape 就不。最好的检查方法是编译 <A HREF="features.commandline.html" >PHP 的命令行模式</A >版本(也称为 CGI 版本)并从命令行运行你的脚本。在 *nix 中,用管道传递到 <TT CLASS="literal" >od -c</TT > 并查看任何 <TT CLASS="literal" >\0</TT > 字符。如果在 Windows 下你需要能够查看二进制文件格式的编辑器或程序。当 Netscape 碰到 NUL 时就不会输出之后该行的任何内容而 IE 和 Lynx 都会。 </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.mixml" ></A ><B >11. </B > 我怎样混合使用 XML 和 PHP?它不认我的 <?xml 标记! </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 要能够在 PHP 代码中直接嵌入 <?xml,需要将 PHP 设置项 <A HREF="ini.core.html#ini.short-open-tag" >short_open_tags</A > 设置为 <TT CLASS="literal" >0</TT > 以关闭短标记格式。无法通过函数 <A HREF="function.ini-set.html" ><B CLASS="function" >ini_set()</B ></A > 来更改这项设置。不管 <A HREF="ini.core.html#ini.short-open-tag" >short_open_tags</A > 是开或者关,都可以用类似于 <TT CLASS="literal" ><?php echo '<?xml'; ?></TT > 的方法达到目的。该项设置的默认值为开。 </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.editor" ></A ><B >12. </B > 怎样用 FrontPage 或者其它非要把我的代码移来移去的 HTML 编辑器来编辑 PHP? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 最简单的方法是让 PHP 代码也能使用 ASP 标记。这可以让你用 ASP 风格的 <% 和 %> 代码定界符。一些流行的 HTML 编辑器在处理此格式上更加智能化一些(目前如此)。要使用 ASP 风格的标记,需要在 <TT CLASS="filename" >php.ini</TT > 中打开 <A HREF="ini.core.html#ini.asp-tags" >asp_tags</A >,或者用相应的 Apache 配置选项。 </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.variables" ></A ><B >13. </B > 哪里可以找到所有可用的 PHP 预定义变量的完整列表? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 请阅读手册中的<A HREF="language.variables.predefined.html" >预定义变量</A >一章,该部分的文档已经包含了一部分可以用于你的脚本的预定义变量的列表。可用变量的完整列表(及更多信息)可以通过调用 <A HREF="function.phpinfo.html" ><B CLASS="function" >phpinfo()</B ></A > 函数来查阅。请务必阅读手册中<A HREF="language.variables.external.html" >来自 PHP 之外的变量</A >一节,这部分文档阐述了外部变量的概念,例如来自 HTML 表单、Cookie 和 URL 的变量。 </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >register_globals 重要说明: </B >自 PHP 4.2.0 起,PHP 中的选项 <A HREF="ini.core.html#ini.register-globals" >register_globals</A > 的默认值被设为 <SPAN CLASS="emphasis" ><I CLASS="emphasis" >off</I ></SPAN >,并且自 PHP 6.0.0 起会被彻底去除。PHP 社区鼓励大家不要依赖于这个选项,用其它方法替代,例如<A HREF="language.variables.predefined.html" >superglobals</A >。</P ></BLOCKQUOTE ></DIV ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.freepdf" ></A ><B >14. </B > 怎样才能不用非免费的商业库 <A HREF="ref.cpdf.html" >ClibPDF</A > 和 <A HREF="ref.pdf.html" >PDFLib</A > 来生成 PDF 文档?我想要个免费的并且不需要再连接别的 PDF 库。 </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 有几个选择,例如 <A HREF="http://www.ros.co.nz/pdf/" TARGET="_top" >http://www.ros.co.nz/pdf/</A >,<A HREF="http://www.fpdf.org/" TARGET="_top" >http://www.fpdf.org/</A >,<A HREF="http://www.gnuvox.com/pdf4php/" TARGET="_top" >http://www.gnuvox.com/pdf4php/</A > 和 <A HREF="http://www.potentialtech.com/ppl.php" TARGET="_top" >http://www.potentialtech.com/ppl.php</A >。还有一个 <A HREF="http://www.stillhq.com/cgi-bin/getpage?area=panda" TARGET="_top" >Panda</A > 模块。 </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.cgi-vars" ></A ><B >15. </B > 我试着在用户自定义函数中访问一个标准的 CGI 变量(例如 $DOCUMENT_ROOT 或 $HTTP_REFERER),但是找不到,哪里出了错? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 首先非常重要的一点是 PHP 设置项 <A HREF="ini.core.html#ini.register-globals" >register_globals</A > 同样会对服务器端和环境变量产生影响。当 register_globals = off (从 PHP 4.2.0 开始其默认值为 off),变量 <CODE CLASS="varname" >$DOCUMENT_ROOT</CODE > 将不会存在,而只有 <CODE CLASS="varname" >$_SERVER['DOCUMENT_ROOT']</CODE >。如果 register_globals = on 则变量 <CODE CLASS="varname" >$DOCUMENT_ROOT</CODE > 和 <CODE CLASS="varname" >$GLOBALS['DOCUMENT_ROOT']</CODE > 将同时存在。 </P ><P > 如果确认 register_globals = on 但不知道为什么 <CODE CLASS="varname" >$DOCUMENT_ROOT</CODE > 在函数内部不可用,这是因为它和其它的变量一样需要在函数中执行 <TT CLASS="literal" >global $DOCUMENT_ROOT</TT >。请参阅手册中的<A HREF="language.variables.scope.html" >变量范围</A >一节。建议在 register_globals = off 的情况下进行编码。 </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Superglobals 可用性说明: </B >自 PHP 4.1.0 起,可以使用超全局数组变量例如 <CODE CLASS="varname" >$_GET</CODE >,<CODE CLASS="varname" >$_POST</CODE > 和 <CODE CLASS="varname" >$_SERVER</CODE > 等等。更多信息请阅读手册中的 <A HREF="language.variables.predefined.html" >superglobals</A >。</P ></BLOCKQUOTE ></DIV ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.using.shorthandbytes" ></A ><B >16. </B > 有些 PHP 选项可以接受缩写的字节值,与仅能接受 <A HREF="language.types.integer.html" ><B CLASS="type" >integer</B ></A > 字节值相反。都有哪些缩写字节值?可以将其用于 <TT CLASS="filename" >php.ini</TT > 之外吗? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 可用的选择有 K(对应 Kilobytes),M(对应 Megabytes)和 G(对应 Gigabytes;自 PHP 5.1.0 起可用),区分大小写。其余的都认为是字节。<TT CLASS="literal" >1M</TT > 等于一个 Megabyte,即 <TT CLASS="literal" >1048576</TT > 字节。<TT CLASS="literal" >1K</TT > 等于一个 Kilobyte,即 <TT CLASS="literal" >1024</TT > 字节。不能在 <TT CLASS="filename" >php.ini</TT > 之外使用这些符号,最好用整数的 <A HREF="language.types.integer.html" ><B CLASS="type" >integer</B ></A > 字节值。参见 <A HREF="function.ini-get.html" ><B CLASS="function" >ini_get()</B ></A > 文档中的转换示例。 </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.build.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.html.html" ACCESSKEY="N" >下一页</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >编译问题</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="faq.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >PHP 和 HTML</TD ></TR ></TABLE ></DIV ></BODY ></HTML >