2010-01-13 3 views
0

Quelqu'un peut-il m'aider à nettoyer cela et à le rendre plus logique? Je suis frit en ce moment et ne peux pas sembler obtenir une bonne ligne de code écrite :)Mieux capturer l'ID d'affilié de session à partir de GET en PHP

J'essaye de capturer l'id d'affilié des URLs comme? Aid = 3056677. L'idée est IF aff ID est défini dans GET qui a la priorité, la session et finalement cookie avec le moins. En outre, nous ne voulons pas définir un identifiant qui n'existe pas.

Connaissez-vous une méthode plus éprouvée pour ce faire?

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

J'ai fait une modification en utilisant un Fonction 'isValid' pour s'assurer que votre valeur est valide. L'opérateur ternaire se casse une fois qu'il trouve une variable valide. –

Répondre

0

Merci les gars cela semble de mieux en mieux. Un point qui pourrait clarifier pour vous, c'est que si un identifiant est donné dans GET, il DOIT être valide avant d'effacer l'identifiant de quelqu'un d'autre. L'argent est impliqué dans chaque transaction et nous voulons qu'un affilié obtienne un crédit le plus longtemps possible. En ce qui concerne empty ce n'est pas trop utile car un espace blanc le trompe. Donc, à moins de couper avant de l'utiliser, je pense que ce n'est pas assez précis. Donc, je ne sais pas à propos du vide pour le GET. C'est bon pour les autres car nous les avons déjà vérifiés.

Voici ce que j'ai si loin de votre aide (ce que le ternaire complexe briser ici quand il trouve vrai que je ne veux pas garder l'exécution de la ligne?):

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

Vous voudrez peut-être appeler trim avant de cocher empty. Cela permettrait de s'assurer que le vide serait vrai dans l'événement $ _GET ['aid'] est un espace encodé par l'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. Pourquoi voudriez-vous tester pour la session et les cookies, si vous avez un AffiliateID valide à partir du tableau $ _GET? ==> Faites en sorte que la session ne soit vérifiée que si aucun GET n'a été trouvé et que le cookie n'est vérifié que si aucune session n'a été trouvée.

  2. Ne répétez pas la validation de l'ID affilié. ==> Ecrivez une fonction de validation et réutilisez-la, vous voudrez peut-être ajouter plus de règles plus tard.

  3. Utilisez des accolades pour rendre votre code plus lisible

  4. aide $ ou aff $ sont mauvais noms de variables, $ AffiliateID est plutôt un bon! Vous ne gagnez rien pour écrire des noms de variables courts, mais vous gagnez beaucoup en écrivant un code explicite.

Bad exemple, ne parle pas

if (validate($aff)) 

Bon exemple, vous parle

if (isValid($affiliationID)) 

Donc, ma proposition de changement du noyau composants:

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 c'est un long code dans votre fonction isValid. Ce devrait être un seul paquebot. –

+0

Faites une suggestion! – markus

+0

J'ai exclu 'empty' parce que l'ID pourrait être 0. alors encore une fois ce serait une mauvaise pratique, donc je pourrais utiliser' empty'. mais pour l'extensibilité et la lisibilité je ne ferais pas un seul paquebot! – markus