Cookie没有抓取所有代码

时间:2016-02-04 17:17:29

标签: php arrays cookies

On Page Variable =

$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数组中。我做错了什么或如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

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

因此,每次运行此行:

$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等等。

答案 1 :(得分:0)

你的逻辑非常混乱。这应该是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");