在sql连接工具中,sql执行异常时,自动记录sql,以及返回的错误消息。
每次先读取原记录,再把新记录从文件头添加到原记录中。
如果文件行数太多,直接截取一半(使用 substr_count 计算换行符 \n 的数量)
保存新记录到文件。
//debug状态下记录错误sql
$debug_file_name = BP3_ROOT . '/log/errorsql/0000_debugSql_latest.log';
$errMsg = "SQL:".$sql.PHP_EOL."MSG:".$msg.PHP_EOL."TIME:".date("Y-m-d H:i:s").PHP_EOL.PHP_EOL;
if(file_exists($debug_file_name)){
$errMsg = $errMsg.file_get_contents($debug_file_name);
//每超过多少行,就保留一半(防止文件变得越来越大)
$line = substr_count($errMsg,"\n");
if($line>200){
$errMsg = substr($errMsg,0,strlen($errMsg)/2);
}
}
file_put_contents($debug_file_name,$errMsg);
方法二:写到php文件中
写在php文件中,好处是不能直接下载(即使暴露外网地址),但因为存在在字符串变量,会把 ‘ 转换为 \’ ,不太友好。
//debug状态下记录错误sql(使用php文件,禁止用户下载)
$debug_file_name = BP3_ROOT . '/log/errorsql/0000_debugSql_latest.php';
if(file_exists($debug_file_name)){
$errMsg = require($debug_file_name);
if(count($errMsg)>100){
$errMsg = array_slice($errMsg,0,50);
}
}
$errMsg = $errMsg ?: array();
array_unshift($errMsg,array(
'SQL:'=>$sql,
'MSG:'=>$msg,
'TIME'=>date("Y-m-d H:i:s")
));
$errMsgText = '<?php return ' . var_export($errMsg, true) . ';';
file_put_contents($debug_file_name,$errMsgText);
方法三:综合以上两种,仍为 php 文件,直接在文件头加 die;。
仍然是php文件,但是只有 die 的作用,格式是普通文本:
//debug状态下记录错误sql
$debug_file_name = BP3_ROOT . '/log/errorsql/0000_debugSql_latest.php';
$errMsg = "SQL:".$sql.PHP_EOL."MSG:".$msg.PHP_EOL."TIME:".date("Y-m-d H:i:s").PHP_EOL.PHP_EOL;
if(file_exists($debug_file_name)){
$errMsg = $errMsg.file_get_contents($debug_file_name);
//每超过多少行,就保留一半(防止文件变得越来越大)
$line = substr_count($errMsg,"\n");
if($line>200){
$errMsg = substr($errMsg,0,strlen($errMsg)/2);
}
}
$cus_head = "<?php die;?>"; //每次在文件头带上die;,禁止通过url访问该页面
$errMsg = $cus_head.PHP_EOL.$errMsg.PHP_EOL;
file_put_contents($debug_file_name,$errMsg);
方法四:给log目录设置密码保护。
php不能在代码中保护text,log目录,但可以给站点设置权限。
或者不把根目录作为站点的运行目录。
这种方法适合权限高的应用,一劳永逸,对于虚拟主机等就还是方法3比较好(方法二源码中显示\’,改进方向:配合程序直接在html中显示,则在页面中不会显示转移字符)。
本篇完,还有疑问?留下评论吧