PHP => $ _SESSION数组仅保留最后一个变量

时间:2017-07-05 11:28:19

标签: php arrays session

我正在为在线商店建立一个界面,其中每个项目都是一个FORM,而BUY按钮是一个提交,它提交所点击表单的名称和价格,并且该数据显示在CONFIRM ORDER页面上。在确认订单页面上,我创建了一个数组,如下所示

if (!isset($input_order_arr)) {
  $input_order_arr = array();
}

之后我获取已发布的变量并将它们推入数组

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  if (!empty($_POST['item-title'])  && !empty($_POST['item-price'])) {
    $item_title = test_input($_POST['item-title']);
    $item_price = test_input($_POST['item-price']);
    array_push($input_order_arr,$item_title,$item_price);
  }
}

$_SESSION['chosen_item'] = $input_order_arr;

*注意:test_input是一个执行striplashes,htmlspecialchars和htmltrim的函数,用于安全目的。 (有人可能会通过Chrome开发者控制台编辑项目的价值?不确定是否存在任何威胁)

之后,该值显示在类似的表中

              <?php if (isset($_SESSION['chosen_item'])) {
                foreach ($_SESSION['chosen_item'] as $value) {
                  echo "<td>" . $value . "</td>";
                }
              }  ?>

这就是问题所在。

如果您订购商品,其价格和名称会显示,但如果您返回并订购另一商品,则前一商品及其价格会丢失,就好像它没有向数组添加新行,而是替换旧商品那些,或者会话只保存来自一个动作的数据,这没有任何意义,因为这就是$ _SESSION的含义,代码在每个使用$ _SESSION变量的页面中都显示为session_start();。 / p>

主要问题 - 为什么$ _SESSION数组会丢失旧的输入?

3 个答案:

答案 0 :(得分:1)

您需要$_SESSION['chosen_item'][]=$input_order_arr; 覆盖相同的索引,而不是创建新的

$_SESSION['chosen_item'][]=$input_order_arr; 

注意:它也应该在if语句中移动。以避免在会话中存储空数组

答案 1 :(得分:1)

您可以像这样直接进入会话

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (!empty($_POST['item-title'])  && !empty($_POST['item-price'])) {

        array_push($_SESSION['chosen_item'],
                    test_input($_POST['item-title']),
                    test_input($_POST['item-price'])
                  );
    }
}

//$_SESSION['chosen_item'] = $input_order_arr;

或者您的test_input()可能没有任何用处

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (!empty($_POST['item-title'])  && !empty($_POST['item-price'])) {

        array_push($_SESSION['chosen_item'],
                    $_POST['item-title'],
                    $_POST['item-price']
                  );
    }
}

您可能会在以后通过

更容易地使用此数据
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (!empty($_POST['item-title'])  && !empty($_POST['item-price'])) {

        array_push($_SESSION['chosen_item'],
                    array('title' => $_POST['item-title'],
                          'price' => $_POST['item-price']
                        )
                  );
    }
}

答案 2 :(得分:-1)

当你回去时,你基本上将把selected_item数组元素设置为空,因为当你还没有提交表格时,$ input_order_arr将不包含任何内容。

只有在存在非空的$ input_order_arr数组时才应附加到会话数组:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  if (!empty($_POST['item-title'])  && !empty($_POST['item-price'])) {
    $item_title = test_input($_POST['item-title']);
    $item_price = test_input($_POST['item-price']);
    array_push($input_order_arr,$item_title,$item_price);

    $_SESSION['chosen_item'][] = $input_order_arr;
  }
}