PHP按值获取cookie

时间:2011-01-31 22:14:42

标签: php arrays cookies

我最近一直试图在我的网站上进行一些修改。基本登录的用户可以将游戏添加到他们喜欢的游戏中,而未登录的访问者将被定向到注册页面。

虽然我认为我可以尝试使用我的PHP一点点,并使访问者也可以将游戏添加到他们的收藏夹中。 (游戏是flash游戏)

所以我创建了这个允许用户点击图像的JS脚本,这个脚本检查cookie是否已经存在,如果没有,它会添加它,如果它确实存在,它将删除cookie(图像)从“添加到收藏夹”更改为“从收藏夹中删除”

由于可以有许多不同的收藏游戏,我不能使用简单的cookie名称,所以我将其设置为:xx1200 = set(所以有2个x,然后是游戏ID,它会产生cookie标题,然后“set”是cookie的值。所有收藏的游戏都会有相同的值,但名称不同,就是他们的ID,前面是xx。

现在要在另一个页面上打印cookie,显示他们喜欢的游戏,我在页面上添加了PHP,所以基本上得到了cookie,但是我的问题存在:如何通过其值获取cookie名称(通常你会打印{ {1}}但现在我的Cookie名称发生了变化。

我使用$_COOKIE["set"];来打印整个cookie,我在数组中看到了print_r($_COOKIE);,但我无法弄清楚如何获取ID(上例中为800)然后获取对应于给定ID的游戏。

任何帮助将不胜感激!谢谢你:))

更新

这是我现在的代码,过去几个小时都在处理和关闭,现在它确实工作正常,我没有添加PHP,只是javascript。

我唯一的问题是,当我尝试删除1个条目时,它会删除整个cookie,所以我似乎无法找到修复它的位置。 另一个问题是从数组中获取ID,如果有人可以帮助我,那将不胜感激。

这是我的代码:

[zz800] => set

我现在使用$ globalCookie替代我的游戏ID。

再次感谢您的帮助!

以上制作的cookie也是如此:

<?php
$globalCookie = '629';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>Document sans titre</title>
<script>
function createCookie(value)
{
 if(document.cookie.search(value)==-1){
  if(document.cookie.indexOf('games') == -1) {
  document.cookie = 'games' + '=' + ',' + value + '; expires=Fri, 27 Jul 2011 02:47:11 UTC; path=/';
  } else {
  var deagle = document.cookie;
  document.cookie = deagle + ',' + value + '; expires=Fri, 27 Jul 2011 02:47:11 UTC; path=/';
  } 
 } else {
  // Removes the cookie (making the clear cookie problem most probably
  document.cookie = 'games' + '=' +escape( value ) + '; expires=Fri, 27 Jul 2001 02:47:11 UTC; path=/';
 }
}
</script>
</head>

<body>
<script>
var globalCookie = <?=$globalCookie?>;
</script>
<?php
$stuff = $_COOKIE["games"];
$game = $globalCookie;
$pos = strpos($stuff, $game);

if ($pos === false) { ?>
   <a href='javascript:;'><img id="mygame1" src='images/add_mygames.gif' border="0" onClick="createCookie(globalCookie); (this.src=='images/add_mygames.gif')?(this.src='images/remove_mygames.gif'):(this.src='images/add_mygames.gif');"></a>
<? 
} else { ?>
   <a href='javascript:;'><img id="mygame1" src='images/remove_mygames.gif' border="0" onClick="createCookie(globalCookie); (this.src=='images/remove_mygames.gif')?(this.src='images/add_mygames.gif'):(this.src='images/remove_mygames.gif');"></a>

<?
}
?>
</body>
</html>

我发现只有这样才能使用explode(),因为如果逗号位于数字之后,则不会计算第一个

4 个答案:

答案 0 :(得分:3)

改变策略

您应该以不同的方式存储Cookie信息,如下所示的逗号分隔的游戏ID列表:

games=123,345,641

您可以使用这样的内容来解析&amp;访问数据:

$games = explode(',', $_COOKIE['games'];

foreach( $games as $game_id ){
    echo $game_id;
}

它为您提供了一系列用户喜欢的游戏ID。

添加/删除

由于您将只使用一个cookie存储受欢迎的游戏,因此作为用户收藏/不喜欢的游戏,您需要编写代码来实现以下(在Javascript中):

当用户收藏/不喜欢游戏时

  • 打开当前最喜欢的游戏cookie
  • 追加/删除相关的id(提示:使用split()将cookie拆分为Javascript数组以用于后一个操作)
  • 使用新游戏ID字符串重新设置Cookie

为什么?

对于键控值,确实需要一个已知的键。其他任何事情都是毫无意义的。在您的问题中,您拥有要存储在cookie中的信息,该信息可以包含任意数量的值。将这些值存储/发送为分隔列表要好于将每个值作为关键字粘贴到cookie中。幸运的是,您的数据(数字ID)很适合这种方法。

答案 1 :(得分:0)

如果您想扫描Cookie并获取游戏ID,可以尝试:

foreach ($_COOKIE as $key => $value){
echo("Game ID: ".substr($key,3)." - Status: ".$value);
}

在上面的示例中应输出“游戏ID:800 - 状态:设置”

答案 2 :(得分:0)

在第二个参数上使用array_keys。它与array_search类似,除了它返回一个匹配第二个参数中给出的值的数组,而array_search总是返回第一个匹配。

<?
//example data
$_COOKIE = array(
    'zz800' => 'set',
    'zz801' => 'set',
    'zz802' => 'set',
    'yz800' => 'test'
);

print_r(array_keys($_COOKIE, 'set'));
//result
array('zz800', 'zz801', 'zz802');
?>

答案 3 :(得分:-1)

如果您希望这样做,您需要进行数组搜索。

var_dump( array_search('set', $_COOKIE) );

我认为实现它是一个相当不错的主意,但说实话!