在PHP中从GET更好地捕获会话附属ID

时间:2010-01-13 23:44:44

标签: php session cookies affiliate affiliates

有人可以帮助我清理它并使其更符合逻辑吗?我现在已经被炒了,似乎无法写出一行代码:)

我正在尝试从网址中捕获联盟ID,例如?aid = 3056677。这个想法是IF ID在GET中设置优先,会话和最后cookie最少。此外,我们不想设置不存在的关联。

你知道一种更有效的方法吗?

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;

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

  1. 如果您从$ _GET数组获得有效的affiliateID,为什么要测试会话和cookie? ==> 将其设为渐进式,以便仅检查会话,如果未找到GET,则仅在未找到会话时检查Cookie。

  2. 不要重复关联ID的验证。 ==> 编写验证功能并重复使用,您可能希望稍后添加更多规则。

  3. 使用大括号使代码更具可读性

  4. $ aid或$ aff是BAD变量名,$ affiliateID是一个好的名字!你不会因为编写短变量名而赢得任何东西,但是你通过编写不言自明的代码赢了很多。

  5. 错误示例,不会谈话

    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;
        }
    }
    

答案 2 :(得分:0)

谢谢大家这看起来越来越好。可能会为您澄清的一点是,如果在GET中给出了一个关联,它必须是一个有效的存在,然后才能消灭别人的身份。每笔交易涉及金钱,我们希望联盟会员尽可能长时间获得信贷。

关于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;
  }