2011-12-21 95 views
2

我有一個會話,我用它來保存用戶積累的表單中的項目,直到用戶想要結賬。它有點像購物車,可以從表單中添加項目。

的代碼邏輯分解:

  1. 頁面加載時,會議開始
  2. 如果$ _SESSION [ '設置']沒有設置然後將其設置爲TRUE。
  3. 顯示頁面和表單的其餘部分。
  4. 用戶點擊「添加另一個項目」按鈕。
  5. 頁面數據自動發佈
  6. 頁面檢查是否設置了$ _SESSION ['set'] = True和$ _POST ['add_item']。
  7. Page在數組中創建一個會話變量,並向這些會話添加發布的值。
  8. 頁爲單位$ _SESSION [「tariff_count」]如果要添加更多的需求

的問題是,我的代碼是不是表現爲它應該。當我第一次點擊「添加新的關稅」按鈕時,它不會被我的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

注意我已經迴應了「真值= 6」,但在會議的print_r它只有5 ,所以我的代碼丟失了一個實例(n-1)。

這是我的代碼打印會話數組中的所有實例,我有一種感覺是不匹配問題的一部分是由「< =」比較造成的? PHP頁面的

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

粘貼斌 - http://pastebin.com/petkrEck

任何想法,爲什麼當用戶按下「添加其他關稅」按鈕,它按下第一次我的if語句沒有捕獲事件,但隨後檢測之後呢?

感謝您的時間

聖誕快樂!

+0

請你能也顯示形式與它有關被提交的方式,HTML和任何JavaScript? – DaveRandom 2011-12-21 14:08:07

+0

@DaveRandom - pastebin鏈接http://pastebin.com/petkrEck – kaleeway 2011-12-21 14:11:44

+0

@loosebruce:這不是你要找的答案,而是你的數組有一個從零開始的索引。如果仔細觀察,發佈'[tariff_count] => 5'(從您的print_r)時,實際上有5個項目(0,1,2,3,4)。 – netcoder 2011-12-21 14:42:25

回答

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 
} 
+1

非常感謝你!我已修復它,現在它第一次點擊後,它的作品!祝你聖誕節愉快! – kaleeway 2011-12-21 14:51:41