PHP学习笔记(四)——基本的PHP错误

上一篇 / 下一篇  2006-12-28 09:08:03 / 个人分类:开发相关

1.和安装有关的问题

 

 

l        现象:文件内容显示在浏览器窗口上

没有激活PHP引擎。确保自己确实是通过调用httpd而不是通过文件系统访问站点。

 

l        现象:HTTP不显示文本或浏览器提示保存文件或访问外部文件库

没有正确地调用PHP引擎。一个最常见的原因是没有指定希望PHP识别的所有文件扩展名,至少没有指定这个目录下的扩展名。第二个最常见的原因是php.ini文件位于错误的目录或者错误的配置指令。

如果在WEB浏览器中看到PHP代码并且安装可靠,则问题可能出在缺少标记上。

 

l        现象:没有找到服务器或主机/页面无法显示

没有找到服务器,可能是DNSWEB服务器配置问题。

如果能通过IP地址访问站点,而通过域名不能,则问题很可能和DNS有关。也许DNS别名还没有传遍internet。即使在站点建立一段时间以后,这个问题也偶尔会发生,或者是因为DNS服务器出了问题而又没有有效的辅助DNS的服务器,或者是因为本地internet条件的问题。

如果不能通过IP地址访问站点,很可能是没有成功地把IP地址绑定到网络接口,或者没有成功地配置httpd处理某个域的请求。

 

2.显示问题

 

问题是PHP本身没有报告出错,但是用户看到的结果不是预期的内容。

 

l        现象:完全为空的页面

空页通常是HTML问题,而不是PHP本身的问题(除非在使用PHP生成HTML的范围内)如果不使用PHP的最大风格(换句话说,如果脚本的任何部分没有首先经过预处理就适合可显示的),几乎可以肯定问题出自HTML内。所以应该首先试试通常调试HTML的方法。

注意:一般情况下,当面临令人迷惑的浏览器输出问题时,一个最好的调试工具时查看浏览器试图显示的HTML源代码。所有的浏览器都有一些查看源文件的命令。例如,在Internet Explorer中,该命令时“查看”菜单下的“源文件”。

若使用纯文本编辑器编写文件,就快速地检查一遍,确保没有丢失至关重要的内容,结束标记</TABLE></FORM>。如果治安某个时期使用所见即所得式的编辑器,则问题很可能时多写了某种元素。

通过从客户端(尤其时如果使用最大PHP风格)或从不同的浏览器查看HTML源文件,以得到有启发性的信息。

如果没有发现HTML有任何错误(尤其时如果使用PHP的最大风格),则时PHP模块根本没起作用。通过浏览同一目录中的不同页面,测试以前核实过的内容是否正确地被PHP处理。

 

l        现象:不完整或不是预期的页面

这些问题通常出自脚本的HTML部分,应该按以前说明的方式进行调试。

 

l        现象:PHP代码显示在WEB浏览器中

很可能在某个地方忽略了PHP起始标记(假设已经成功地运行了PHP,使用了安装时设置的正确标记。)

 

3.载入页面失败

 

PHP不能找到要求载入的文件时,会出现两种错误。

 

l        现象:不能找到文件

如果浏览器不能找到已经创建的PHP页,并且最近已经安装了PHP,先看看本章的第一节。如果在载入其他PHP文件而没有问题时看到这条消息,则很可能只是拼错了文件名或路径。

 

l        现象:打开被包含的文件失败

PHPWindows NT/IIS 版本中,有时能看到这样的消息:

Warning Failed opening ‘C:\InetPub\wwwroot\asdf.php’ for inclusion (include_path=’’) in [no active file ] on line 0

 

这是“找不到文件”的NT版本——即,PHP不能载入文件的第一行,这是因为没有可用的文件。没有可用的文件是因为没找到有该名称的文件。

NT下如果试图载入没有相应权限的文件,也可能看到这条消息。

 

4.解析错误

最常见的错误种类有输入错或PHP代码的语法错,这会使PHP解析引擎分不清。

 

l        现象:解析错误消息

虽然引起解析问题的原因有很多,但是错误现象几乎一样:解析错了可能有问题的代码行的行号。

 

l        解析错误的一般原因:缺少分号

如果每个PHP指令没有在合适的地方用分号结束,将会导致解析错误。

      注意:真正引起错误的地方可能就在PHP提出的一行,或者在这一行前面,但是从来不会在这行后面的代码中。

 

l        解析错误的一般原因:没有$

另一个非常常见的问题是缺少标识变量名的$号。如果在初始的变量赋值中缺少$号,则会得到解析错误。但是,不是这样,而是在输出变量时缺少$号,则PHP不会只是出有解析错误。

 

l        解析错误的一般原因:模式问题

另一系列问题起因于错误地变换PHP模式。

如果没有正确地结束PHP代码块,则将导致解析错误。

      这种模式问题在较短的PHP代码块中很常见。相反,如果没有正确地开始PHP代码块,则剩下的代码块只不过会显示成HTML

      稍微更复杂的问题是使用“最小”PHP风格造成的,这种风格必须频繁地转入或转出HTML模式。

      另一个很常见的实例是把较短的代码块和转入转出HTML的代码块组合起来。

      这些例子说明,用户很容易在有很多小而重要的符号的页面上忘记一个元素。使用好的文本编辑器,或者首先完成和测试HTML,然后再添加PHP,这样能减少这类错误。

 

