2010-01-13 61 views
0

有人可以幫我清理這個,並使其更合乎邏輯嗎?我現在炒,似乎無法得到一個很好的代碼行:)更好地捕獲會話從PHP中的會員代碼ID

我試圖從網址捕捉會員ID像?aid = 3056677。這個想法是IF aff id在GET中被設置,優先,會話,最後是cookie。另外,我們不希望設置不存在的aff標識。

你知道更多的嘗試和做法嗎?

session_start(); // start session 

// affiliate id 
$g_aid = (isset($_GET['aid']) && $_GET['aid'] != '') ? trim($_GET['aid']) : false; 
$s_aid = (isset($_SESSION['aid']) && $_SESSION['aid'] != '') ? trim($_SESSION['aid']) : false; 
$c_aid = (isset($_COOKIE['aid']) && $_COOKIE['aid'] != '') ? trim($_COOKIE['aid']) : false; 

if($g_aid !== false) // use get if set 
    $aid = $g_aid; 
elseif($s_aid !== false) // next use session if get not set 
    $aid = $s_aid; 
elseif($c_aid !== false) // cookie 
    $aid = $c_aid; 
else 
    $aid = ''; // leave it empty 

// if $aid is set is it in the $affiliates array? 
//If not use the first key from that array 
$aid = (isset($affiliates[$aid])) ? $aid : key($affiliates); 

// save it and set it 
// (maybe shouldn't be done if already stored? 
setcookie('aid', $aid); 
$_SESSION['aid'] = $aid; 
+0

我做了修改利用'isValid'函數確保您的值實際上是有效的。三元運算符一旦找到有效變量就會中斷。 – 2010-01-14 01:08:32

回答

0

謝謝你們,這看起來越來越好。有一點可以爲你澄清,如果在GET中給出了一個aff標識,它必須是在我們可能消滅別人的aff標識之前存在的有效標識。每筆交易都涉及金錢,我們希望會員儘可能長時間獲得信用。

關於empty它不是太有用,因爲空白愚弄它。所以除非你在使用之前修剪,否則我覺得它不夠準確。所以我不知道GET的空白。對其他人來說沒問題,因爲我們已經檢查過了。

這裏是我到目前爲止,從你的幫助(在這裏所做的複雜三元打破時,發現真我不希望它繼續執行行?):

session_start(); // start session 

    $aid = !empty($_GET['aid'])  ? trim($_GET['aid']) : 
     !empty($_SESSION['aid']) ? $_SESSION['aid'] : 
     !empty($_COOKIE['aid']) ? $_COOKIE['aid'] : 
     ''; 

    // use first key from array if aid not set 
    if(!isset($a[$aid])) $aid = key($a); 

    if(!isset($_SESSION['aid']) || $aid != $_SESSION['aid']) 
    { 
    setcookie('aid', $aid); 
    $_SESSION['aid'] = $aid; 
    } 
+0

在檢查空白之前,您可能需要調用trim。這會確保在$ _GET ['aid']是一個url編碼空間的情況下,空將是真的。 – 2010-01-14 02:32:38

3
session_start(); 

// checks if a field is valid 
function isValid($aid) { 
    return (!empty($aid) && trim($aid) != ''); 
} 

// set the affiliate ID 
$aid = isValid($_GET['aid'])  ? $_GET['aid'] : 
     isValid($_SESSION['aid']) ? $_SESSION['aid'] : 
     isValid($_COOKIE['aid']) ? $_COOKIE['aid'] : 
     ''; 

// use first key from array if aid not set 
if (!isset($affiliates[$aid])) $aid = key($a); 

// save and set 
setcookie('aid', $aid); 
$_SESSION['aid'] = $aid; 
2
  1. 爲什麼你會測試會話和餅乾,如果你有從$ _GET數組有效AFFILIATEID? ==>使其漸進式,以便只檢查會話,如果沒有找到GET並且僅在沒有找到會話時檢查cookie。

  2. 不要重複驗證affiliateID。 ==>編寫一個驗證函數並重用它,您可能希望稍後添加更多規則。

  3. 使用大括號,使代碼更易讀

  4. $援助或$ AFF是壞的變量名,$ AFFILIATEID反而是一個很好的!你不會因爲編寫簡短的變量名稱而贏得任何東西,但是你通過編寫不言自明的代碼贏得很多。

例如不說話

if (validate($aff)) 

例如跟你說話

if (isValid($affiliationID)) 

所以我爲核心的變化提案組件:

if (isValid($_GET['aid'])) 
{ 
    $affiliationID = trim($_GET['aid']; 
} 
else if (isValid($_SESSION['aid'])) 
{ 
    $affiliationID = trim($_SESSION'aid']; 
} 
else if (isValid($_COOKIE['aid'])) 
{ 
    $affiliationID = trim($_COOKIE['aid']; 
} 
else 
{ 
    throw new Exception('No affiliation ID defined'); 
} 

function isValid($affiliationID) 
{ 
    if (empty($affiliationID)) 
    { 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
} 
+1

哎,這是你的isValid函數中的一些長代碼。它應該是一個班輪。 – 2010-01-14 00:27:18

+0

提出建議! – markus 2010-01-14 00:34:51

+0

我排除了'empty',因爲ID可能是0.然後再次這可能是不好的做法,所以我可以使用'empty'。但爲了可擴展性和可讀性,我不會把它作爲一個單一的內存! – markus 2010-01-14 00:42:56