

PHP调试程序流程,常见错误地方举例,开启与屏敝apache服务器错误日志,字符集导致乱码的可能
20.1 基本调试流程
判断错最可能出现的环节——分析出错的原因——查找错误根源——对错误的代码备份后直接修改——改后再测试
一些方法:增加中间变量,删除一些变量调试,一段一段的注释掉部分代码再调试
20.2 PHP中的错误类型
1) 语法错误
a. 没有结束符,例:echo "www.mrbccd.com" //当下面还有行又没有以分结尾会出错,如果只有一行可以不输分号
注:对提示的出错行不一定正确,要联系查看上下行
b. 少了结束单双引号,例:echo "www.mrbccd.com ;
c. 缺少括号,例:
$a=100 //这里缺分号
if $a=100 { //这里缺括号,if ($a=100)
echo "明日编程词典";
}
d. 缺少$引起的语法错误
for( $i=1; $i<11, i++) { //i++改为$i++
echo $i."<br>";
}
2) 语义错误
$str="PHP编程词典";
$url="www.mrbccd.com";
echo $str+$url; //字符串不能加,PHP的字符连接符是点
3) 逻辑错误,最难发现在错误,没有任何提示信息,就是程序的功能没有实现
例:如商城普通用户不打拆,会员打85拆
if($user="普通用户") {
$price=485*1; //普通用户就不打拆
}
if(user="会员") {
$price=485*8.5; //会员打85拆,应该是乘0.85或除以10,如:485*0.85
}
4) 注释错误
注释到错误的位置,别人看不懂
5) 运行错误
include("menu.php"); //调用了一个不存在的文件
出现不符法则的运算
20.3 PHP的基本调试策略
1) 修改windows下的PHP.ini文件开启服务器的错误处理机制,改后要重启服务器
display_errors = on/of //打开与关闭调试
error_reporting = E_ALL //显示所有出错信息
error_reporting = E_ALL &~E_NOTICE //只显示重要的出错提示信息
注:调试完关闭,避免浏览者看到错误
2) 使用print语句打印出错的地方以调试程序,验证数据信息,
if($_POST[Submit]=="搜索") {
$key=$_POST[txt_key]; //获取文件框的值
print $key; //打印获取的值,当不知道信息获取还是没获取到可先打印出来
}
3) 应用@前缀字符屏蔽PHP脚本错误信息 //也就是不显示错误提示
调用函数时加前缀屏蔽错误信息
$file="book.php";
@fread($file) or die("文件读取失败!"); //当打不开文件时,也不会弹出文件读取失败
fclose($file);
echo "我不能被输出了";
4) 使用错误处理器记录日志
好处是可以不把内部的错误的信息显示给访问者,但又能记录出错的信息写到指定的日志文件中好便于维护
要改php.ini文件,将;error_log=syslog去掉前面的分号改为error_log=system logger
例1:
function err_log($error,$error_str) {
$file="php_error.log";
if(filesize($file)>1024) { //如果日志文件大于1024K
rename($file,$file.(string)time()); //以时间为准绳对日志文件重命名
clearstatcache(); //清除文件状态缓存
}error_log($error_str,0,$file); //将出错信息记录到管理员指定路径
}
set_error_handler(err_log'); //执行自定义函数log_roller()函数
trigger_error(time).":程序报错.\n"); //发出错误信息
restore_error_handler(); //重新编译这个预错处理函数
//日志文件一般保存在web目录
20.4 解决数据库乱码问题
1) 有时输出mysql数据库数据出现乱码,原因是操作数据库使用的字符编码格式与创建数据库使用的编码格式不一致
如:创建数据库是gb2313_chinese_ci,那么连接数据时也要指定这种编码格式
mysql_query("set names gb2312"); //设置编辑格式
注:用phpMyAdmin新建数据库时一定要指定编码格式,