PHP 程序员的调试技术小结(2)


php_flag display_errors on
php_value error_reporting 2039


这会覆盖在 php.ini 文件中为 display_errors 已经设置的标志,以及 error_reporting 的值。值 2039 代表 E_ALL & ~E_NOTICE。如果愿意采用 E_ALL,请把值设为 2047。同样,还是要重启 Apache。
接下来,要在服务器上测试错误报告。
测试错误报告
如果启动了错误报告,会节约许多时间。PHP 中的错误会指向代码中的错误。请创建一个简单的 PHP 文件 test.php,并像清单 1 所示一样定义它。
清单 1. 一个生成错误的简单 PHP

复制代码 代码如下:


<?php
print("The next line generates an error.<br>");
printaline("PLEASE?");
print("This will not be displayed due to the above error.");
?>


第一个 print() 语句会向 Web 浏览器显示它的内容。但是第二个语句会生成错误并在 Web 页面上显示。这造成最后一个 print() 语句不起作用,如图 1 所示。
图 1. 生成错误

生成错误


现在开启了错误报告!接下来,用 print 语句帮助调试应用程序。
介绍 print 语句
因为应用程序中的功能性 bug 不会产生错误,所以在所有调试策略中,关于如何正确地放置和使用 print 或 die 语句来调试 PHP 应用程序的知识是一种很好的资产。可以用 print 语句在代码中缩小对问题语句的定位,这些语句在语法上没有错误,也不是 bug,但是从代码的功能上看是 bug。这些是最难发现和调试的 bug,因为它们不会抛出错误。惟一知道的就是在浏览器上显示的内容不是想要的内容,或者想要保存在数据库中的内容根本没有保存。
假设正在处理通过 GET 请求发送过来的表单数据,想向浏览器显示信息,但是出于某种原因,数据没有正确地提交,或者不能正确地从 GET 请求中读出。要调试这类问题,重要的是用 print() 或 die() 语句知道变量的值是什么。
die() 语句会中止程序执行,并在 Web 浏览器上显示文本。如果不想注释掉代码,而且只想显示到出错之前的信息和出错信息,不想显示后面的信息,那么 die() 语句特别有用。
让我们在 PHP 中用 print 语句来测试这个概念
使用 print 语句进行调试
在我作程序员的那些时候,当我在 Linux® 上开发应用程序时,没有方便的 GUI 可以告诉我 bug 在哪,我迅速地发现我在程序中放的 print 语句越多,我在应用程序中把 bug 的范围缩小到一行的机会越大。请创建另一个 PHP 文件 test2.php,并像清单 2 所示的那样定义它。

清单 2. 显示通过 GET 提交的所有变量

复制代码 代码如下:


<?php
$j = "";
print("Lets retrieve all the variables submitted to this ");
print("script via a GET request:<br>");
foreach($_GET as $key => $i){
print("$key=$j<br>");
}
if($_GET['Submit'] == "Send GET Request")
$j = "done!<br>";
?>
<form method="GET">
Name: <input><br>
Email: <input size="25"><br>
<input type="submit" value="Send GET Request">
</form>


您可能会非常容易地发现清单 2 中的 bug!您很棒!但请注意这是一个非常简单的脚本,只是作为使用 print 语句进行调试而展示的一个例子而已。这个脚本只是提取 GET 请求中的所有变量,如果有,就把它们显示在浏览器上。还提供了一个表单,用 GET 请求向服务器发送变量以进行测试。请看输出,如图 2 所示。
图 2. test2.php 的输出

test2.php 的输出


现在单击 Send GET Request 按钮,请注意只有 $_GET 请求的键显示在浏览器上,而正确的值都没显示。可以在循环中放一个 print 语句,检验在 foreach 循环中每个元素中是否确实存在数据。请参阅清单 3。
清单 3. 用 print 语句验证代码的功能

复制代码 代码如下:


...
foreach($_GET as $key => $i){
print("Correct data? " . $_GET[$key] . "<br>");
print("$key=$j<br>");
}
...


放进去的 print 语句是粗体。注意,现在已经知道在 Web 浏览器上显示的 $key 值是正确的,但是由于某些原因,值没有正确地显示。请看新的输出,如图 3 所示。
图 3. 修改后的 test2.php 的输出

修改后的 test2.php 的输出


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/64be6bc759072d58836690a9d05835ab.html