2011-04-16 5 views
0

Je rencontre un problème avec la comparaison de chaînes PHP. Il ne s'avère jamais être 0. Ci-dessous, j'essaie d'obtenir un paramètre dans un cookie et de le comparer avec une clé donnée, et de retourner la valeur de ce cookie. Les cookies ressemblent à cette console = 1 | userId = 5. La valeur est toujours -180 ou quelque chose. Je leur fais écho et les sont les mêmes, et les longueurs sont les mêmes. Cela pourrait-il être un problème d'encodage?Comparaison de chaînes PHP ne fonctionne pas

$parameters = explode('|', $_COOKIE[Cisco_Rewards::REWARDS_SETTINGS_COOKIE_NAME]); 

      for ($i = 0; $i < count($parameters); $i++) { 
       $parameter = explode('=', $parameters[$i]); 

       if(count($parameter) > 1) { 
        echo strcasecmp(strtolower(trim($parameter[0])), trim(strtolower($name))); 
        if(strcasecmp(strtolower(trim($parameter[0])), trim(strtolower($name))) == 0) { 
         return $parameter[1]; 
        } 
       } 
      } 
+0

Est-ce que '$ parameters' après la première ligne contient la valeur attendue? Pouvez-vous publier le résultat de var_dump ($ parameters) ou juste un exemple? – Wh1T3h4Ck5

+0

Qu'est-ce que «retour» signifie? – Wh1T3h4Ck5

+0

Array ([0] => console = 1 [1] => userid = 8150) est retourné par print_r ($ paramètres), et le retour, retourne la valeur de la clé, disons 8150 pour userid si cela est demandé via $ prénom. –

Répondre

1

Il vous manque break; dans for loop!

Oui, il peut s'agir d'un problème de codage car la fonction strcasecmp() fonctionne uniquement avec Unicode. Les caractères multi-octets tels que UTF-8 ou UTF-16 ne peuvent pas être comparés avec strcasecmp().

En outre, strcasecmp() est fonction insensible à la casse si l'aide strtolower() contre ses paramètres ne change pas de résultat fonction (chaîne « l'exemple » est identique à « Exemple » m « par exemple », « EXAMPLE », etc.).

Vous devez définir la valeur de résultat par défaut (par exemple $res=false;) pour vous assurer que le résultat est défini après la boucle.

Vous devez remplacer for loop bloc avec foreach loop comme celui-ci beugler

$parameters = explode('|', $_COOKIE[Cisco_Rewards::REWARDS_SETTINGS_COOKIE_NAME]); 

    // this will handle result 
    $res = false; 

    foreach ($parameters as $value) { 
    $param = explode('=', $value); 
    if(count($parameter) > 1) { 
     // I guess this line is just for testing result 
     echo "param1=".trim($param[0])."; param2=".trim($name)."; Result=".strcasecmp(trim($param[0]), trim($name)) . "<br />\n"; 

     if(strcasecmp(trim($param[0]), trim($name))) { 
     $res=$param[1]; 
     // you should break here 
     break; 
     } 
     } 
    } 
    // try to output result before (testing purpose only) 
    var_dump($res); 

    return $res; 

Mais pour rendre cette solution facile, vous pouvez utiliser cette fonction

function getParamValue($parameters, $key) { 
    $res = false; 
    $plist = explode('|', $parameters); 
    foreach ($plist as $pair) { 
     $element = explode('=', $pair); 
     if (trim($element[0]) == trim($key)) { 
     $res = trim($element[1]); 
     break; 
     } 
     } 
    return $res; 
    } 

Donc, si vous avez $parameters chaîne comme "console=1|userid=8159" et que vous voulez pour trouver la valeur $key chaîne "userid", mettez-la dans cette fonction et il renverra votre résultat ou fal se si $key n'a pas été trouvé dans la liste $parameters.

Exemple

$parameters = "console=1|userid=8159"; 
    $name = "userid"; 

    echo getParamValue($parameters, $name); 

Sortie

8159 

Maintenant, vous pouvez écrire votre code de cette façon

$parameters = explode('|', $_COOKIE[Cisco_Rewards::REWARDS_SETTINGS_COOKIE_NAME]); 
$value = getParamValue($parameters, $name); 

Et valeur $ prend votre résultat ou retourne faux si $ name n'est pas dans $ paramètres liste.

+0

Cela a fonctionné. J'ai fondamentalement changé la boucle for avec le foreach et gardé le reste le même, tout en supprimant la chaîne inférieure (qui était juste à gauche de tout essayer). Toujours pas exactement sûr de ce qui n'allait pas mais merci. –

+0

@Mike, probablement erreur logique, mais la chose la plus importante est, vous avez une solution. Je suggère d'utiliser cette fonction que j'ai placée dans la partie inférieure de ma réponse au lieu de cela pour chaque bloc. – Wh1T3h4Ck5

Questions connexes