PHP脚本语言所具有一个显著的特点就是能够自动生成变量实例,不要求用户对所需要使用的变量进行声明。该特点既有值得推崇之处,但是同时也为用户所编写的脚本程序埋下了隐患。从好的方面来说,用户不再需要象使用C语言那样,在程序的开头对每一个将要在程序中使用的变量进行声明;但是,现在用户必须非常小心每一个变量名称的正确拼写,否则就可能会在无意当中创建了新的变量。有些编程语言,例如PERL等,可以记录下程序中只使用过一次的变量的信息,根据用户的预先设置发出警告提示。此外,PERL还提供了一个功能十分强大的调试器。截止到4.0.2版本,PHP语言中还没有包含调试器。但是这并没有影响到PHP语言的流行和推广。PHP提供了非常广泛的功能,即使与象C语言这样成熟的编程语言相比也毫不逊色。可以说,PHP是目前使用最方便,对WEB支持功能最完善的脚本语言之一。

下面,就让我们言归正传,来看一看在PHP编程过程容易出现哪些问题,以及相应的应当采用什么样应对措施。

分号的使用正象我们平时写文章时必须要在每一句话的结尾处加上句号一样,PHP要求程序中的每一条语句都必须使用分号“;”结束。这是一条最基本的语法规则,但是同时也最容易出现问题。我们在编写程序时,很少会一行一行的检查是否漏掉了分号,但是一旦出现任何一处疏忽,解析程序就回立刻发出错误报告。有时,报告中可能会包含出现问题的语句行数。

〈?

$Output="Hello World";

echo $Output

$Other="Blah";

print $SomeMoreText;

?〉

上述代码的第二行“echo $Output”的结尾处我们漏掉了一个分号,如果执行该脚本将会产生如下错误提示:

Parse error: parse error, expecting `’,’’ or `’;’’ in /usr/local/apache/htdocs/test.php on line 8报告虽然指出了出现错误的原因,即漏掉了逗号“,”或分号“;”,但是却将出现问题的语句定在了第八行。因为这段代码非常简单,我们很容易就可以找到真正出现错误的地方。但是,如果程序非常复杂时,要想顺利的找出错误就有些困难了。

根据笔者以往的经验,建议采用以下方法:

