Cookie 不会抓取所有代码


Cookie Not Grabbing All Codes

在页面上变量 =

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

饼干 = '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不受调用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等]

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