2011-06-14 34 views
2

我想讓我的用戶下載一個.php文件。用PHP在文件中插入行

每個文件都有不同,從一個用戶到另一個:
在#20行我定義一個變量等於用戶ID。

這樣做,我試過這個:複製原始文件。閱讀它直到19行(fgets),然後fputs PHP行,然後提供文件下載。

問題是,行不會在第19行後面插入,但會在.php文件的末尾插入。這裏是代碼:

if (is_writable($filename)) { 

    if (!$handle = fopen($filename, 'a+')) { 
     echo "Cannot open file ($filename)"; 
     exit; 
    } 

    for ($i = 1; $i <= 19; $i++) { 
     $offset = fgets($handle); 
    } 

    if (fwrite($handle, $somecontent) === FALSE) { 
     exit; 
    } 

    fclose($handle); 
} 

你會怎麼做?

回答

1

fopen()中的追加模式+a將句柄的指針放在文件的末尾。你的fgets()循環將失敗,因爲在文件末尾沒有剩下要讀的東西。你基本上做了19個沒有操作。按照預期,您的fwrite會在文件末尾輸出新值。

要做你的插入,你需要rewind()開始的句柄,然後做你的fgets()循環。

但是,如果你只是想讓人們得到這個修改後的文件,爲什麼還要打開「打開文件,掃描,寫入更改,提供文件」?這會在您的系統上留下大量近似重複的內容。更好的方法是將文件分割成兩個部分,然後你可以做一個簡單的:

readfile('first_part.txt'); 
echo "The value you want to insert"; 
readfile('last_part.txt'); 

從而節省您不必保存每次的「新」文件。這也將允許任意長度的插入。您的fwrite方法可能會丟棄文件的後續部分。例如掃描以偏移「10」並寫出4個字節,它將替換原始文件中該位置的原始4個字節。在某些時候,它可能會變成5個字節的輸出,現在你已經在原始文件中丟棄了一個字節,並且可能有一個損壞的文件。

+0

你是男人。非常感謝 – Cystack 2011-06-14 14:49:15

1

a +模式意味着:

'a +'開放閱讀和寫作;將文件指針放置在文件的末尾。如果文件不存在,請嘗試創建它。

你可能想R +

'R +' 開放式閱讀和寫作;將文件指針放在文件開頭。

+0

該死的效果更好,但仍然:它寫在正確的地方,但每個新的字符擦除一個較舊的一個Oo,而不是實際插入它(編輯:好吧,我需要允許空間我的fwrite) – Cystack 2011-06-14 14:45:32

1

將你想要的代碼放在一個字符串變量中。在你想要自定義代碼的地方,你會有%s。之後,只需使用php MIME類型進行響應。

例如;

$phpCode = "if (foo == blah) { lala lala + 4; %s = 5; }", $user_specific_variable; 
header('Content-type: text/php'); 
echo $phpCode; 

瞧。

注意:也許mime類型不正確,我在這裏談論我的屁股。

+0

這個腳本很長,我不知道把它作爲一個字符串放在一個變量中是否巧妙。 – Cystack 2011-06-14 14:51:59

+0

然後把它從一個文件加載到一個變量中並在完成後取消設置。比在硬盤上寫乘法時間要快得多。 – Popara 2011-06-14 16:32:57

0

我認爲,不要在「a +」模式下打開文件,而應該在「r +」模式下打開文件,因爲「a」總是附加到文件中。但我認爲寫作會覆蓋您當前的數據。所以,這個想法是,你需要緩衝文件,從你打算寫入EOF的地方開始。然後添加你的行,然後加上你緩衝的內容。

另一種方法可能是在PHP文件中保留一些模式,如######。然後您可以: 1.複製原始PHP腳本 2.使用file_get_contents() 將完整的PHP腳本讀入單個變量,例如$ fileContent 3.使用str_replace()函數替換###### in $ fileContent with desired User ID 4.以「a」模式打開復制的PHP腳本並將$ fileContent重寫爲它。