如果当错误报告中指出的语句没有明显的问题时,可以检查位于该语句之前的其它指令行(不包括注释行)是否正确。如果仍然没有找到错误,可以将报告中指出的语句行注释掉(在该语句行的最前面加上“//”或“#”注释符号)或者改为用户能够确保完全没有问题的其它语句。之后,重新运行程序,如果错误提示仍然指向同一行,就表明真正有问题的语句应当位于被注释掉的语句行的前面。按照上述方法逐一检查位置靠前的每一行指令,直到错误提示信息发生改变。这时,我们就成功的挖出了真正的罪魁祸首。

变量的问题与其它编程语言要求用户显式声明变量不同,PHP语言允许用户自动使用所有变量而不必进行事先的声明。变量名称的拼写错误成为困扰PHP用户的一个大问题。

〈?

function Combine ($FirstHalf, $SecondHalf)

{

$Combined_String=$FirstHalf.$SecondHalf;

return $Combined_String;

}

$FirstString="WDVL - ";

$SecondString="Illustrated Encyclopedia";

$Combine_Result=Combine ($FirstString, $SecondString);

print $Combined_Result;

?〉

当我们运行以上脚本时,将会看到由于程序没有返回任何数据而出现的错误提示。这里,我们为了更好的说明问题选择了一个非常直观的例子。在现实当中,有时问题并不会这么简单。相信大家都已经找到了出现问题的原因,那就是“print $Combined_Result;”中的变量名称“$Combined_Result”应当改为“$Combine_Result”。

事实上,脚本中任何一处出现的拼写错误都会导致同样的问题。如果用户怀疑自己的程序中有拼写错误的话,一个非常好的检查方法就是在变量的前后显示文字信息。例如:

print “The Combined Result is: |”.$Combined_Result.“|”;

按照上述方法替换输出语句的脚本重新执行之后的结果如下:

The Combined Result is: ||

其中,在两个管道符号“|”之间没有任何内容。按照这种方法,我们就可以在程序中找到出现问题的变量。

下面,我们再举一个更加复杂的例子进行说明。

现在,很多网络应用都需要对用户的身份进行验证。一个最简单的实现脚本可以如下:

〈?

$Password=“Secret”;

$Name=“admin”;

function VerifyPassword ($UserPassword, $UserName){

if ($Password=$UserPassword && $Name=$UserName){

return 1;

}

else { return 0;}

}

if (VerifyPassword (“foo1ish”,“admin”)){

print “The Password is correct”;

}

else {

print “I’m sorry, the password is incorrect”;

}

?〉

虽然在上述脚本中调用VerifyPassword函数时输入的是错误的密码,但是程序运行之后仍然会产生如下结果:

The Password is correct

问题可能会出现在任何地方,下面就让我们使用排除法一一检查。首先,我们很难确定脚本最后的“if”条件语句是否正确。虽然看上去好象是没有问题,但是为了确保程序正确无误,我们不能放过任何一个环节。因此,我们将该条件语句注释掉,同时按照前面介绍的方法对VerifyPassword()函数进行输出。具体如下:

〈?

$Password=“Secret”;

$Name=“admin”;

function VerifyPassword ($UserPassword, $UserName){

if ($Password=$UserPassword && $Name=$UserName){

return 1;

}

else { return 0;}

}

print “The result of VerifyPassword() is:”;

print VerifyPassword (“foo1ish”, “admin”);

/*if (VerifyPassword (“foo1ish”, “admin”)){

print “The Password is correct”;

}

else {

print “I’m sorry, the password is incorrect”;

}*/

?〉

因为我们使用了错误的密码,所以结果应当为0。但是程序运行之后,我们发现实际结果如下:

The result of VerifyPassword() is: 1

这样,我们就知道问题是出现在VerifyPassword()函数的身上。检查了一遍函数之后,我们怀疑问题可能出现在“if”语句中。所以我们屏蔽到VerifyPassword()函数中的条件语句,并进行如下输出:

print “UserPassword =〉 $UserPassword, Password =〉 $Password,”;

print “Password==UserPassword =〉 ”.(int)($Password==$UserPassword).“〈BR〉”;

print “UserName =〉 $UserName, Name =〉 $Name, ”;

print “Name==UserName =〉”.(int)($Name==$UserName).“〈BR〉”;

(说明:我们使用(int)($Password==$UserPassword)语句将比较结果转化为整数0或1)

程序修改之后的实际输出结果如下:

UserPassword =〉 foo1ish, Password =〉 , Password==UserPassword =〉 0

UserName =〉 admin, Name =〉 , Name==UserName =〉 1

I’m sorry, the password is incorrect

这里,我们可以清楚的看出Password和Name两个变量都是空值,也就难怪判断语句不起作用了。

那么为什么$Password为空值呢?我们在程序的开头部分就已经明确的对$Password变量进行了赋值,但是因为某种原其变量值无法带入到VerifyPassword()函数中。回想一下PHP语言关于变量作用域的规定,我们可以立刻找到出现问题的原因,那就是如果要想在函数中使用变量,必须将该变量声明为全局变量。知道了错误的根源之后,我们在VerifyPassword()函数的第一行加入以下语句,然后重新运行程序:

global $Password, $Name;

程序运行结果如下:

UserPassword =〉 foo1ish, Password =〉 Secret, Password==UserPassword =〉 0

UserName =〉 admin, Name =〉 admin, Name==UserName =〉 1

The Password is correct

为什么?按理说我们应当得到密码不正确的错误提示。再一次仔细检查遍程序之后,终于发现原来我们把逻辑运算符“==”误用成“=”,这样就把$UserPassword变量的值赋给了$Password变量。把最后的这两处错误改正过来之后,完成的程序如下:

〈?

$Password=“Secret”;

$Name=“admin”;

function VerifyPassword ($UserPassword, $UserName){

global $Password, $Name;

if ($Password==$UserPassword && $Name==$UserName){

return 1;

}

else { return 0;}

}

if (VerifyPassword (“foo1ish”, “admin”)){

print “The Password is correct”;

}

else {

print “I’m sorry, the password is incorrect”;

}

?〉

执行程序得到如下结果:

I’m sorry, the password is incorrect.

输入正确密码重新运行时,得到以下结果:

The Password is correct

这样,我们就成功的找到并解决了问题。希望大家能够从以上的介绍中领悟到查找错误时的一些方法和思路。

php案例纠错,PHP编程纠错指南相关推荐

  1. Matlab编程入门指南:简介、安装、学习路线和几十个编程案例分析。

    一.Matlab编程入门指南:简介.安装.学习路线和几十个编程案例分析. 1.Matlab编程语言是一种广泛应用于科学计算.工程计算.数据分析.统计分析.信号处理等领域的高级数值计算和数据可视化软件. ...

  2. Java多线程编程实战指南

    内容简介 随着CPU 多核时代的到来,多线程编程在充分利用计算资源.提高软件服务质量方面扮演了越来越重要的角色.而解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案.然而,多线程编 ...

  3. Java多线程编程实战指南+设计模式篇pdf

    下载地址:网盘下载 随着CPU 多核时代的到来,多线程编程在充分利用计算资源.提高软件服务质量方面扮演了越来越重要的角色.而 解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案.然 ...

  4. 多模型结合的等长拼写纠错 | 全国中文纠错大赛冠军方案

    每天给你送来NLP技术干货! 来自:达观数据 点击这里进群->加入NLP交流群 参与任务  DATAGRAND 中文拼写检查任务是中文自然语言处理中非常具有代表性和挑战性的任务,其本质是找出文本 ...

  5. 林世霖. linux环境编程图文指南,linux环境编程图文指南

    linux环境编程图文指南是一本linux编程环境配置指南,由林世霖.钟锦辉和李建辉三人共同编著.本书定位Linux环境编程入门与提高,全书拥有近400余幅案例图表,200多篇源代码,作者很多编程初入 ...

  6. MATLAB 编程风格指南

    MATLAB 编程风格指南      --Richard  Johnson  Version 1.5,Oct.  2002  版权: Datatool 所有  翻译:Genial @ USTC &qu ...

  7. 《CUDA C编程权威指南》——1.5节总结

    本节书摘来自华章社区<CUDA C编程权威指南>一书中的第1章,第1.5节总结,作者[美] 马克斯·格罗斯曼(Max Grossman) ,更多章节内容可以访问云栖社区"华章社区 ...

  8. 《C语言编程初学者指南》一2.9 理解运算符优先级

    本节书摘来自异步社区<C语言编程初学者指南>一书中的第2章,第2.9节,作者[美]Keith Davenport(达文波特) , M1ichael Vine(维恩),更多章节内容可以访问云 ...

  9. 《C语言编程初学者指南》一1.5 使用程序语句

    本节书摘来自异步社区<C语言编程初学者指南>一书中的第1章,第1.5节,作者[美]Keith Davenport(达文波特) , M1ichael Vine(维恩),更多章节内容可以访问云 ...

最新文章

  1. python学习-Django (3)
  2. html表单文本框怎么输出函数值,如何获取用户输入的html文本表单字段传递给javascript函数的值?...
  3. oracle本身的常用数据字典表
  4. DevExpress的TextEdit、RadioGroup、ColorPickEdit设置默认值
  5. 《编程之美》(Java实现) :让CPU占用率画直线和正弦曲线(Java实现)
  6. 利用MS17-010渗透win7(64位)
  7. python三角形判断白盒测试的代码_进化的测试 软件测试,自动化测试,白盒测试,Python...
  8. 5个IO口实现25个按键的扫描,他做到了!堪称一绝!
  9. 4、Kafka常见问题
  10. Spring的Bean属性依赖注入
  11. 二值图像--形态学处理4 击中,边界提取,孔洞填充,连通分量提取,凸壳,细化,骨架,形态学重建...
  12. 【图像拼接】基于matlab Harris角点检测图像拼接【含Matlab源码 517期】
  13. Sophix介绍与实践
  14. cassandra 避免 allow filter 提升性能的方法
  15. html代码中font是什么意思,HTML元素font标签的使用方法及作用
  16. 解决git 提交报fatal: unable to access ' ': The requested URL returned error: 403 错(亲测可行)
  17. 科罗拉多大学波尔得分校计算机科学,科罗拉多大学波尔得分校计算机科学本科专业-(20页)-原创力文档...
  18. java软连接_硬链接和软连接
  19. 局域网对战平台 linux,在Linux下可用Wine安装和运行腾讯对战平台、5E对战平台
  20. 串口调试助手(CM野人版)4.0有严重Bug,已经跟作者反应,等候更新

热门文章

  1. au如何关闭预览编辑器_在线IDE开发入门之从零实现一个在线代码编辑器
  2. struct对象可能分配在托管堆上吗
  3. mysql having的用法
  4. Java学习笔记(二)Java基本语法
  5. MAC 系统下允许NTFS磁盘读写
  6. linux stat 命令查看文件信息
  7. Node.js:清理项目中的依赖
  8. 业务运维:站在企业转型风口上的云智慧
  9. POJ 3481 treap
  10. java开发_读写txt文件操作