【问题标题】:displaying session variables显示会话变量
【发布时间】:2012-10-04 21:13:27
【问题描述】:

我想显示所有会话数据,但可以对其进行一些控制。问题是,我无法确切知道会话中存储了什么,因为它是来自购物车的数据。

例如,我的会话中有一个变量:

item_name_1:产品名称
item_quantity_1: 5

每个产品都有一些带有数字的变量。如果购物车中有 2 种不同的产品,那么第二个将是

item_number_2 等等。

还有一个名为 itemcount 的变量,它告诉购物车中有多少不同的产品。

我如何告诉 php,所有以 item_name_ 开头的变量都应该显示在所有其他变量(如总价)之后的单个 div 中?

这是我目前用来打印会话数据的:

<?php
foreach ($_SESSION as $key=>$val)
echo $key. ": ".$val. "<br>";
?>

这是我看到的:

货币:欧元
运费:10
总计:70.5
项目数:4
item_name_1: 番茄酱
item_quantity_1:1
item_price_1:3.5
item_options_1:
item_name_2: 扁豆供应
item_quantity_2:14
item_price_2:3.5
item_options_2:
item_name_3: 鸡汤
item_quantity_3:1
item_price_3:4.5
item_options_3:
item_name_4: 绿叶供应
item_quantity_4:1
item_price_4:3.5
item_options_4:

显然我想让它更易于阅读。

我可以使用 echo $_SESSION['shipping'] 将其放在我想要的任何地方,但是我如何处理产品?

比如说我希望每个产品都显示在 div 和 /div 中?

对不起,菜鸟问题。

谢谢

【问题讨论】:

  • 您应该将每个项目存储为单独的数组。你能显示将项目保存到会话的代码吗?
  • foreach($_POST as $k=>$v) { $_SESSION[$k]=$v;这就是我将帖子数据转换为会话的方式

标签: php session


【解决方案1】:

如果您无法控制将数据保存到会话的方式,您可以编写一个简单的辅助函数,以更可用的格式检索产品数据。

function getSessionProducts()
{
  $itemCount = $_SESSION['itemCount'];
  $products = array(); 
  for($i = 1; $i <= $itemCount; $i++) {
     $products[] = array(
       'name' => $_SESSION['item_name_'.$i],
       'quantity' => $_SESSION['item_quantity_'.$i],
       'price' => $_SESSION['item_price_'.$i],
       'options' => $_SESSION['item_options_'.$i]
    );
  }
  return $products;
}

您当然应该添加适当的验证来检查 $_SESSION 数组中的数据是否在访问之前设置。

如下使用

$products = getSessionProducts(); 
foreach($products as $product) { 
    echo $product['name']; 
} 

【讨论】:

  • 这看起来正是我需要的,但由于某种原因我无法让它运行它给了我“意想不到的;”错误...
  • 对不起数组声明中的语法错误。编辑了答案。
  • 现在再试一次。我将数组中的分号改为逗号
  • 谢谢,不再出现解析器错误。问题,我该怎么做才能回显 $product 的内容?当我输入 echo $products 时,它给了我未声明的变量错误。
  • 就像一个魅力! 10x 还有,['name'] 中缺少一个小类型 ',再次感谢。
【解决方案2】:

你可以使用像这样粗暴的东西:

foreach($_SESSION AS $key => $val)
    if (preg_match("/item_name/i", $key)) {
        echo $val.'<br>';
    }
}

显然,如果匹配成功,您会按照您的意愿处理您所做的事情。这只是提供一个想法。

顺便说一下,想想其他人在说什么。如果您可以控制会话变量,那么最好以更好、更有条理的方式存储它们。不过,这个糟糕的示例适用于您提供的内容。

【讨论】:

  • 如果你在解析变量名,你可能做错了什么
  • 你肯定做错了什么。但他问的是如何,而不是如何让它变得更好。我根本不会为此使用会话。
  • 这样的作品,但我将如何从同一产品中组合不同的东西?这是我到目前为止所做的: $val) if (preg_match("/item_name/i", $key)) echo '
    '.$val.''; ?> $val) if (preg_match("/item_quantity/i", $key)) echo '
    '.$val.'
    '; ?> 我怎么能把这两者结合起来?
  • 想通了。这实际上正是我想要的 10 倍
  • 很公平。您应该尽可能将一个答案标记为已接受。如果由我决定,我会说 dag 的答案最有意义且最容易理解,因此应该将其标记为正确。您认为有用的其他每一个都应该被点赞。
【解决方案3】:

每当您开始问自己“我如何处理变量变量名?”这是一个好兆头,你正朝着错误的方向前进。如您所见,查找$_SESSION['item_number_$n'] 既困难又不自然。然而,简单的是循环遍历数组的内容,幸运的是,您可以将其存储在会话中(除了它在页面加载之间的持久性之外,它只是一个普通数组)。

也就是说,与其想办法去$_SESSION['item_number_5'],不如看看$_SESSION['shopping_cart'][5]。这使得迭代项目、计算项目数量、添加项目、删除项目变得容易,并且通常更干净,可以全面使用。

【讨论】:

    【解决方案4】:

    无论如何,您实际上不应该使用会话变量来存储此类信息。您应该在会话中存储一个 id 以引用数据库中的购物车,而不是将有关购物车的所有信息直接存储在会话变量中。

    【讨论】:

    • thx,问题是购物车超级简单,根本不使用数据库,而且我对数据库一无所知。我使用会话通过 2 个不同的结帐页面传递购物车数据,您需要在其中填写表格,然后整个东西将被邮寄。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签