2011-09-30 174 views
1

我想通過AJAX使用php調用來替換一個.txt文件的單行,其中存儲了用戶特定的信息。問題是,如果我一旦使用fwrite進入正確的行,它就會留下任何先前的信息,這些信息比最後未更改的信息長。有沒有簡單的方法來清除.txt文件中的一行,我可以先打電話給php? 發生了什麼事情的例子 - 比方說,我正在存儲最喜歡的作曲家,並且一個用戶在他們的.txt文件中有「Beethoven」,並且當我用「Mozart」將fwrite改寫爲「Mozart」時, 「,我正在把」莫扎特文「作爲新的路線。我在fopen調用中使用「r +」,因爲我只想一次替換一行。使用php替換一個.txt文件的單行使用php

+8

這就是我們使用數據庫的原因。 – ceejayoz

回答

0

這是我前段時間從文件中刪除行的代碼,它必須修改。另外,如果新線比舊線短,它將正常工作,對於更長的線,將需要進行重大修改。

關鍵是第二個while循環,其中更改後文件的所有內容都被重寫到文件中的正確位置。

<?php 
$size = filesize('test.txt'); 
$file = fopen('test.txt', 'r+'); 
$lineToDelete = 3; 
$counter = 1; 

while ($counter < $lineToDelete) { 
    fgets($file); // skip 
    $counter++; 

} 

$position = ftell($file); 
$lineToRemove = fgets($file); 
$bufferSize = strlen($lineToRemove); 
while ($newLine = fread($file, $bufferSize)) { 
    fseek($file, $position, SEEK_SET); 
    fwrite($file, $newLine); 
    $position = ftell($file); 
    fseek($file, $bufferSize, SEEK_CUR); 

} 
ftruncate($file, $size - $bufferSize); 
echo 'Done'; 
fclose($file); 
?> 
1

如果此配置數據不需要提供給非PHP應用程序,可以考慮使用var_export()代替。它基本上是var_dump/print_r,但輸出變量作爲可解析的PHP代碼。這將您的代碼降低到:

include('config.php'); 
$CONFIG['musician'] = 'Mozart'; 
file_put_contents('config.php', '<?php $CONFIG = ' . var_export($CONFIG, true));