在页面上变量 =
$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");