Лучший захват для идентификатора партнерской сессии из GET в PHP
Может ли кто-нибудь помочь мне разобраться в этом и сделать его более логичным? Я сейчас зажарен и не могу написать хорошую строчку кода:)
Я пытаюсь получить партнерский идентификатор из URL-адресов, как? Aid=3056677. Идея состоит в том, что IF aff 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 ответа
Спасибо, ребята, это выглядит все лучше и лучше. Один момент, который может прояснить для вас, это то, что если в 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;
}
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;
Зачем вам проверять наличие сессии и cookie, если у вас есть действительный affiliateID из массива $_GET? ==> Сделайте его прогрессивным, чтобы сеанс проверялся только в том случае, если GET не был найден, а cookie проверялся только в том случае, если сеанс не был найден.
Не повторяйте валидацию affiliateID. ==> Напишите функцию проверки и используйте ее повторно, возможно, вы захотите добавить больше правил позже.
Используйте фигурные скобки, чтобы сделать ваш код более читабельным
$ 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;
}
}