我有一个日志方法,它保存到一个名称与调用它的脚本相同的文件,只有大写第一个字母,有时可以工作,但其他时候大写第二个字母(我看不到任何模式)至于什么时候它做什么,但它始终是一致的,这意味着文件A将始终是初始上限或第二个字母上限,它不是任意的)。
这是我的代码......
function logData($str){
$filePath = $_SERVER["SCRIPT_FILENAME"];
$dir = substr($filePath, 0, strrpos($filePath, "/") + 1);
$fileName = substr($filePath,strrpos($filePath, "/")+1);
$fileName = preg_replace('/\w+$/','log',$fileName);
$fileName = ucfirst($fileName);
$fHandle = fopen( $dir.$fileName , "a");
$contents = fwrite($fHandle, $str ."\n");
fclose($fHandle);
}
是否有人对某些原因造成如此奇怪的行为有什么想法?
我知道我可以在第一个字符串上使用strtoupper强制它,然后追加其余的字符串,但我真的很想知道我在这里做错了什么(如果有的话)。
答案 0 :(得分:1)
这可能是代码中的一个错误,您可以在其中计算$ dir和$ filename。如果路径有斜杠......可能解决方案是。
if (strpos('/', $filePath) === false) {
$dir = '';
$fileName = $filePath;
} else {
$dir = substr($filePath, 0, strrpos($filePath, "/") + 1);
$fileName = substr($filePath,strrpos($filePath, "/")+1);
}
但是回应那些价值并在那里集中
答案 1 :(得分:0)
在大写第一个字母之前,您可以强制保留文件名。也就是说,如果您关心的只是将第一个字母大写。
$fileName = ucfirst(strtolower($fileName));
答案 2 :(得分:0)
关于ucfirst的文档,它说(我强调):
返回str格式化的第一个字符的字符串(如果是) 字符是字母。
根据您执行此脚本的位置SCRIPT_FILENAME
将返回不同的结果。是否有可能从不同的路径执行脚本,从而为SCRIPT_FILENAME提供相对路径?
为了测试这个理论,我从一些可能的执行路径运行下面的脚本,并看到可能的示例包括前缀“./”和“/”,它们可能不会被视为具有字母第一个字符。
<?php
error_reporting(E_ALL);
echo $_SERVER["SCRIPT_FILENAME"];
?>