l        解析错误的一般原因:被转义的引号

另一种解析错误是“最大”PHP模式的特性:被转义的引号。

      需要转义的引号前面被错误的使用斜杆而不是反斜杆,或者是忘记了反斜杆。

 

l        解析错误的一般原因:其他解析错误的原因

任何使PHP语句变形的错误都会令解析引擎迷惑,包括没有结束的圆括号、没有结束的尖括号、没有结束的字符串、没有参数的运算符、没有圆括号的控制结构测试,等等。有时解析错误消息包括的语句会指明正在寻找什么但是没有找到,这是有用的线索。如果解析错误消息指出的代码行是文件的最后一行,则通常意味着使用了某种起始符号(引号、圆括号、大括号),但是缺少结束符号,PHP就一直找到末尾。

 

5.文件权限

大多数操作系统有一些文件和目录权限的模式,指定哪些用户对哪些文件有哪种访问方式。WEB服务器作为这种系统下的某个系统运行,所以一定要查看所涉及的任何文件的权限,包括HTMLPHP源文件。

 

l        现象:HTTP error 403

当浏览器页面显示出现403错误时,意味着文件权限不正确。一些浏览器不会提到错误代码,但是会指出没有权限访问指定的WEB页。

      最常见的原因是没有把该目录设置成完全可执行(UNIX)或启动脚本执行(Windows)。PHP脚本可用在不同于开发者自己的ID的用户ID下运行。在UNIX下,PHP通常继承“nobodyUID,它(很可能)非常受限于HTTP服务。在WINDOWS下,每个HTTP请求按匿名用户登录。

 

l        缺少包含文件

除了载入顶级的源文件以外,PHP还需要能载入通过include()require()载入的任何文件。

 

l        现象:有关包含文件的警告

问题是,在脚本的某个地方要求包含一个文件,而PHP找不到该文件。检查路径是否正确。还可能是由于区分大小写或其他输入的问题。

如果脚本脚本试图包含在另一个目录中的文件,而PHP用户没有拥有对该目录的相应权限,这样也会得到这条消息。通常必须把目录指定为能被WEB服务器用户(在UNIX下常常是“nobody”)可读和可执行,或者通常设置成完全可读/可执行(如在UNIX下是755)。当然文件必须完全可读(通常是744)。

 

6.未被设定的变量

忘记给变量赋值不会直接导致错误——或者输出结果不正确,或者由于变量没有该有的值,后面的语句会报错(如果更愿意显示警告消息,可以用error_reporting(15)把错误报告级别设置成15,或者用error_reporting(E_ALL))。

 

l        现象:变量没有出现在打印字符串中

问题是:变量从来没有被赋过值。

 

l        现象:数字变量出乎意料为0

虽然在这种错误现象中可能是数学上的错误或者曲解了结果,但是更可能是实际上还没有被赋值的变量被认为赋过值。

 

l        未被设定的变量有何作用

一般情况下,在数字上下文中,未被设定的变量被解释成0,在字符串上下文中被解释成“”,在boolean上下文中被解释成FALSE,在数组上下文中被解释成空数组。

 

l        大小写问题

PHP中的变量是区分大小写的。

 

l        范围问题

只要没有涉及函数定义,PHP变量的范围就很简单:给一个变量赋值,它的值就从该点开始在脚本的执行过程中可用(一直到变量被重新赋值为止)。但是,在函数体内能被使用的唯一变量是形参以及被声明未全局变量的变量——如果函数体内有被被设定的变量,这很可能是程序员忘了做什么。

 

提示:在错误报告的默认设置下,PHP不会对使用未被设定的变量发出警告,但是可以更改这种设置,临时进行这种改动常常是找到未被设定的变量问题的最快方法。只要在脚本前面放置如下一行代码:

error_reporting(15);

PHP将会在出现未被设定的变量时都发出警告,调试结束后可以删除该语句,或者明确的返回默认值:

error-reporting(7);

另一种选择是,如果总是希望被警告,就要在php.ini文件中把默认的错误报告级别更改成15

 

7.函数问题

 

调用函数出现的许多问题都得到“fatal errors”(致命错误),意味着PHP放弃处理脚本其余部分。

 

l        现象:调用未定义的函数my_function()

可能是因为拼错了函数的名称,或者是因为用户遗漏了函数定义。如果使用include/require包含文件,载入用户定义的函数,确保载入了正确的文件。

如果问题涉及相当专业的内置函数,可能是在安装PHP时没有启用相关的函数库。

 

l        现象:调用未定义的函数

在这种情况下,PHP试图调用甚至不指导函数名的函数。这总是因为有$my_function()形式的代码,函数名本身是一个变量。除非有意使用PHP的变量-函数-名特性,否则很可能偶然地在my_function()调用前写了$号。因为$my_funciton是未被设定的变量,所以PHP把它解释成空字符串——它不是定义过的函数的名称——这就给出了不提供信息的错误信息。

 

l        现象:不能重新声明my_function()

在代码的某个位置重复定义了my_funciton()PHP不支持双重定义,确保不要使用include多次载入有函数定义的同一文件。

 

 

l        现象:错误的参数数目

在错误消息中指出的函数被调用时,给出的参数少于或多于应该被处

TAG: 开发相关

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar