【问题标题】:Better Capture to Session Affiliate Id from GET in PHP更好地从 PHP 中的 GET 捕获会话附属 ID
【发布时间】:2010-01-14 09:07:13
【问题描述】:

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

我正在尝试从 ?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;

【问题讨论】:

  • 我使用isValid 函数进行了修改,以确保您的值实际上是有效的。三元运算符一旦找到有效变量就会中断。

标签: php session cookies affiliate affiliates


【解决方案1】:
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 数组的有效会员 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;
        }
    }
    

    【讨论】:

    • 你的 isValid 函数中有一些长代码。它应该是一个班轮。
    • 我排除了empty,因为 ID 可能为 0。那么这可能是不好的做法,所以我可以使用 empty。但为了可扩展性和可读性,我不会把它做成一个单行!
    • 有些人认为短代码是好代码,但这是一个错误。仅仅因为有“写得尽可能短”的练习并不意味着更短的代码更好。
    【解决方案3】:

    谢谢大家,这看起来越来越好。可以为您澄清的一点是,如果在 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;
      }
    

    【讨论】:

    • 您可能想在检查空之前调用 trim。这将确保在 $_GET['aid'] 是 url 编码空间的情况下为空。
    猜你喜欢
    • 2011-04-30
    • 2015-09-06
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2019-10-12
    • 2021-05-23
    • 1970-01-01
    相关资源
    最近更新 更多