【问题标题】:PHP get cookie by valuePHP按值获取cookie
【发布时间】:2011-02-01 10:57:16
【问题描述】:

我最近一直在尝试在我的网站上进行这个小修改。基本上已登录的用户可以将游戏添加到自己的收藏中,未登录的访问者将被引导到注册页面。

虽然我认为我可以尝试在我的 PHP 上做一些工作,让访问者也可以将游戏添加到他们的收藏夹中。 (游戏是 Flash 游戏)

所以我制作了这个 JS 脚本,它允许用户点击图片,这个脚本检查 cookie 是否已经存在,如果不存在,它会添加它,如果它确实存在,它将删除 cookie(一张图片从“添加到收藏夹”更改为“从收藏夹中删除”

由于可以有很多不同的收藏游戏,我不能使用简单的 cookie 名称,所以我这样设置:xx1200=set(所以有 2 个 x,然后是构成 cookie 标题的游戏 id,然后"set" 是 cookie 值。所有收藏的游戏将具有相同的值,但名称不同,即它们的 ID,前面带有 xx。

现在要在另一个页面上打印 cookie,显示他们最喜欢的游戏,我在一个页面上添加了 PHP,所以基本上得到了 cookie,但是我的问题是:如何通过值获取 cookie 名称(通常你会打印 @ 987654321@ 但现在我的 cookie 名称更改了。

我使用print_r($_COOKIE); 打印整个cookie,我在数组中看到我的[zz800] => set,但我不知道如何获取ID(在上面的示例中为800)然后获取游戏(s ) 对应于给定的 ID。

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

更新:

这是我现在拥有的代码,过去几个小时一直在工作和关闭,现在它工作正常,我没有添加 PHP,只是添加了 javascript。

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

这是我的代码:

<?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>

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

再次感谢您的帮助!

上面制作的cookie看起来像:

games=,621,256,637,57354

我发现使用explode()的唯一方法,因为如果逗号在数字之后,它不会计算第一个

【问题讨论】:

  • 没有它的访问者,我已经有一个不同的系统使用我的用户数据库
  • 使用 strpos 搜索数据 ini 逗号分隔字符串是个坏主意。例如:games=,621,256,637,57354,你会发现 '21' 会有一个结果,而你知道它的结果应该是 false。解决方法:使用array_search(先用逗号分解)或者使用PCRE。

标签: php arrays cookies


【解决方案1】:

改变策略

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

games=123,345,641

您可以使用类似的方法来解析和访问数据:

$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)非常适合这种方法。

【讨论】:

  • 用户一个一个地添加游戏,所以基本上每次他/她将游戏添加到他们的收藏夹时都会创建一个新的cookie,所以我看不到如何制作列表,例如当用户添加游戏 ID '123' 它将使 cookie 设置为 123=例如,然后当他收藏 '345' 时,它将创建另一个 cookie。如果我记错了,请告诉我,非常感谢您的回复
  • 其实很容易做,你可以做的正是他建议的,如果用户添加了一个新游戏,获取当前的$_COOKIE['games']数组,并添加一个新的值。因此,如果用户喜欢某个游戏,您可以执行以下操作: if(isset($_COOKIE['games'])) { $_COOKIE['games'] .= ",$newid"; } else { $_COOKIE['games'] = "$newid";允许您使用所需的值创建 cookie,或者您可以附加新值。好吧,如果我的格式正确,但代码示例大致相同。
  • 所以基本上是一个“游戏”cookie,存储所有游戏 ID。我将如何设法打开 cookie 并为其添加新值?编辑:好吧,我得到了你在那里发布的内容,尽管我用 javascript 制作我的 cookie 并通过 php 打印它们
  • 好的,非常感谢,考虑到这一点,我马上开始工作 - 再次感谢!
  • +1 表示不按字面意思回答问题,而是提出更好的解决方案,这是非常罕见的行为
【解决方案2】:

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

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

在上面的例子中应该输出“Game ID: 800 - Status: set”

【讨论】:

    【解决方案3】:

    在第二个参数上使用 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');
    ?>
    

    【讨论】:

      【解决方案4】:

      如果你想按照你写的方式工作,你需要数组搜索。

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

      说实话,我认为这样实现它是一个非常糟糕的主意!

      【讨论】:

      • 那你会怎么做呢?我找不到比这更好的方法(无论如何,对于访问者来说,它是实际用户的另一个系统)
      猜你喜欢
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 2014-07-01
      • 1970-01-01
      相关资源
      最近更新 更多