2011-10-13 13 views
0

我有一個腳本來計算從互聯網下載的文件的下載次數。基本上它有一個日誌文件,每次下載文件時都會添加一行文本。用php增加一個文件第一行的數字1用php

我想稍微修改它,以便第一行是一個數字,每一個文件被下載一次由一個增加了數(所以很容易,看看究竟有多少人下載了它。)

這是我現在所擁有的代碼(這是不工作):

$conten = @file_get_contents(LOG_FILE); 
//First line: $conten[0]; 

$content = fgets($conten); 

$fo = @fopen(LOG_FILE, 'r+'); 
if ($fo) { 
    $content++; 
    @fputs($fo, ".$content."); 
    @fclose($fo); 
} 


$f = @fopen(LOG_FILE, 'a+'); 
if ($f) { 
    @fputs($f, date("m.d.Y g:ia")." ".$_SERVER['REMOTE_ADDR']." ".$fname."\n"); 
    @fclose($f); 
} 

的$ F部分工作正常......這是上面這些工作不喜歡我想要的部分。

謝謝!

+1

$ fo部分不能正常工作? –

+1

爲什麼不把計數存儲在一個單獨的文件中,所以你不必每次下載都重寫整個日誌? –

+0

謝謝Nick ODell !!我只是這樣做:) – Mako

回答

2

file_get_contents()將ENTIRE文件吸收到字符串中。然後你嘗試在這個字符串上做一個fgets(),這是不正確的 - fgets()在文件句柄上工作,而不是字符串。 如果你不是用@從不是一個好主意)壓制錯誤,那麼你很可能已經看到了PHP對此的警告。 從不抑制錯誤,特別是在發展中。這就像打體育,並說「誰在乎我是否摔斷了腿,我現在要跑這個馬拉松」。

我強烈建議你使用這種類型的數據庫。一個簡單的

UPDATE downloads SET total = total + 1 WHERE file_id = XXX 

比做這些文件操作更安全。特別是如果日誌文件變大。你會將整個數兆字節的文件吸入內存,讀取一個值,然後全部拋出。然後再次打開並重寫文件。如果同時完成兩次或多次下載,您將使用衝突的讀取/寫入來清除日誌文件。

如果你堅持基於文件的操作,然後看看使用flock(),而你的腳本是做更新,以限制其他並行下載訪問。

+0

我完全不瞭解php,所以我不知道我做錯了:)(我不知道@抑制錯誤)所以...我該如何使用該命令你給了?我只是簡單地輸出到一個文件,所以我可以看到它?或者把它放在一個HTML文件中?謝謝! – Mako

+0

這有點太寬泛,無法回答。我會建議看一些教程。一個快速的谷歌搜索發現我:http://www.blazonry.com/scripting/linksdb/start.php儘管它有一些關於轉義/引用的不好的建議。還要閱讀關於SQL注入攻擊(http://bobby-tables.com對此很有幫助)等等...... –

相關問題