2012-05-26 25 views
0

我在爲我的電子商務相關網站的cms部分驗證並存儲用戶信息時遇到了一些麻煩。頁面PHP - 複選框輸入驗證 - 將複選框的狀態存儲爲會話變量?

部分包含了用戶的選項來選擇,如果需要,從他們的送貨地址不同的帳單地址。這是頁面上的兩種形式之一。

第一種形式是一個表,其中用戶,如果他們需要一個備用的帳單地址選擇。

在此基礎上選擇是生成的第二形式或者如果需要的話,或不包含帳單地址的附加空間。

這裏是與第一種形式的HTML把事情的來龍去脈:

<form name="isSameAsPostal" action="" method="post"> 
<table class="adminTable" align="center"> 
<thead class="tableAddEdit"> 
    <tr> 
     <th colspan="4">Details</th> 
     <th colspan="1">Active</th> 
    </tr> 
</thead> 
<tfoot class="tableFooter"> 
    <tr> 
     <td colspan="5">This table stores the users addittional information.</td> 
    </tr> 
</tfoot> 
<tbody> 
<tr> 
    <td colspan="4">User has different billing address?</td> 
    '.$topCont.' 
</tr> 
</tbody> 
</table> 
</form> 

正如你可以看到,自身不包含在表單中輸入的,它被作爲一個變量,它是在腳本控制器中設置。

這裏是PHP爲把事情的來龍去脈:

if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 1) 
{ 
    $_SESSION['sameAsPostal'] = 1; 
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="0" checked="checked" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>'; 
    $otherCont = 'postal'; 
} 
else if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 0) 
{ 
    $_SESSION['sameAsPostal'] = 0; 
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>'; 
    $otherCont = 'postal and billing'; 
} 
else 
{ 
    $_SESSION['sameAsPostal'] = 0; 
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>'; 
    $otherCont = 'postal and billing'; 
} 

正如你可以用這個看到,JavaScript是用作輸入的狀態改變爲自動提交表單。

現在,在此基礎上,幾乎都作爲正確我想到,當我最初開始這個工作。

根據控制器,勾選複選框,會話變量$sameAsPostal設置爲'1',用於觸發在第二種形式內生成額外結算選項。

與此一起,複選框的值變爲'0',因此允許取消選擇複選框,並且在控制器的第二部分中看到$sameAsPostal將被設置爲0時,第二種形式的賬單信息被移除腳本。包含控制器的最後一部分作爲要添加到頁面的第一個輸入實例。沒有它就不會有輸入。

太棒了,就像我說過的這一切都很有效。但是我現在面臨的問題伴隨着下一個邏輯上的補充。當第二個表單被驗證並且遇到輸入錯誤時,頁面會刷新並顯示正確的錯誤突出顯示。在此範圍內,複選框也會重置,導致帳單信息部分消失。 (用於填充各個輸入的信息仍然存儲,但它的實際的HTML消失的複選框已復位)

所以我想這除了控制器:

if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 1) 
{ 
    $_SESSION['sameAsPostal'] = 1; 
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="0" checked="checked" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>'; 
    $otherCont = 'postal'; 
} 
else if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 0) 
{ 
    $_SESSION['sameAsPostal'] = 0; 
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>'; 
    $otherCont = 'postal and billing'; 
} 
else if (isset($_SESSION['sameAsPostal']) && $_SESSION['sameAsPostal'] == 1) 
{ 
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="0" checked="checked" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>'; 
    $otherCont = 'postal'; 
} 
else if ((isset($_SESSION['sameAsPostal']) && $_SESSION['sameAsPostal'] == 1) && (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 0)) 
{ 
    $_SESSION['sameAsPostal'] = 0; 
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>'; 
    $otherCont = 'postal and billing'; 
} 
else 
{ 
    $_SESSION['sameAsPostal'] = 0; 
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>'; 
    $otherCont = 'postal and billing'; 
} 

而且很多別人說實話......但似乎我的邏輯和參與這項任務的實際邏輯似乎有所不同。

這除了控制器使複選框,如果無法檢查取消選中。

我加爲了趕狀態。如果複選框,然後首先正確輸入適用於第一種形式,其次,如果需要生成billng信息部分中的會話變量。

但似乎無論如何配置控制器腳本我似乎無法得到它的工作方式。

可以提供一些有關我的錯誤的信息或提出建議嗎?

在此先感謝您花時間閱讀此!

回答

1

如果你想使用$_SESSION變量,你需要確保你每一次啓動會議,以保持這些值店。我將假定您在第一次提交表單後從$_POST陣列中獲取複選框值。

你可以只檢查從提交的表單而不是價值,而是要保持它綁你的問題我能想到的是,你無法正常啓動會話。

順便說一句,你只需要檢查它像這樣,因爲即使它不設置它不會破壞你的代碼。我認爲你有點過分複雜。

if($_SESSION['sameAsPostal'] == 1){ 
    //Do your code for checked 
}else{ 
    //Do your code for unchecked 
} 

所以總結一下,確保你session_start()的第一件事就是在你的代碼,並從提交表單的值(0,1)。只大關取決於變量的值一個複選框,你可以做一些簡單的像這樣:

$checked = ($_SESSION['variable'] == 1)?1:0; 
echo "<input type='checkbox' value='$checked' title='My checkbox' />"; 

注意,如果您的發送與AJAX和頁面的形式實際上從未重新加載,然後當然還有PHP沒有按在用戶看到實際頁面之前,它只執行一次,因此不會執行其他任何操作。也許你認爲變量客戶端的變化會被反映出來,但是除非你重新執行那個服務器端代碼(刷新頁面)否則不會。

+0

好的,謝謝你的回覆!您的代碼明確指出,如果會話變量存在並且值爲1,那麼...現在當會話變量設置爲1且用戶與帖子值交互時發生了什麼?我面對的問題是,我不知道如何結合到兩個。它或者或者根據你的代碼,如果會話變量被設置並且保持值爲1,則不管帖子變量是什麼都會觸發......或者應該將帖子相關代碼放在你的前面嗎? –

+0

正在設置會話變量,我檢查了本地會話文件。它只是...我無法取消它,如果它被檢查。 –

+0

當用戶提交表單時,重新分配從'$ _POST'中取出的值並將其存儲在'$ _SESSION'中,以便當它到達檢查它的行時,它具有最新值。 –