2

我有一个日志方法,它保存到一个与调用它的脚本同名的文件中,只有第一个字母大写,有时有效,但其他时候第二个字母大写(我看不到任何关于何时它做了什么,但它始终是一致的,这意味着文件 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 强制它,然后附加字符串的其余部分,但我真的很想了解我在这里做错了什么(如果有的话)。

4

3 回答 3

1

这可能是代码后面的一个错误,您可以在其中计算 $dir 和 $filename。如果路径有斜线或没有...一个可能的解决方案是 .

if (strpos('/', $filePath) === false) {
    $dir = '';    
    $fileName = $filePath;
} else {
    $dir = substr($filePath, 0, strrpos($filePath, "/") + 1);    
    $fileName = substr($filePath,strrpos($filePath, "/")+1);
}

但是将这些价值观呼应出来并集中在那里

于 2012-06-20T02:29:37.747 回答
0

您可以在首字母大写之前强制将文件名小写。也就是说,如果您所关心的只是将第一个字母大写。

$fileName = ucfirst(strtolower($fileName));
于 2012-06-20T02:16:08.333 回答
0

ucfirst的文档中它说(我强调):

如果 str 的第一个字符是字母,则返回一个字符串。

根据您执行此脚本的位置,SCRIPT_FILENAME将返回不同的结果。您是否有可能从不同的路径执行脚本,从而为 SCRIPT_FILENAME 提供相对路径?

为了测试这个理论,我从您的一些可能的执行路径中运行了下面的脚本,并看到可能的示例包括前缀“./”和“/”,它们可能不被视为具有字母首字符。

<?php
error_reporting(E_ALL);
echo $_SERVER["SCRIPT_FILENAME"]; 
?>
于 2012-06-20T02:43:04.387 回答