0

有人可以帮我清理它并使其更合乎逻辑吗?我现在很生气,似乎无法编写一行好的代码:)

我正在尝试从诸如 ?aid=3056677 之类的网址中获取会员 ID。这个想法是如果在 GET 中设置 aff id 优先,会话和最后的 cookie 最少。此外,我们不想设置不存在的 aff id。

你知道这样做的更久经考验和真实的方法吗?

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

3 回答 3

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;
于 2010-01-13T23:48:36.500 回答
2
  1. 如果您有来自 $_GET 数组的有效会员 ID,为什么要测试会话和 cookie?==>使其渐进,以便仅在未找到 GET 时检查会话,并且仅在未找到会话时检查 cookie。

  2. 不要重复对affiliateID 的验证。==>编写一个验证函数并重用它,您可能希望稍后添加更多规则。

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

  4. $aid 或 $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;
    }
}
于 2010-01-13T23:59:02.570 回答
0

谢谢大家,这看起来越来越好。可以为您澄清的一点是,如果在 GET 中给出了 aff id,则它必须是在我们可能清除其他人的 aff id 之前存在的有效的。每笔交易都涉及金钱,我们希望附属公司尽可能长时间地获得信用。

关于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;
  }
于 2010-01-14T00:56:25.627 回答