2012-02-15 61 views
0

我創建了一個小腳本,用於打開文本文檔,每次用戶打開特定頁面時都會增加一個數字,並將新數字寫入文檔的下一行。我希望腳本能夠讀取文檔的最後一行並增加該數字。目前,它繼續查看第一行並增加輸入的第一個數字。PHP fopen腳本讀取線

function job_number_script(){ 
    $job_data = ""; 
    $user_info = $_SESSION['user_info']; 
    $user_id = $user_info['user']['id']; 
    $job_id = ""; 
    //Initialize the return 
    $job_number_page = ("job_setup.txt"); 
    $job_number = file($job_number_page); 
    $work = explode(",",$job_number[0]); 
    $work[0]++; 
    $job_id = $work[0]++; 
    $work2 = array($job_id, $user_id); 
    $works = implode(",",$work2); 
    $fp = fopen($job_number_page, "a+"); 
    fputs($fp, "$works\n"); 
    fclose($fp); 
    $job_data = $job_id; 
    return $job_data; 
} 

回答

1

一種方式可能是因爲你剛剛替換$所有出現的[0]工作以$工作[計數($工作)-1]。

+0

我實際上不得不編輯$ job_number,但是這個工作以及謝謝! – PlatiNUM 2012-02-15 14:34:38

1

您可以嘗試使用file()讀每一行到一個數組:直接用幾個PHP函數,fseek()ftell()fgetc()fgets()(腳本的第一部分將

$lines = file($job_number_page); 
$lines[count($lines)-1]++; 
$data = implode("", $lines); 
// write data to file again 
file_put_contents($job_number_page, $data); 
+0

感謝這工作! – PlatiNUM 2012-02-15 14:33:48

1

你可以這樣做只是設置文件指針到最後一行):

$fp = fopen('file.txt', 'a+') or die('Failed to open file: file.txt'); 

// Way 1 
fseek($fp, SEEK_END, 0); // Go to the end of file 
$max = ftell($fp); // Get max/end position 
for($i = $max-1; $i >= 0; $i--){ 
    fseek($fp, $i, SEEK_SET); 
    if(fgetc($fp) == "\n")){ 
     break; 
    } 
} 

// Way 2 
$length = 0; 
while(($row = fgets($fp)) !== false){ 
    $length = strlen($row); 
} 
fseek($fp, -$length, SEEK_CUR); 

現在你有文件指針指向最後一行的開頭,現在你需要閱讀的最後一行和移動文件回能重寫它。

$pos = ftell($fp); 
$line = trim(fgets($fp)); 
fseek($fp, $pos, SEEK_SET); 

現在遞增,改寫並保存:

fwrite($fp, $line+1); 
fclose($fp); 

我嚴格建議使用flock()這樣的:

$fp = fopen('file.txt', 'a+') or die('Failed to open file: file.txt'); 
if(!flock($fp, LOCK_EX)){ 
    fclose($fp); 
    die('Cannot get exclusive lock: file.txt'); 
} 

// The code mentioned above 
flock($fp, LOCK_UN); 
fclose($fp); 

注:上面的例子中(與fwrite($fp, $line+1))只有在你寫等於或者更長的「字符串」時纔有效長度,如果你需要寫更短的字符串,你需要使用ftruncate()