php - 非常奇怪的 $_SESSION 行为

标签 php arrays session isset

我有一个 session ,用于以用户累积的形式保存项目,直到用户想要继续结帐为止。它有点像购物车,可以从表单添加项目。

代码逻辑分解:

  1. 页面加载, session 启动
  2. 如果 $_SESSION['set'] 未设置,则将其设置为 TRUE。
  3. 显示页面和表单的其余部分。
  4. 用户点击“添加另一个项目”按钮。
  5. 页面数据会发布到自身
  6. 页面检查 $_SESSION['set'] = True 且 $_POST['add_item'] 是否已设置。
  7. Page 在数组中创建 session 变量,并将发布的值添加到这些 session 中。
  8. 如果需要添加更多页面,则增加 $_SESSION['tariff_count']

问题是我的代码没有按应有的方式运行。当我第一次单击“添加新关税”按钮时,它不会被我的 if 函数捕获。这应该立即被捕获。然而,当我再次按下按钮时,它终于起作用了,并向我的 session 添加了一个项目。

这是代码:

//start a session to remember tariff items 
session_start();

//testing the session array
print_r($_SESSION);

//destroy session if this character is found in URL string
$des = $_GET['d'];
if($des == 1)
{
  session_destroy();
}

//checks to see if session data has been set

//if a session variable count is set then 
if ($_SESSION['set'] == TRUE)
{
  //perform a check to ensure the page has been called by the form button and not been accidently refreshed
  if(isset($_POST['add_tariff']))
  { 
    //if user clicks Add another tariff button then increase tariff count by one

    //temp variable set to the current count of items added
    $count = $_SESSION['tariff_count'];
    $_SESSION['tariff_name'][$count] = $_POST['tariff_name'];
    $_SESSION['tariff_net'][$count] = $_POST['tariff_net'];
    $_SESSION['tariff_inclusive'][$count] = $_POST['tariff_inclusive'];
    $_SESSION['tariff_length'][$count] = $_POST['tariff_length'];
    $_SESSION['tariff_data'][$count] = $_POST['tariff_data'];
    //increment tariff count if more data needs to be added to the sessions later.
    $_SESSION['tariff_count']++;
  }
}
//if no session data set then start new session data
else
{   
  echo "session set";
  $_SESSION['set'] = TRUE;
  $_SESSION['tariff_count'] = 0;
}

代码似乎捏造了我的 session 数据数组。我在 session 中添加的所有项目都显示在表格中。

但是,如果我的表显示 6 个项目,如果我对 session 执行 print_r,它只显示数组中有 4 个项目?我已经对其进行了测试,以确保我不会重新打印数组中的相同实例。

这是数组的 print_r,显示六行,但该数组中只有四行?

[tariff_count] => 5 [tariff_name] => Array (
    [0] => STREAM1TARIFF [1] => STREAM1TARIFF [2] => CSS [3] => CSS [4] => CSS
  ) 

我也截图来展示这个奇怪的问题

/image/ARv1F.png

注意,我已经回显了“True Value = 6”,但在 session 的 print_r 中它只有 5,因此我的代码丢失了一个实例 (n-1)。

这是我的代码,它打印 session 数组中的所有实例,我感觉不匹配的部分问题是由“<=”比较引起的?

if(isset($_SESSION['tariff_count']))
{
  for ($i = 0; $i <= $count; $i++)
  {
    echo "<tr>";
    echo "<td>".$_SESSION['tariff_name'][$i]."</td>";
    echo "<td>".$_SESSION['tariff_net'][$i]."</td>";
    echo "<td>".$_SESSION['tariff_inclusive'][$i]."</td>";
    echo "<td>".$_SESSION['tariff_length'][$i]."</td>";
    echo "<td>".$_SESSION['tariff_data'][$i]."</td>";
    echo "</tr>";
  }
}

php页面的粘贴bin - http://pastebin.com/petkrEck

有什么想法吗,为什么当用户第一次按下“添加另一个关税”按钮时我的 If 语句没有捕获该事件,但随后又检测到它?

感谢您的宝贵时间

圣诞快乐!

最佳答案

问题出在你的代码流程上。在简化的伪代码中,您将执行以下操作:

if (session is not initialized) {
    set = true
    count = 0;
} else {
    add posted data to session
}

在第一次“添加项目”调用时,未设置 session ,因此您设置了 session 。然后忽略发布的数据。

代码流程应该是:

if (session is not initialized) {
    set = true;
    count = 0;
}

if (posting data) {
   add data to session
}

关于php - 非常奇怪的 $_SESSION 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8591026/

相关文章:

php - 如何让 Symfony 将空关联数组序列化为空 JSON 对象?

php - 登录页面是否需要 cookie?

javascript - 将通知推送到浏览器窗口

php - 完整图像而不是缩略图

php - setlocale 是否仅限于其脚本实例?

java - .contains() 方法不起作用——在 Java 数组中查找 int

java - 在java中使用数组生成4个不重复的随机数

arrays - 在 O(n) 中查找总和为零的子数组的数量

php - 如何在不使用 Request 的情况下删除 Laravel 5.3 中的 session ?

php - 服务器如何存储使用 PHP 创建的 session 变量?