2014-03-24 253 views
1

我想知道是否有辦法檢查文件名是否存在,然後在它後面添加一個數字,我知道這一點 - 在基本的情況下是可能的,所以如果有人這樣做,它會添加之後它1檢查文件名是否存在

但你如何得到它來檢查是否有人做了不止一次?所以第一次它會添加一個1然後一個2然後一個3等?

$title = $_POST['title']; 
$content = $_POST['content']; 
$compile = $title. "\r\n" .$content; 
$content = $compile; 
$path = "../data/" .md5($title). ".txt"; 
$fp = fopen($path,"wb"); 
fwrite($fp,$content); 
fclose($fp); 

$con=new mysqli("###","###_public","###","###"); 
if (!($stmt = $con->prepare("INSERT INTO `blog_posts` (`post_title`,`post_content`,`post_date`) VALUES (?,?,?)")) || !is_object($stmt)) { 
    die("Error preparing: (" .$con->errno . ") " . $con->error); 
} 
$stmt->bind_param('sss', $_POST['title'], $path, $_POST['date']); 
if($stmt->execute()) { 
    echo "Successfully Posted"; 
} else { 
    echo "Unsuccessfully Posted"; 
} 
    $stmt->close(); 

感謝所有幫助提前

+0

在'while'循環中? – putvande

+0

PHP有一個內置的函數檢查一個文件是否存在 - ['file_exists()'](http://php.net/file_exists) –

+0

爲什麼不等到你運行你的'insert'之後再簡單地使用unique 'blog_posts'的id作爲文件名,這樣你就知道它是唯一的,並且很容易檢索文件。 – Pitchinnate

回答

1

總的想法是這樣的:

$basefilename = "somefile"; 
$filename = $basefilename; 
$i = 0; 
while(file_exists("../data/".$filename.".txt") $filename = $basefilename.(++$i); 

適應需要。

1

您可以使用這樣的事情:

<?php 
if(file_exists($filename)) { // check if the file exists in the first place 
    $i = 1; 
    while(file_exists($filename.$i)) { // check if the filename with the index exists. If so, increase the $i by 1 and try again 
     $i++; 
    } 
    rename($filename, $filename.$i); // rename the actual file 
} else { 
    // file did not exist in the first place 
} 
+0

這幾乎是我以前用它來做的,但它有點違背了兩個'file_exists'調用的DRY;) –

0
  1. 不要在文件名的末尾添加字符串 - 你最終會 很快打到OS文件名長度的限制。如果字符串變得太大,您也將失敗 以識別最後添加的數字 - 您必須從頭開始解析所有數字。
  2. 使用glob()來搜索文件名。
  3. 解析在最後找到的號碼的文件名並增加 該號碼。
  4. 使用rename()上的文件名並檢查返回狀態爲 避免競速狀況。
  5. 通常避免這種情況 - 使用數據庫或其他支持原子操作的系統。