2014-10-01 193 views
0

請告訴我,如何讓PHP函數只能在此設置下運行一次(在CodeIgniter中):如何讓PHP函數只在第一次觸發後運行?

當單擊頁面上的鏈接時,它將轉到href="http://foo.com/func/id/"。根據網址段idfunc段運行一個函數,該函數決定將點擊鏈接的用戶重定向到哪裏。

我想實現的是:

function func($id) 
{ 
if ("first time link($id) is clicked by unique user") { 
// Redirect based on $id 
} else { 
// Redirect to homepage 
} } 

基本上,第一次點擊後在同一鏈路上每次點擊都會觸發else情況。 如果需要,鏈接可以有任何ID或類。

我想這個代碼忠於至少直到當前頁面被關閉被點擊的鏈接,但基於可能的話計時器它可能延長到瀏覽器會話,甚至 - 也許是一個PHP會話..?

+2

也許一個php會話。或者,也許一些javascript反應onclick並更改鏈接添加參數? – Aneri 2014-10-01 08:09:38

+0

如果您試圖讓它只響應所有用戶的第一次點擊,那麼唯一健康的方法就是通過數據庫進行存儲。如果你希望它是第一次被當前用戶點擊,那麼一個$ _SESSION變量將會很好。 – LS11 2014-10-01 08:11:45

+0

那麼你必須知道你想要什麼 - >定義「第一」是什麼意思:第一次有人點擊鏈接,每個人第一次點擊鏈接。然後,你必須定義什麼一個人:由id標識,通過會議,通過用戶ID(在註冊),按時間,按餅乾....這真的取決於你明白什麼是「第一」 – Zim84 2014-10-01 08:13:30

回答

0

你需要的是保持狀態(靜止,HTTP是無狀態的)。

你必須保持一個標誌服務器端,如數據庫記錄,文件,甚至在內存中的信號。

如果所需的行爲是「交叉」或單個用戶我不明白。

0

也許,

function func($id) 
{ 
    if (@$_SESSION['linkClicked']) { 
     // Redirect to homepage 
    } else { 
     $_SESSION['linkClicked'] = true; 
     // Redirect based on $id 
    } 
} 
+0

雖然這會工作,我會使用'isset('linkClicked',$ _ SESSION)和$ _SESSION ['linkClicked']'而不是使用'@'消音器。雖然這只是我。 – 2014-10-01 08:15:37

+0

如果他正在跟蹤他的網站上的多個鏈接,這將不起作用。 – Solrac 2014-10-01 08:31:15

+0

@SolracRagnarockradio我同意。我的代碼片段是讓Alex開始並根據他的要求進一步探索。 – sudipto 2014-10-01 08:34:51

0

PHP有2個臨時儲存出的現成的你:

$_COOKIE 
$_SESSION 

取決於你將存儲多少數據,這些可能是有用/沒用您。如果您要存儲的數據太大(例如,200個鏈接引用),那麼最好將這些數據存儲在文件中,並通過用戶會話ID或SQL表格鏈接它們。

PHP本身沒有告訴誰在點擊什麼,因爲它是服務器端編程的方式。所以請考慮這個:

function func($Link_id){ 

    if (in_array($Link_id, $_SESSION['my_links'])){ 
    $_SESSION['my_links'][]=$Link_id; 
    // Redirect to homepage 
    } else { 
    // Redirect based on $id 
    } 

} 
+0

在這種情況下,會話是否也會存儲Cookie?謝謝。 – Alex 2014-10-01 09:11:36

+0

會話將數據存儲在PHP的會話處理程序中,該處理程序是操作系統中的文件。 如果要將數據保存在cookie上,則必須使用全局$ _COOKIE,但使用$ _SESSION更安全,因爲修改cookie客戶端比較容易。 – Solrac 2014-10-01 14:06:47