2014-02-19 57 views
0

我用這個與GET變量網頁的每一頁變量PHP計數器

<?php $handle = fopen("counter.txt", "r"); if(!$handle){ 
    echo "could not open the file" ; } else { 


$counter = (int) fread($handle,20); 
fclose ($handle); 
$counter++; 
echo" <strong> you are visitor no ". $counter . " </strong> " ; $handle = fopen("counter.txt", "w"); fwrite($handle,$counter) ; 

FCLOSE($處理); }?>

但它使頁面tst.php計數器每個條目。

我想爲這個頁面tst.php計數?ID = 1

,但如果我改變tst.php?ID = 2這種數據存儲但從零和計數。

然後返回到tst,php?id = 1並顯示訪問此頁面的持續計數。

和另一tst.php?ID = ....

爲每個ID頁面!

+0

您是否想過切換到數據庫解決方案?它會工作得更好,而且不會讓你的網頁更加混亂。 – h2ooooooo

+0

不,我想要這樣更容易獲得訪問 – user3329634

回答

0

你可以嘗試喜歡的東西:

<?php 
$const='counter'; 
$id=$_GET['id']; 
$ext='.txt'; 
if(file_exists($const.$id.$ext)) 
{ 
$file=fopen($const.$id.$ext,'r'); 
$data=fread($file,filesize($const.$id.$ext)); 
fclose($file); 
$file=fopen($const.$id.$ext,'w'); 
fwrite($file,$data+1); 
} 
else 
{ 
$file=fopen($const.$id.$ext,'w+'); 
fwrite($file,1); 
fclose($file); 
} 
?> 

這將爲您在url中傳遞的每個'id'創建文件。 複製文件爲前上面的代碼:counter.php並在文件中包含任何有需要的計數器爲:

<?php 
include "counter.php" 
?> 

希望這會解決您的問題!

+0

語法錯誤,意外T_ENCAPSED_AND_WHITESPACE – user3329634

+0

哪一行顯示錯誤? – Amar

+0

$ file = fopen('counter.txt'。$ _ GET [「id」],w); – user3329634

0

每次頁面加載時,請考慮使用parse_url()來確定結束查詢字符串。將其輸入到您的文件中。

$query = parse_url($url, PHP_URL_QUERY); 
+0

'$ _GET'有什麼問題? – h2ooooooo

+0

沒有什麼,我想我只是覺得分享一種不同的方法! –

0

我想你想爲每個頁面單獨計數器。 如果是的話,這裏是你的代碼編輯版本:

$fp = fopen('counter'.intval($_GET['id']).'.txt', 'r+'); 

while(!flock($fp, LOCK_EX)) { // acquire an exclusive lock 
// waiting to lock the file 
} 

$counter = intval(fread($fp, filesize('counter'.intval($_GET['id']).'.txt'))); $counter++; 

ftruncate($fp, 0);  // truncate file 
fwrite($fp, $counter); // set your data 
fflush($fp);   // flush output before releasing the lock 
flock($fp, LOCK_UN); // release the lock 

fclose($fp); 

我把ID爲文件名。


編輯: ,使其在一個counter.txt文件(這是無效的):

$fh = fopen('counter.txt', 'c+'); //Open file 
while(!flock($fh, LOCK_EX)) {} //Lock file 
$var = json_decode(fread($fh, filesize('counter.txt'))); //Json decode file to array 
if(isset($var)) $var[(int)$_GET['id']]++; else $var[(int)$_GET['id']] = 1; //Increment the id's array value by one 
ftruncate($fh, 0); //Erase file contents 
fwrite($fh, json_encode($var)); //Write json encoded array 
fflush($fh); //Flush to file 
flock($fh, LOCK_UN); //Unlock file 
fclose($fh); //Close file 

但是,作爲h2ooooooo說,一個基於數據庫的解決方案會更好。(我會寫,如果你想)

+0

我已經改變了我的代碼這個作品,但其相同!我需要everi id! – user3329634

+0

這與另一個答案使用相同的技術,但更安全一些,這是我的想法(我們同時發佈:))並且,我認爲最好爲每個ID創建一個單獨的文件。因爲如果你有很多ID,腳本將不得不解析一個更大的文件。但是,如果你真的想要,我會寫。 – szgal

0

嘗試下面的代碼,這將工作相同的方式,你的代碼,除了存儲計數器在個別文件中的單個ID:

$fp = fopen("counter.txt".$_GET["id"], "r+"); 

while(!flock($fp, LOCK_EX)) { // acquire an exclusive lock 
    // waiting to lock the file } 

$counter = intval(fread($fp, filesize("counter.txt".$_GET["id"]))); $counter++; 

ftruncate($fp, 0);  // truncate file fwrite($fp, $counter); // set your data fflush($fp);   // flush output before releasing the lock flock($fp, LOCK_UN); // release the lock 

fclose($fp); 
+0

我已經改變了我的代碼,但它的效果相同!我需要everi id! – user3329634

+0

@ user3329634是的,它用於每個ID,因爲我們在文件名中追加了$ _GET [「id」]。所以它會創建單個文件,如counter.txt1,counter.txt2,...用於個人ID並在那裏存儲$ counter值。現在,如果你能詳細說明你需要什麼不同。 –

+0

我知道,但我有2000年的ID我不想創建2000 count.txt文件是posible存儲所有數據在每個ID的一個cont txt文件? – user3329634