2010-01-13 3 views
0

Может кто-нибудь помочь мне очистить это и сделать его более логичным? Я жареная прямо сейчас и не могу получить хорошую строку кода, написанную :)Лучше захватить сессионный идентификатор партнера из GET в PHP

Я пытаюсь захватить идентификатор партнера из URL-адресов вроде? 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', чтобы гарантировать, что ваша ценность действительно действительна. Тернарный оператор сломается, как только он найдет допустимую переменную. –

ответ

0

Спасибо, ребята, это выглядит лучше и лучше. Одним из моментов, которые могут вам разъяснить, является то, что если IF-идентификатор указан в 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; 
    } 
+0

Возможно, вы захотите вызвать отделку, прежде чем вы проверите пусто. Это означало бы, что пустое было бы правдой в случае, если $ _GET ['aid'] - это кодированное по URL-адресу пространство. –

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. Почему бы вы проверить на сессии и куки, в случае, если у вас есть действительный affiliateID из массива $ _GET? ==> Сделайте его прогрессивным, чтобы сеанс был проверен только, если GET не найден, а cookie проверяется только если сеанс не найден.

  2. Не повторяйте проверку аффилированного идентификатора. ==> Напишите функцию проверки и повторного использования, вы можете добавить дополнительные правила позже.

  3. Используйте фигурные скобки, чтобы сделать код более читаемым

  4. $ помощь или $ АРР являются BAD имена переменных, $ affiliateID вместо ХОРОШАЯ один! Вы ничего не выигрываете для написания коротких имен переменных, но вы выигрываете много с написанием самоочевидного кода.

Bad пример, не говорит

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

ouch, это длинный код в вашей функции isValid. Это должен быть один лайнер. –

+0

сделайте предложение! – markus

+0

Я исключил «пустые», потому что идентификатор может быть 0. Тогда снова это было бы плохой практикой, поэтому я мог бы использовать 'empty'. но ради расширения и удобочитаемости я бы не стал одним лайнером! – markus