PHP最常见问题咨询中文手册(下)
时间:2007-02-17 来源:PHP爱好者
PHP最常见问题咨询中文手册(下)
作者 : Jim Winstead | 译者:jetzhou | 日期 : 2000-08-18
6. 编译的问题
6.1 我利用匿名(anonymous)CVS服务取得最新的PHP版本,却没有configure配置文件?
6.2 我在Apache上配置PHP时出问题,它提示无法找到httpd.h文件,该文件在哪里?
6.3 当我在运行configure时,它提示找不到包含文件(include files)或者GD、gdbm的Lib库等套件?
6.4 在编译文件language-parser.tab.c时,它提示'yytname undeclared'的错误信息?
6.5 当我在运行'make'时,看起来一切正常,但在最后连接时,程序说找不到某些文件?
6.6 当在连接PHP时,程序抱怨一些数值没有定义参考?
6.7 我不知道如何将PHP安装到Apache 1.3上?
6.8 我按照安装步骤在UNIX上安装PHP到Apache的模块中,但我的浏览器却显示出PHP脚本的源码,并询问我是否保存?
6.9 明明写着 --activate-module=src/modules/php3/libphp3.a,但该文件却不存在,我就改成--activate-module=src/modules/php3/libmodphp3.a,但却不能运行,为什么?
6.10 当我试着去编译PHP成为Apache的静态模块,使用--activate-module=src/modules/php3/libphp3.a,它却告诉我,编译器不符合国际标准ANSI?
6.11 当我试着用--with-apxs来编译PHP时,我得到了奇怪的错误信息?
7. 使用PHP
7.1 我想写一个通用的PHP脚本来处理任何传进来的表单Form的数据。我要如何知道POST方法的变量可用呢?
7.2 我想将所有的单引号加上一个反斜线。我应该用什么常规方法来做?
7.3 当我运行下面的脚本,它会输出错误信息,我该怎么做?
7.4 嘿,我要新增一行,怎么办?
7.5 我要直接读取请求的信息头,我要怎么做?
7.6 当我尝试使用IIS的使用者认证功能时,它提示我"No Input file specified"?
7.7 我按照介绍安装步骤来做,但还是不能让我的PHP和IIS配合使用?
7.8 我的PHP脚本只能在IE和Lynx中运行,但在Netscape运行会丢失结果;并且当我用"查看源文件"功能时,只在IE中有内容,Netscape却不行?
7.9 我如何混合使用XML和PHP?它抱怨<?xml>标记
7.10 我怎么做才能让FrontPage、Dreamweaver或其它的HTML编辑器可以编辑我的PHP脚本?
7.11 我想找出所有的预定义的数值,但为何所有文件都没有提到?
7.12 为什么我总是得到这样子的错误:"Warning: 0 is not a MySQL result index in <file> on line <x>"或者"Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>?"
7.13 当我试着使用<input type="image">标记时,但$foo.x和$foo.y变量都不能使用,它们在哪里
8. PHP加上HTML
8.1 我要如何在HTML中建立<form>数组?
9. PHP和其它语言
9.1 PHP与ASP
9.2 有ASP转化为PHP的程序吗?
9.3 PHP与Cold Fusion
9.4 PHP与PERL
10. 一般问题
10.1 我装了PHP,但每次在读取文件时,总是得到'Document Contains No Data'!这是怎么回事?
10.2 我在用户自定义函数中,读取一个标准的CGI变量(如$DOCUMENT_ROOT 或 $HTTP_REFERER等),结果却告诉我找不到,为什么?
10.3 我将Apache装上FrontPage extensions的补丁,突然PHP停止工作,PHP是否和Apache + FrontPage extensions冲突?
10.4 我想我发现了一个BUG!我应该告诉谁?
11. 由PHP3移植到PHP4
11.1 一般信息
11.2 不兼容的函数
12. 由PHP2移植到PHP3
****************************************
6. 编译的问题
6.1 我利用匿名(anonymous)CVS服务取得最新的PHP版本,却没有configure配置文件?
你如果有GNU autoconf套件,你可以自己从configure.in文件生成configure配置文件。从CVS服务器下载PHP 并安装后,在PHP的根目录运行make -f build.mk。(同样,除非你运行configure时加入 --enable-maintainer-mode选项,当configure.in改变时,configure不会重建。因此,你要改变 configure.in必须人工去更新。一种现象当你运行configure或config.status后可以看到,在Makefile中能找到一些如@VARIABLE@的标记)
6.2 我在Apache上配置PHP时出问题,它提示无法找到httpd.h文件,该文件在哪里?
你必须告诉配置/安装你的Apache源代码的根目录,即你要在配置文件中加上 '--with-apache=/path/to/apache',而不是'--with-apache=/path/to/apache/src'。
6.3 当我在运行configure时,它提示找不到包含文件(include files)或者GD、gdbm的Lib库等套件?
你可以在编译配置文件时查找头文件和库文件,并按非标准的附加形式让C的预处理器和连接器通过。如下所示:
CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
如你使用csh及相容的Shell脚本作为你登录的脚本,则应该设为:
env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
6.4 在编译文件language-parser.tab.c时,它提示'yytname undeclared'的错误信息?
你必须升级你的Bison程序。可以在ftp://prep.ai.mit.edu/pub/gnu/找到最新的版本。
6.5 当我在运行'make'时,看起来一切正常,但在最后连接时,程序说找不到某些文件?
编译时不要将一些老版本所用的文件放在目前版本的目录中。先运行"cp *.o functions" 并重新运行"make"看看。如果仍旧不行,你应该升级你的GNU make程序了。
6.6 当在连接PHP时,程序抱怨一些数值没有定义参考?
看看连接的那一行,确定所有的Lib库的包含文件都在正确的位置。通常你可能没用'-ldl' 并且有任何的必须Lib库或者是使用的数据库有问题。
如果你连接Apache 1.2.x,是否记得配置文件中加到EXTRA_LIBS的附加信息,并重新运行Apache配置文件?参考英文的INSTALL文件,有更多的信息。
有些人回复说使用'-ldl',马上跟着'libphp3.a'连接Apache也是相同的。
6.7 我不知道如何将PHP安装到Apache 1.3上?
实际这是很简单的,小心跟着以下的步骤做:
在http://www.apache.org/dist/取得最新的Apache 1.3套件
解压(ungzip)及解包(untar)到Apache指定的路径,如/usr/local/src/apache-1.3。
编辑PHP,运行./configure --with-apache=//apache-1.3(路径<path>为放置apache-1.3的路径)
输入"make",运行完之后,运行"make install",将需要的文件复制到Apache目录中。
跳到Apache的路径//apache-1.3/src,并编辑Configuration文件。在该文件的结尾处加入 AddModule modules/php3/libphp3.a字符串
运行'./Configure'后再运行'make'。
现在,你就有含PHP的httpd的二进制程序了。
注意:你也可以运行Apache的./configure配置文件。参考你的Apache套件中的 README.configure文件。还有,看一下PHP套件中的INSTALL文件。
6.8 我按照安装步骤在UNIX上安装PHP到Apache的模块中,但我的浏览器却显示出PHP脚本的源码,并询问我是否保存?
发生这种情况是因为某些原因使PHP的模块没有顺利运行。请在寻求帮助之前,先检查下面三个步骤:
确认你运行的httpd程序是你刚编译过的。请运行/path/to/binary/httpd -l。如果你没有看到 mod_php3.c在列表中,请重装Apache程序。
确定你在Apache的配置文件.conf (如 httpd.conf)中加入了MIME类型,如 AddType application/x-httpd-php3 .php3,同时也要确定上面的AddType没有放在 a <Virtualhost>或<Directory>二个区域之中,否则会让你加入的MIME 类型无效。
最后,由于Apache 1.2.x和Apache 1.3.x的系统配置文件的位置不同。你需要检查真正的配置文件是哪个,同时看里面有没有为PHP加上AddType类型。你可以放个错误的配置语法在httpd.conf中,看运行httpd时有没有错误信息来确定配置文件到底对不对。
6.9 明明写着 --activate-module=src/modules/php3/libphp3.a,但该文件却不存在,我就改成--activate-module=src/modules/php3/libmodphp3.a,但却不能运行,为什么?
呵,你的确比那些只会按照安装介绍一步一步来的人聪明。文件libphp3.a 不存在,但Apache的编译会建立它。
6.10 当我试着去编译PHP成为Apache的静态模块,使用--activate-module=src/modules/php3/libphp3.a,它却告诉我,编译器不符合国际标准ANSI?
这是一个让人迷惑的错误信息,但是新版的Apache中已经修正了这个错误。
6.11 当我试着用--with-apxs来编译PHP时,我得到了奇怪的错误信息?
有两种方法检查。第一种,当Apache建立apxs Perl程序时,因为一些原因,它没有包含正确的编译参数。编辑你apxs(在/usr/local/apache/bin/apxs或者 /usr/sbin/apxs)并检查下列几行:
my $CFG_CFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB = ' '; # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl
如果你看到上面那样子,就是你发生错误的地方了,改成下面几行的样子:
my $CFG_CFLAGS_SHLIB = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB = 'gcc'; # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(-shared);# substituted via Makefile.tmpl
第二种可能的原因只有在RedHat 6.1上发生。RedHat 上的apxs配置有问题,如下行:
my $CFG_LIBEXECDIR = 'modules'; # substituted via APACI install
如果你看到上面那行,应该改成下面这行:
my $CFG_LIBEXECDIR = '/usr/lib/apache'; # substituted via APACI install
****************************************
7. 使用PHP
7.1 我想写一个通用的PHP脚本来处理任何传进来的表单Form的数据。我要如何知道POST方法的变量可用呢?
确定track_vars在你php3.ini文件中。如果你在编译PHP时加上"--enable-track-vars",肯定就有了。你要在下面二种方式中选择一种:在编译时加入;或是在每个脚本的第一行加入 <?php_track_vars?>字符串。当track_vars打开时,会建立三个数组: $HTTP_GET_VARS、$HTTP_POST_VARS 和 $HTTP_COOKIE_VARS。因此,建立通用的 POST方法脚本,可以用下面的程序:
while (list($var, $value) = each($HTTP_POST_VARS))
{ echo "$var = $value
n"; }
7.2 我想将所有的单引号加上一个反斜线。我应该用什么常规方法来做?
首先,请参考英文的 addslashes() 函数,它能达到你想要的功能,你也应参考php3.ini设定的 magic_quotes_gpc 选项。
函数 ereg_replace()可以达到你要的结果,做法如下:
$escaped = ereg_replace("'", "'", $input);
7.3 当我运行下面的脚本,它会输出错误信息,我该怎么做?
function myfunc($argument) {
echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
到底是什么原因呢?
要将自定义函数的结果传回,你需要使用return来将结果传回,而不是echo函数。
7.4 嘿,我要新增一行,怎么办?
<PRE>
1 <?echo $result[1];?>
2 <?echo $result[2];?>
在PHP中,要结束一个脚本区域,使用"?>" 或 "?>n"(n 是要新增一行的)。意思在上述的程序中你需要在每个PHP区域中加入另外的换行标记。
为何PHP会这样子呢?因为当格式化成一般的HTML时,你不需要新的一行。但是当你在生成了一个行特别长的源代码时,它会让你阅读时很困难。
7.5 我要直接读取请求的信息头,我要怎么做?
如果你使用模块方式运行PHP,函数getallheaders()可以达到你的要求。因此照下面的程序可以显示你所有请求的HTTP变量值:
$headers = getallheaders();
for(reset($headers); $key = key($headers); next($headers))
{ echo "headers[$key] = ".$headers[$key]."
n"; }
7.6 当我尝试使用IIS的使用者认证功能时,它提示我"No Input file specified"?
这是IIS的安全模式有问题。这是所有CGI脚本在IIS下面运行都会遇到的问题。它先建立完全的HTML文件(不通过PHP解析)后通过使用者认证路径进入该页。当使用META标记重新导向PHP页面,或者连接到PHP页面时,PHP将确认正确的认证。当ISAPI模块可用时,这就不在是问题。这个问题不会影响到其它的NT WEB服务器。更多的信息请参考:
http://support.microsoft.com/support/kb/articles/q160/4/22.asp。
7.7 我按照介绍安装步骤来做,但还是不能让我的PHP和IIS配合使用?
确定任何需要运行PHP脚本的使用者都有权利运行php.exe!IIS使用匿名(anonymous)作为运行的帐号。这个帐号要有运行php.exe的权利。并要让IIS知道PHP引擎。
7.8 我的PHP脚本只能在IE和Lynx中运行,但在Netscape运行会丢失结果;并且当我用"查看源文件"功能时,只在IE中有内容,Netscape却不行?
非常好的问题 ;) 过去一个月中这个问题被问了两次。我花了二十分钟的时间来了解这个鬼问题到底如何。
答案是IE和Lynx都会忽略HTML数据流中的NULs ()字段,而Netscape 则不会。最好的方法是在列模式运行PHP(如其它的CGI脚本),在运行命令行加入管道后加'od -c',来检查任何的字段。如果你使用的是Windows平台,你可以用可以看到二进制码的编辑软件来查找。当Netscape看到文件中的NUL时就不会在该行输出任何东西,在IE和Lynx则不会。如这个问题曾经困扰你,恭喜!你并不孤独。
7.9 我如何混合使用XML和PHP?它抱怨<?xml>标记
你必须要关掉 php3.ini 配置中的短标记功能,将short_tags设为 0,或是在Apache配置文件中使用php3_short_tags配置 。(你也可以在<File>区域中使用。) 也可以在脚本中使用short_tags()函数让短标记功能有用或无效。
7.10 我怎么做才能让FrontPage、Dreamweaver或其它的HTML编辑器可以编辑我的PHP脚本?
你可以使用ASP的标记来处理PHP的脚本。用ASP的%lt;%和%>包住PHP脚本。现在流行的HTML编辑软件都能比较聪明的处理这个问题。要让ASP式的标记能起作用,你需要在php3.ini设定asp_tags变量,或在 Apache配置文件中使用php3_asp_tags参数。
7.11 我想找出所有的预定义的数值,但为何所有文件都没有提到?
最好的方法是建立一个新的页面,使用<?phpinfo()?>,并在浏览器中载入。它会显示所有的PHP参数信息、环境变量、WEB服务器的特定变量、HTTP的相关变量...等等。没有将完整的变量值放在文件中的主要原因是它会随着服务器的不同而有所差异。
7.12 为什么我总是得到这样子的错误:"Warning: 0 is not a MySQL result index in <file> on line <x>"或者"Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>?"
你试着将传回的值定为0,但0表示传回错误或其它的原因。你需要检查送出的query字符串和尝试处理的传回值。正确的脚本如下面的样子:
$result = mysql_query("select * from tables_priv");
if(!$result) {
echo mysql_error();
exit;
}
或者是:
$result = mysql_query("select * from tables_priv")
or die("Bad query: ".mysql_error());
7.13 当我试着使用<input type="image">标记时,但$foo.x和$foo.y变量都不能使用,它们在哪里
当送出一个表单时,它可能使用image当成提交按钮,如下面所示:
<input type="image" SRC="image.gif" NAME="foo"> 当用户按下图片的任一点时,伴随表单传回服务器还包含了二个附加变量 foo.x 与 foo.y。
因为foo.x 与 foo.y在PHP中是有问题的名称,它们自动转成变量 $foo_x 与 $foo_y。在PHP处理期间就被转换掉了。
****************************************
8. PHP加上HTML
8.1 我要如何在HTML中建立<form>数组?
要取得<form>传回数组,只要在PHP脚本中将<input>、<select> 或 <textarea> 等元素设成如下样子:
<input name="MyArray[]">
<input name="MyArray[]">
<input name="MyArray[]">
<input name="MyArray[]">
请注意在变量名后面的中括号,它就用来生成数组。你也可以在同一个名字中设定不同的数组元素群体,象下面的样子:
<input name="MyArray[]">
<input name="MyArray[]">
<input name="MyOtherArray[]">
<input name="MyOtherArray[]">
在PHP收到这个页面后,会建立二个数组,MyArray 与 MyOtherArray。需注意的是你在HTML中不用设定数组的索引!数组将依次将数据填入表格中。你可以使用数组函数库来处理这些数组。
****************************************
9. PHP和其它语言
9.1 PHP与ASP
ASP实际上不算是语言,它只是Active Server Pages的缩写,在ASP中使用的语法实际上是Visual Basic的script版本而已。最大的缺陷是ASP是出生于微软的Internet Information Server (IIS) 上的,导致其只能在Win32平台的服务器上运行。有一些特别的要让ASP在其它的WEB服务器环境上运行;如Halcyon开发的商业版的InstantASP、Chili!Soft开发的商业版的Chili!Soft ASP from及 Activescripting.org开发的免费的OpenASP。ASP比PHP慢又笨重,连稳定性也不好。一些专业人士因为熟悉Visual Basic而对VBscript的ASP出了问题比较好处理。ASP是IIS内建的软件,取得方便且容易运行。
9.2 有ASP转化为PHP的程序吗?
有,asp2php是最常用的软件。
9.3 PHP与Cold Fusion
对一些新的构想或复杂的程序而言,PHP是普遍被认为能较快处理的选择。 PHP通常比较稳定,同时使用的资源比较少。Cold Fusion比起PHP4有不错的错误处理、抽象数据库及数据的剖析处理能力。其它方面,Cold Fusion拥有一个强有力的搜索引擎,但其它的WEB功能则很少被提起。PHP几乎支持所有的系统平台;而Cold Fusion只支持Win32、Solaris、Linux及HP/UX。 Cold Fusion有不错的IDE开发环境,也比较容易上手;PHP则需要较多的程序设计经验。
有一份不错的摘要,是由Michael J Sheldon在PHP邮件论坛中所写的主题。按下这里可以看到。
9.4 PHP与PERL
PHP比起PERL最大的优势在与PHP是专为WEB服务器所设计的程序语言,而PERL除了在WEB上使用之外,有着更复杂的功能。在弹性/复杂性方面,PERL起步较早有较多的功能,也造成了其他作者和开发者读取的困难。PHP较单纯且较严谨又不失弹性的结构。PHP比PERL 更好地和HTML语法融合。无论在结构、语法还是其它方面,PHP比起全功能的PERL是小而美的结构。PERL是花了很长时间才能成为真正的语言,而PHP则快速地发展到成熟。
****************************************
10. 一般问题
10.1 我装了PHP,但每次在读取文件时,总是得到'Document Contains No Data'!这是怎么回事?
这很可能是PHP遇到了一些特别的问题,并将它核心死机。查看你的服务器的记录文件有无相关的信息,并将可能发生问题的地方写成一个小的脚本拉测试。如果你使用Apache模块方式的PHP软件,请按照以下步骤:
停止你的WEB服务器进程
gdb httpd
> run -X -f /path/to/httpd.conf
取得浏览器出问题的URL
如果你取得核心死机的数据,gdb在此时会报告
输入:bt
送出结果到:[email protected]
如你的软件使用常规表示法的函数库,(如 ereg()...等等),你应该确定Apache使用相同的常规表示法套件。(这可能自动发生在PHP搭配的Apache 1.3.x)
10.2 我在用户自定义函数中,读取一个标准的CGI变量(如$DOCUMENT_ROOT 或 $HTTP_REFERER等),结果却告诉我找不到,为什么?
环境变量一般都是全局变量,因此你可以用下列两种方式在你的函数中读取全局变量:使用诸如"global $DOCUMENT_ROOT;" 先宣告后使用;或者利用全局变量数组,如"$GLOBALS["DOCUMENT_ROOT"]"。
10.3 我将Apache装上FrontPage extensions的补丁,突然PHP停止工作,PHP是否和Apache + FrontPage extensions冲突?
不会,PHP和FrontPage extensions处得很好。问题可能是FrontPage补丁软件的更动和一些Apache结构有问题,而正好PHP依赖那正好出问题的结构。重新编译PHP(使用 'make clean ; make')之后再使用FrontPage的patch就可以解决这个问题了!
10.4 我想我发现了一个BUG!我应该告诉谁?
你可以先到PHP的BUG数据库中确定里面没有你的BUG,之后再将你找到的BUG填写报告表格中。回报时会同时寄到邮件论坛中,该BUG也会被给予一个跟踪编号,让你能回去看看目前的处理状态。 BUG数据库在http://bugs.php.net/。
****************************************
11. 由PHP3移植到PHP4
11.1
一般信息
PHP4在设计时就决定跟先前的PHP3尽量兼容。如你不确定你的软件是否兼容,可以先安装PHP4的测试环境运行你的脚本看看。
11.2
不兼容的函数
PHP4根本上是重写整个PHP引擎,造成了极少数函数因此和旧版本的函数有所差异。
****************************************
12. 由PHP2移植到PHP3
PHP/FI 2.0 目前不再开发。参考英文的资料提供由 PHP/FI 2.0 移植的方法。
****************************************
荣誉
原英文版的常见问题集最初由Jim Winstead撰写,并且由 PHP 档案小组维护
(来源:PHP官方网)
php爱好者站 http://www.phpfans.net PHP|MySQL|javascript|ajax|html.
作者 : Jim Winstead | 译者:jetzhou | 日期 : 2000-08-18
6. 编译的问题
6.1 我利用匿名(anonymous)CVS服务取得最新的PHP版本,却没有configure配置文件?
6.2 我在Apache上配置PHP时出问题,它提示无法找到httpd.h文件,该文件在哪里?
6.3 当我在运行configure时,它提示找不到包含文件(include files)或者GD、gdbm的Lib库等套件?
6.4 在编译文件language-parser.tab.c时,它提示'yytname undeclared'的错误信息?
6.5 当我在运行'make'时,看起来一切正常,但在最后连接时,程序说找不到某些文件?
6.6 当在连接PHP时,程序抱怨一些数值没有定义参考?
6.7 我不知道如何将PHP安装到Apache 1.3上?
6.8 我按照安装步骤在UNIX上安装PHP到Apache的模块中,但我的浏览器却显示出PHP脚本的源码,并询问我是否保存?
6.9 明明写着 --activate-module=src/modules/php3/libphp3.a,但该文件却不存在,我就改成--activate-module=src/modules/php3/libmodphp3.a,但却不能运行,为什么?
6.10 当我试着去编译PHP成为Apache的静态模块,使用--activate-module=src/modules/php3/libphp3.a,它却告诉我,编译器不符合国际标准ANSI?
6.11 当我试着用--with-apxs来编译PHP时,我得到了奇怪的错误信息?
7. 使用PHP
7.1 我想写一个通用的PHP脚本来处理任何传进来的表单Form的数据。我要如何知道POST方法的变量可用呢?
7.2 我想将所有的单引号加上一个反斜线。我应该用什么常规方法来做?
7.3 当我运行下面的脚本,它会输出错误信息,我该怎么做?
7.4 嘿,我要新增一行,怎么办?
7.5 我要直接读取请求的信息头,我要怎么做?
7.6 当我尝试使用IIS的使用者认证功能时,它提示我"No Input file specified"?
7.7 我按照介绍安装步骤来做,但还是不能让我的PHP和IIS配合使用?
7.8 我的PHP脚本只能在IE和Lynx中运行,但在Netscape运行会丢失结果;并且当我用"查看源文件"功能时,只在IE中有内容,Netscape却不行?
7.9 我如何混合使用XML和PHP?它抱怨<?xml>标记
7.10 我怎么做才能让FrontPage、Dreamweaver或其它的HTML编辑器可以编辑我的PHP脚本?
7.11 我想找出所有的预定义的数值,但为何所有文件都没有提到?
7.12 为什么我总是得到这样子的错误:"Warning: 0 is not a MySQL result index in <file> on line <x>"或者"Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>?"
7.13 当我试着使用<input type="image">标记时,但$foo.x和$foo.y变量都不能使用,它们在哪里
8. PHP加上HTML
8.1 我要如何在HTML中建立<form>数组?
9. PHP和其它语言
9.1 PHP与ASP
9.2 有ASP转化为PHP的程序吗?
9.3 PHP与Cold Fusion
9.4 PHP与PERL
10. 一般问题
10.1 我装了PHP,但每次在读取文件时,总是得到'Document Contains No Data'!这是怎么回事?
10.2 我在用户自定义函数中,读取一个标准的CGI变量(如$DOCUMENT_ROOT 或 $HTTP_REFERER等),结果却告诉我找不到,为什么?
10.3 我将Apache装上FrontPage extensions的补丁,突然PHP停止工作,PHP是否和Apache + FrontPage extensions冲突?
10.4 我想我发现了一个BUG!我应该告诉谁?
11. 由PHP3移植到PHP4
11.1 一般信息
11.2 不兼容的函数
12. 由PHP2移植到PHP3
****************************************
6. 编译的问题
6.1 我利用匿名(anonymous)CVS服务取得最新的PHP版本,却没有configure配置文件?
你如果有GNU autoconf套件,你可以自己从configure.in文件生成configure配置文件。从CVS服务器下载PHP 并安装后,在PHP的根目录运行make -f build.mk。(同样,除非你运行configure时加入 --enable-maintainer-mode选项,当configure.in改变时,configure不会重建。因此,你要改变 configure.in必须人工去更新。一种现象当你运行configure或config.status后可以看到,在Makefile中能找到一些如@VARIABLE@的标记)
6.2 我在Apache上配置PHP时出问题,它提示无法找到httpd.h文件,该文件在哪里?
你必须告诉配置/安装你的Apache源代码的根目录,即你要在配置文件中加上 '--with-apache=/path/to/apache',而不是'--with-apache=/path/to/apache/src'。
6.3 当我在运行configure时,它提示找不到包含文件(include files)或者GD、gdbm的Lib库等套件?
你可以在编译配置文件时查找头文件和库文件,并按非标准的附加形式让C的预处理器和连接器通过。如下所示:
CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
如你使用csh及相容的Shell脚本作为你登录的脚本,则应该设为:
env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
6.4 在编译文件language-parser.tab.c时,它提示'yytname undeclared'的错误信息?
你必须升级你的Bison程序。可以在ftp://prep.ai.mit.edu/pub/gnu/找到最新的版本。
6.5 当我在运行'make'时,看起来一切正常,但在最后连接时,程序说找不到某些文件?
编译时不要将一些老版本所用的文件放在目前版本的目录中。先运行"cp *.o functions" 并重新运行"make"看看。如果仍旧不行,你应该升级你的GNU make程序了。
6.6 当在连接PHP时,程序抱怨一些数值没有定义参考?
看看连接的那一行,确定所有的Lib库的包含文件都在正确的位置。通常你可能没用'-ldl' 并且有任何的必须Lib库或者是使用的数据库有问题。
如果你连接Apache 1.2.x,是否记得配置文件中加到EXTRA_LIBS的附加信息,并重新运行Apache配置文件?参考英文的INSTALL文件,有更多的信息。
有些人回复说使用'-ldl',马上跟着'libphp3.a'连接Apache也是相同的。
6.7 我不知道如何将PHP安装到Apache 1.3上?
实际这是很简单的,小心跟着以下的步骤做:
在http://www.apache.org/dist/取得最新的Apache 1.3套件
解压(ungzip)及解包(untar)到Apache指定的路径,如/usr/local/src/apache-1.3。
编辑PHP,运行./configure --with-apache=//apache-1.3(路径<path>为放置apache-1.3的路径)
输入"make",运行完之后,运行"make install",将需要的文件复制到Apache目录中。
跳到Apache的路径//apache-1.3/src,并编辑Configuration文件。在该文件的结尾处加入 AddModule modules/php3/libphp3.a字符串
运行'./Configure'后再运行'make'。
现在,你就有含PHP的httpd的二进制程序了。
注意:你也可以运行Apache的./configure配置文件。参考你的Apache套件中的 README.configure文件。还有,看一下PHP套件中的INSTALL文件。
6.8 我按照安装步骤在UNIX上安装PHP到Apache的模块中,但我的浏览器却显示出PHP脚本的源码,并询问我是否保存?
发生这种情况是因为某些原因使PHP的模块没有顺利运行。请在寻求帮助之前,先检查下面三个步骤:
确认你运行的httpd程序是你刚编译过的。请运行/path/to/binary/httpd -l。如果你没有看到 mod_php3.c在列表中,请重装Apache程序。
确定你在Apache的配置文件.conf (如 httpd.conf)中加入了MIME类型,如 AddType application/x-httpd-php3 .php3,同时也要确定上面的AddType没有放在 a <Virtualhost>或<Directory>二个区域之中,否则会让你加入的MIME 类型无效。
最后,由于Apache 1.2.x和Apache 1.3.x的系统配置文件的位置不同。你需要检查真正的配置文件是哪个,同时看里面有没有为PHP加上AddType类型。你可以放个错误的配置语法在httpd.conf中,看运行httpd时有没有错误信息来确定配置文件到底对不对。
6.9 明明写着 --activate-module=src/modules/php3/libphp3.a,但该文件却不存在,我就改成--activate-module=src/modules/php3/libmodphp3.a,但却不能运行,为什么?
呵,你的确比那些只会按照安装介绍一步一步来的人聪明。文件libphp3.a 不存在,但Apache的编译会建立它。
6.10 当我试着去编译PHP成为Apache的静态模块,使用--activate-module=src/modules/php3/libphp3.a,它却告诉我,编译器不符合国际标准ANSI?
这是一个让人迷惑的错误信息,但是新版的Apache中已经修正了这个错误。
6.11 当我试着用--with-apxs来编译PHP时,我得到了奇怪的错误信息?
有两种方法检查。第一种,当Apache建立apxs Perl程序时,因为一些原因,它没有包含正确的编译参数。编辑你apxs(在/usr/local/apache/bin/apxs或者 /usr/sbin/apxs)并检查下列几行:
my $CFG_CFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB = ' '; # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl
如果你看到上面那样子,就是你发生错误的地方了,改成下面几行的样子:
my $CFG_CFLAGS_SHLIB = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB = 'gcc'; # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(-shared);# substituted via Makefile.tmpl
第二种可能的原因只有在RedHat 6.1上发生。RedHat 上的apxs配置有问题,如下行:
my $CFG_LIBEXECDIR = 'modules'; # substituted via APACI install
如果你看到上面那行,应该改成下面这行:
my $CFG_LIBEXECDIR = '/usr/lib/apache'; # substituted via APACI install
****************************************
7. 使用PHP
7.1 我想写一个通用的PHP脚本来处理任何传进来的表单Form的数据。我要如何知道POST方法的变量可用呢?
确定track_vars在你php3.ini文件中。如果你在编译PHP时加上"--enable-track-vars",肯定就有了。你要在下面二种方式中选择一种:在编译时加入;或是在每个脚本的第一行加入 <?php_track_vars?>字符串。当track_vars打开时,会建立三个数组: $HTTP_GET_VARS、$HTTP_POST_VARS 和 $HTTP_COOKIE_VARS。因此,建立通用的 POST方法脚本,可以用下面的程序:
while (list($var, $value) = each($HTTP_POST_VARS))
{ echo "$var = $value
n"; }
7.2 我想将所有的单引号加上一个反斜线。我应该用什么常规方法来做?
首先,请参考英文的 addslashes() 函数,它能达到你想要的功能,你也应参考php3.ini设定的 magic_quotes_gpc 选项。
函数 ereg_replace()可以达到你要的结果,做法如下:
$escaped = ereg_replace("'", "'", $input);
7.3 当我运行下面的脚本,它会输出错误信息,我该怎么做?
function myfunc($argument) {
echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
到底是什么原因呢?
要将自定义函数的结果传回,你需要使用return来将结果传回,而不是echo函数。
7.4 嘿,我要新增一行,怎么办?
<PRE>
1 <?echo $result[1];?>
2 <?echo $result[2];?>
在PHP中,要结束一个脚本区域,使用"?>" 或 "?>n"(n 是要新增一行的)。意思在上述的程序中你需要在每个PHP区域中加入另外的换行标记。
为何PHP会这样子呢?因为当格式化成一般的HTML时,你不需要新的一行。但是当你在生成了一个行特别长的源代码时,它会让你阅读时很困难。
7.5 我要直接读取请求的信息头,我要怎么做?
如果你使用模块方式运行PHP,函数getallheaders()可以达到你的要求。因此照下面的程序可以显示你所有请求的HTTP变量值:
$headers = getallheaders();
for(reset($headers); $key = key($headers); next($headers))
{ echo "headers[$key] = ".$headers[$key]."
n"; }
7.6 当我尝试使用IIS的使用者认证功能时,它提示我"No Input file specified"?
这是IIS的安全模式有问题。这是所有CGI脚本在IIS下面运行都会遇到的问题。它先建立完全的HTML文件(不通过PHP解析)后通过使用者认证路径进入该页。当使用META标记重新导向PHP页面,或者连接到PHP页面时,PHP将确认正确的认证。当ISAPI模块可用时,这就不在是问题。这个问题不会影响到其它的NT WEB服务器。更多的信息请参考:
http://support.microsoft.com/support/kb/articles/q160/4/22.asp。
7.7 我按照介绍安装步骤来做,但还是不能让我的PHP和IIS配合使用?
确定任何需要运行PHP脚本的使用者都有权利运行php.exe!IIS使用匿名(anonymous)作为运行的帐号。这个帐号要有运行php.exe的权利。并要让IIS知道PHP引擎。
7.8 我的PHP脚本只能在IE和Lynx中运行,但在Netscape运行会丢失结果;并且当我用"查看源文件"功能时,只在IE中有内容,Netscape却不行?
非常好的问题 ;) 过去一个月中这个问题被问了两次。我花了二十分钟的时间来了解这个鬼问题到底如何。
答案是IE和Lynx都会忽略HTML数据流中的NULs ()字段,而Netscape 则不会。最好的方法是在列模式运行PHP(如其它的CGI脚本),在运行命令行加入管道后加'od -c',来检查任何的字段。如果你使用的是Windows平台,你可以用可以看到二进制码的编辑软件来查找。当Netscape看到文件中的NUL时就不会在该行输出任何东西,在IE和Lynx则不会。如这个问题曾经困扰你,恭喜!你并不孤独。
7.9 我如何混合使用XML和PHP?它抱怨<?xml>标记
你必须要关掉 php3.ini 配置中的短标记功能,将short_tags设为 0,或是在Apache配置文件中使用php3_short_tags配置 。(你也可以在<File>区域中使用。) 也可以在脚本中使用short_tags()函数让短标记功能有用或无效。
7.10 我怎么做才能让FrontPage、Dreamweaver或其它的HTML编辑器可以编辑我的PHP脚本?
你可以使用ASP的标记来处理PHP的脚本。用ASP的%lt;%和%>包住PHP脚本。现在流行的HTML编辑软件都能比较聪明的处理这个问题。要让ASP式的标记能起作用,你需要在php3.ini设定asp_tags变量,或在 Apache配置文件中使用php3_asp_tags参数。
7.11 我想找出所有的预定义的数值,但为何所有文件都没有提到?
最好的方法是建立一个新的页面,使用<?phpinfo()?>,并在浏览器中载入。它会显示所有的PHP参数信息、环境变量、WEB服务器的特定变量、HTTP的相关变量...等等。没有将完整的变量值放在文件中的主要原因是它会随着服务器的不同而有所差异。
7.12 为什么我总是得到这样子的错误:"Warning: 0 is not a MySQL result index in <file> on line <x>"或者"Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>?"
你试着将传回的值定为0,但0表示传回错误或其它的原因。你需要检查送出的query字符串和尝试处理的传回值。正确的脚本如下面的样子:
$result = mysql_query("select * from tables_priv");
if(!$result) {
echo mysql_error();
exit;
}
或者是:
$result = mysql_query("select * from tables_priv")
or die("Bad query: ".mysql_error());
7.13 当我试着使用<input type="image">标记时,但$foo.x和$foo.y变量都不能使用,它们在哪里
当送出一个表单时,它可能使用image当成提交按钮,如下面所示:
<input type="image" SRC="image.gif" NAME="foo"> 当用户按下图片的任一点时,伴随表单传回服务器还包含了二个附加变量 foo.x 与 foo.y。
因为foo.x 与 foo.y在PHP中是有问题的名称,它们自动转成变量 $foo_x 与 $foo_y。在PHP处理期间就被转换掉了。
****************************************
8. PHP加上HTML
8.1 我要如何在HTML中建立<form>数组?
要取得<form>传回数组,只要在PHP脚本中将<input>、<select> 或 <textarea> 等元素设成如下样子:
<input name="MyArray[]">
<input name="MyArray[]">
<input name="MyArray[]">
<input name="MyArray[]">
请注意在变量名后面的中括号,它就用来生成数组。你也可以在同一个名字中设定不同的数组元素群体,象下面的样子:
<input name="MyArray[]">
<input name="MyArray[]">
<input name="MyOtherArray[]">
<input name="MyOtherArray[]">
在PHP收到这个页面后,会建立二个数组,MyArray 与 MyOtherArray。需注意的是你在HTML中不用设定数组的索引!数组将依次将数据填入表格中。你可以使用数组函数库来处理这些数组。
****************************************
9. PHP和其它语言
9.1 PHP与ASP
ASP实际上不算是语言,它只是Active Server Pages的缩写,在ASP中使用的语法实际上是Visual Basic的script版本而已。最大的缺陷是ASP是出生于微软的Internet Information Server (IIS) 上的,导致其只能在Win32平台的服务器上运行。有一些特别的要让ASP在其它的WEB服务器环境上运行;如Halcyon开发的商业版的InstantASP、Chili!Soft开发的商业版的Chili!Soft ASP from及 Activescripting.org开发的免费的OpenASP。ASP比PHP慢又笨重,连稳定性也不好。一些专业人士因为熟悉Visual Basic而对VBscript的ASP出了问题比较好处理。ASP是IIS内建的软件,取得方便且容易运行。
9.2 有ASP转化为PHP的程序吗?
有,asp2php是最常用的软件。
9.3 PHP与Cold Fusion
对一些新的构想或复杂的程序而言,PHP是普遍被认为能较快处理的选择。 PHP通常比较稳定,同时使用的资源比较少。Cold Fusion比起PHP4有不错的错误处理、抽象数据库及数据的剖析处理能力。其它方面,Cold Fusion拥有一个强有力的搜索引擎,但其它的WEB功能则很少被提起。PHP几乎支持所有的系统平台;而Cold Fusion只支持Win32、Solaris、Linux及HP/UX。 Cold Fusion有不错的IDE开发环境,也比较容易上手;PHP则需要较多的程序设计经验。
有一份不错的摘要,是由Michael J Sheldon在PHP邮件论坛中所写的主题。按下这里可以看到。
9.4 PHP与PERL
PHP比起PERL最大的优势在与PHP是专为WEB服务器所设计的程序语言,而PERL除了在WEB上使用之外,有着更复杂的功能。在弹性/复杂性方面,PERL起步较早有较多的功能,也造成了其他作者和开发者读取的困难。PHP较单纯且较严谨又不失弹性的结构。PHP比PERL 更好地和HTML语法融合。无论在结构、语法还是其它方面,PHP比起全功能的PERL是小而美的结构。PERL是花了很长时间才能成为真正的语言,而PHP则快速地发展到成熟。
****************************************
10. 一般问题
10.1 我装了PHP,但每次在读取文件时,总是得到'Document Contains No Data'!这是怎么回事?
这很可能是PHP遇到了一些特别的问题,并将它核心死机。查看你的服务器的记录文件有无相关的信息,并将可能发生问题的地方写成一个小的脚本拉测试。如果你使用Apache模块方式的PHP软件,请按照以下步骤:
停止你的WEB服务器进程
gdb httpd
> run -X -f /path/to/httpd.conf
取得浏览器出问题的URL
如果你取得核心死机的数据,gdb在此时会报告
输入:bt
送出结果到:[email protected]
如你的软件使用常规表示法的函数库,(如 ereg()...等等),你应该确定Apache使用相同的常规表示法套件。(这可能自动发生在PHP搭配的Apache 1.3.x)
10.2 我在用户自定义函数中,读取一个标准的CGI变量(如$DOCUMENT_ROOT 或 $HTTP_REFERER等),结果却告诉我找不到,为什么?
环境变量一般都是全局变量,因此你可以用下列两种方式在你的函数中读取全局变量:使用诸如"global $DOCUMENT_ROOT;" 先宣告后使用;或者利用全局变量数组,如"$GLOBALS["DOCUMENT_ROOT"]"。
10.3 我将Apache装上FrontPage extensions的补丁,突然PHP停止工作,PHP是否和Apache + FrontPage extensions冲突?
不会,PHP和FrontPage extensions处得很好。问题可能是FrontPage补丁软件的更动和一些Apache结构有问题,而正好PHP依赖那正好出问题的结构。重新编译PHP(使用 'make clean ; make')之后再使用FrontPage的patch就可以解决这个问题了!
10.4 我想我发现了一个BUG!我应该告诉谁?
你可以先到PHP的BUG数据库中确定里面没有你的BUG,之后再将你找到的BUG填写报告表格中。回报时会同时寄到邮件论坛中,该BUG也会被给予一个跟踪编号,让你能回去看看目前的处理状态。 BUG数据库在http://bugs.php.net/。
****************************************
11. 由PHP3移植到PHP4
11.1
一般信息
PHP4在设计时就决定跟先前的PHP3尽量兼容。如你不确定你的软件是否兼容,可以先安装PHP4的测试环境运行你的脚本看看。
11.2
不兼容的函数
PHP4根本上是重写整个PHP引擎,造成了极少数函数因此和旧版本的函数有所差异。
****************************************
12. 由PHP2移植到PHP3
PHP/FI 2.0 目前不再开发。参考英文的资料提供由 PHP/FI 2.0 移植的方法。
****************************************
荣誉
原英文版的常见问题集最初由Jim Winstead撰写,并且由 PHP 档案小组维护
(来源:PHP官方网)
php爱好者站 http://www.phpfans.net PHP|MySQL|javascript|ajax|html.
相关阅读 更多 +