非常奇怪的$ _SESSION行为

时间:2011-12-21 14:04:12

标签: php arrays session isset

我有一个会话,我用它来保存用户累积的表格中的项目,直到用户想要结账。它有点像购物车,可以从表格中添加项目。

代码的逻辑细分:

  1. 页面加载,会话启动
  2. 如果未设置$ _SESSION ['set'],则将其设置为TRUE。
  3. 显示页面和表单的其余部分。
  4. 用户点击“添加其他项目”按钮。
  5. 页面数据自行发布
  6. 页面检查$ _SESSION ['set'] = True并设置$ _POST ['add_item']。
  7. Page在数组中创建会话变量,并将发布的值添加到这些会话中。
  8. 如果需要添加更多内容,页面会增加$ _SESSION ['tariff_count']
  9. 问题是我的代码行为不正常。当我第一次单击“添加新资费”按钮时,它不被我的if功能捕获。这应该立即抓住。然而,当我再次按下按钮时,它最终会起作用,并在我的会话中添加一个项目。

    以下是代码:

    //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;
    }
    

    代码似乎在捏造我的Sesssion数据阵列。会话中我添加的所有项目都显示在表格中。

    但是,如果我的表显示六个项目,如果我执行会话的print_r,它只显示数组中有4个项目?我测试过它以确保我没有重新打印数组中的相同实例。

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

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

    我也截了屏幕来显示这个奇怪的问题

    http://i.imgur.com/jRenU.png

    注意我已经回显了“True Value = 6”,但是在会话的print_r中它只有5,所以我的代码缺少一个实例(n-1)。

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

    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页面的粘贴框 - http://pastebin.com/petkrEck

    任何想法,为什么当用户在第一次按下“添加另一个资费”按钮时,我的If语句没有捕获事件,但之后会检测到它?

    感谢您的时间

    圣诞快乐!

1 个答案:

答案 0 :(得分:3)

问题在于您的代码流程。在简化的伪代码中,你这样做:

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

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

代码流应该是:

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

if (posting data) {
   add data to session
}