【问题标题】:Cookie Not Grabbing All CodesCookie 未获取所有代码
【发布时间】:2016-02-05 01:29:46
【问题描述】:

页面变量 =

$lgc_code = '1,2,3,15,23,30';

Cookie = 'lgc_cntl'

我的 cookie 包含每个用户的逻辑代码,用于根据之前访问的网页确定应显示哪些横幅或图标。我写了以下函数:

    $lgc=$lgc_code;

    // check for variable for multiple codes
    $expEncArr = explode(",", $lgc);
    $results = count($expEncArr);

        if(isset($_COOKIE['lgc_cntl'])) {

            // read cookie
            $cookie_codes = $_COOKIE['lgc_cntl'];

            // Build Array of cookie codes
            $expEncArr2 = explode(",", $cookie_codes);

            foreach($expEncArr as $l_code) {
                    if(in_array($l_code, $expEncArr2)) {

                        $lgc_codes=$_COOKIE['lgc_cntl'];

                    } else {

                        $lgc_codes=$_COOKIE['lgc_cntl'].','.$l_code;

                    } // end array search statement

            // add campaign to cookie
            setcookie('lgc_cntl',$lgc_codes,time() + (86400 * 365), "/", ".oru.edu"); // 86400 = 1 day      

            } // end foreach statement

        } else {

            $lgc_codes = $lgc;

            // add campaign to cookie
            setcookie('lgc_cntl',$lgc_codes,time() + (86400 * 365), "/", ".oru.edu"); // 86400 = 1 day

        } // end isset(cookie) if / else statement

如果没有设置 cookie,该函数可以正常工作,但如果找到 cookie,它只会添加数组中的最后一个变量,而不是 cookie 中未找到的任何代码。

该功能应该如下工作:

  • 将页面变量分离到一个数组中
  • 检查 cookie
  • 将 Cookie 值分隔到一个数组中
  • 将页面上的变量与 cookie 中的值进行比较
  • 添加任何在 cookie 中找不到的页面变量

它一直在工作,但是当设置 cookie 时,它​​只添加字符串中的最后一个变量,即使其他变量都不位于 cookie 数组中。我做错了什么或者我该如何解决这个问题?

【问题讨论】:

    标签: php arrays cookies


    【解决方案1】:

    这是一个常见错误 - $_COOKIE 不受调用 setcookie 的影响。这是因为$_COOKIE 是在 PHP 脚本执行开始时创建的,基于 浏览器发送的数据,setcookie 发送数据浏览器。 p>

    因此,每次运行此行时:

    $lgc_codes=$_COOKIE['lgc_cntl'].','.$l_code;
    

    $lgc_codes 的值是浏览器最初发送的 cookie 字符串加上一个额外的代码。

    解决方案是改用一个局部变量,例如$new_cookie_value,来构建完整的字符串,然后调用一次setcookie

     $new_cookie_value = $_COOKIE['lgc_cntl'];
    
     foreach($expEncArr as $l_code) {
          // if statement removed to keep example brief
          // Add extra code to list
          $new_cookie_value = $new_cookie_value .','.$l_code;
     }
     // Now call setcookie once with the desired value
     setcookie('lgc_cntl',$new_cookie_value,time() + (86400 * 365), "/", ".oru.edu");    
    

    [旁白:不要低估好的变量名的价值。如果 $expEncArr$expEncArr2 有更长的名称来描述它们之间的区别,您的代码会更清晰。同样,$lgc$lgc_code$lgc_codes 等]

    【讨论】:

    • 您的设置没有过滤掉 cookie 中已有的代码,因此最终会在 cookie 中出现重复代码。如何修改它以便只添加 cookie 中尚未包含的代码?
    • 我通过简单地在 foreach 序列中移动“setcookie”命令来解决它。不确定这是否是最佳方法,但它有效。
    • @JonathanAnspaugh 我删除了if(in_array(... 行只是为了保持示例简短。这不应该是你复制和粘贴的代码,我希望你学习这个原理并将其应用到你现在和将来的代码中。重要的一点是不要继续阅读$_COOKIE,因为每个循环都不会改变它。您绝对不需要foreach 循环中需要setcookie - 您只设置一个cookie,因此只需设置一次。
    【解决方案2】:

    你的逻辑很混乱。这是if 块的第一部分应该包含的内容

    // read cookie
    $cookie_codes = $_COOKIE['lgc_cntl'];
    
    // Build Array of cookie codes
    $expEncArr2 = explode(",", $cookie_codes);
    
    $lgc_codes = $_COOKIE['lgc_cntl'];
    
    foreach ($expEncArr as $l_code)
    {
        if (!in_array($l_code, $expEncArr2))
        {
            $lgc_codes .= ',' . $l_code;
        }
    }
    
    setcookie('lgc_cntl', $lgc_codes, time() + (86400 * 365), "/", ".oru.edu");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-19
      • 2016-01-14
      • 2015-02-08
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 2013-12-27
      相关资源
      最近更新 更多