2012-05-07 42 views
2

我有奇怪的錯誤,其中在下面的代碼,其中所述基名()完成後除去$filePHP基名()除去變量,奇效

$files = glob(DIR_APPLICATION . 'controller/module/*.php'); 

if ($files) { 

    foreach ($files as $file) { 

     $extension = basename($file, '.php'); 
     print($file).'<br />'; 

當調試運行,如果我添加上述print()代碼basename它按預期工作。如果我在它下面添加它,完全刪除$file

這可能是什麼原因?

if ($files) { 

    foreach ($files as $file) { 

     echo $file . '<br />'; 
     var_dump($file); 
     echo '<br />'; 
     $extension = basename($file, '.php'); 
     var_dump($file); 
     echo '<br /><br />'; 

PHP版本5.3.10

+1

什麼'的var_dump($文件);'之前和之後的'basename'節目? – zerkms

+0

@zerkms這表明它是一個字符串(63),而 –

+1

之後什麼也沒有定義「請求」。同時顯示2個變量的**確切輸出**,因爲它在您的屏幕上。 – zerkms

回答

1

var_dump給出了不同的長度爲你的字符串比它顯示了人類可讀的字符數(具體來說,每個長度比通常應該大6)。

這意味着你的路徑名包含多字節字符,而basename的文件說

基本名()是語言環境感知,所以它才能看到正確的基本名稱與 多字節字符路徑,匹配的語言環境必須可以使用 setlocale()函數進行設置。

因此,要解決這個問題,我建議:

  1. 使用bin2hex或類似地看到,彌補每個路徑的所有字節序的東西;這會告訴你路徑名中的哪些字符不是單字節。 6字節的差異意味着它的可能將會是三個字符,所以我的心理能力告訴我,www可能不完全是它的樣子。

  2. 如果可能,重命名違規目錄以使路徑爲單字節字符串,並自動解決問題。

  3. 如果上述是不可能的,則:

    一個。找出什麼編碼返回的路徑在

    b。編寫你自己的實現basename,它使用多字節字符串函數,並將它們傳遞給編碼。

2

似乎沒什麼問題:

<?php 
$file = '/path/to/some/file.php'; 
var_dump($file); 
var_dump(basename($file, '.php')); 
var_dump($file); 

string(22) "/path/to/some/file.php" 
string(4) "file" 
string(22) "/path/to/some/file.php" 

http://codepad.org/E9Nb1SUG

+0

是的,這對我來說在過去已經有好幾百次了,但現在還沒有。 –

2

你可以通過添加這一條線上您的代碼是否正常工作與否的頂部檢查..

echo basename('/home/shop/www/admin/controller/module/cloudbackup.php', '.php'); exit;