2010-09-01 208 views
3

我目前正在研究這個項目,該項目需要我製作一個函數,它可以通過dinamically來確定目錄名稱,然後在該目錄中創建一個簡單的.txt文件。爲什麼fopen()表現得像這樣?

我的代碼如下: ($ destinatario是一個字符串)

 $diretorio="../messages/".$destinatario; 
if (is_dir($diretorio)) { 
    ; 
}else{ 
    mkdir($diretorio); 
} 
$path=$diretorio."/".$data.",".$assunto.",".$remetente.".txt"; 
$handle=fopen($path,'w+'); 

fwrite($handle, $corpo); 

fclose($handle); 

沒關係葡萄牙人,但底線是,它應該用我提供的命名指南創建一個.txt文件。有趣的是,當我這樣做時,PHP創建了這個奇怪的文件,其文件名是「01.09.2010 04」 (根本沒有擴展名),這相當於我想要創建的實際文件名的前幾個字符。 ..

編輯($的數據實際上是調用日期(輸出「DMY H:我」))

+0

爲什麼路徑中有逗號?我可以想象問題在於他們。 – slikts 2010-09-01 08:00:07

+2

所以'$ data'包含'01.09.09.2004',並且之後沒有逗號? 如果你在$ handle之前粘貼'echo $ path;',你會得到什麼? – Lekensteyn 2010-09-01 08:00:23

+2

您確定您的$路徑不包含任何非法字符,例如換行符? – Select0r 2010-09-01 08:01:55

回答

4

comment by OP

[$數據是]實際上迄今爲止的呼叫的輸出( 「d.m.Y H:I」​​)

的問題是:字符。(不過,有可能是合成的最後文件名其他地區的非法字符。)


編輯
問題和解決方案的實質是在評論@tchen's answer。請記住,冒號是(some?all?)* nix平臺上的有效文件名字符,但在Windows上無效。

+0

+1這真的很有意義。您可能還想使用白名單篩選文件名中的字符(刪除,除非列出) – Lekensteyn 2010-09-01 08:17:07

+0

@Lekensteyn確實。或許甚至與製作「網址友好」標題時採用的策略相同,參見例如http://stackoverflow.com/search?q=php+url+replace – jensgram 2010-09-01 08:21:42

0

沒有關係,但要確保你的if語句沒有未使用的條件:

if (!is_dir($diretorio)) { 
    mkdir($diretorio); 
} 

這也將擺脫空單行與單個終結者;,我敢肯定,這是不正確的。

0

一些想法:

  • 你嘗試不使用逗號的文件名?
  • 你檢查了fopen和fwrite的返回值嗎?

只是爲了嘗試找出問題

你也可以簡化爲:

if (!is_dir($diretorio)) { 
    mkdir($diretorio); 
} 
1

確保有在$數據到底有沒有壞字符。調用trim()。

如果它是從文件中提取的數據,它可能在其末尾有'\ r'或'\ n'。

+1

它實際上是迄今爲止的調用輸出(「d.m.Y H:i」) – 2010-09-01 08:08:11

+1

@Felipe Almeida然後'''是問題。 – jensgram 2010-09-01 08:10:09

+0

@jensgram良好的調用,:在Windows上是非法的(但不是Linux)。令人驚訝的是,fopen()只是將您的路徑切換爲非法字符而不是返回錯誤。或者說,這是一個PHP的主題? – tchen 2010-09-01 08:12:32