2012-07-13 124 views
1

我有一個php頁面,我試圖簡化並遇到一些我無法單獨通過的問題。我的表單將用戶數據,發佈到自身,驗證字段已填寫,然後將表單內容/帖子顯示到mysql數據庫。如果聲明在Foreach循環中

我遇到的問題是,我不想讓20個if()/ elseif語句將變量名加載到數組中,通過該數組循環,並且如果變量未在表單中填充,產生一條錯誤信息。不幸的是,無論字段是否有值,我的代碼都會顯示錯誤消息。

作爲一個附加說明,我可以將$ ShippingCo添加到我的表單中並回顯它,但是它尚未完成的通知仍顯示出來。

此外,如果腳本輸入if語句,我希望它在關閉後停止執行頁面的其餘部分我試過退出;沒有成功。

以下是我有:

<?php 

$ShippingCo = $_POST['ShippingCo']; 
$ShipAcct = $_POST['ShipAcct']; 
$ShipService = $_POST['ShipService']; 
$FOB = $_POST['FOB']; 
$Terms = $_POST['Terms']; 

$ENote[] = '$Terms'; 
$ENote[] = '$FOB'; 
$ENote[] = '$ShippingCo'; 
$ENote[] = '$ShipAcct'; 
$ENote[] = '$ShipService'; 

$Emessg[] = 'Shipping Terms'; 
$Emessg[] = 'FOB Method'; 
$Emessg[] = 'Shipping Company'; 
$Emessg[] = 'Shipping Account'; 
$Emessg[] = 'Shipping Service Type'; 


foreach ($ENote as $a => $b) { 

if(!$$ENote[$a]){  //I intentionally put the '$$' in this line otherwise none of the messages show. . . with data in the variables or not. 

$error = "Error! Please Add the $Emessg[$a]!"; 
?> 
<table width="800" align="center"> 
<tr> 
<td align="center"> 

<h2>Sales Order Entry Form</h2> 
</td> 
</tr> 
<tr> 
<td align="center"> 
<h3> 
<font color="red"> 
<?php 
echo "$error"; 
?> 
</font> 
</h3> 
</td> 
</tr> 
<tr> 
<td align="center"> 
Please press back to properly complete the form</td> 
</tr> 
</table> 

<?php 
} 
} 
?> 

預先感謝您。

+0

阿斯克爾知道,並且實際上是在利用它。 – 2012-07-13 23:37:34

回答

1

我懷疑語法$$ENote[$a]可能被解釋爲($$ENote)[$a]而不是$($ENote[$a])(括號不是合法的語法,僅供演示使用)。

所以我建議一箇中間變量,否則複雜的語法:

foreach ($ENote as $a => $b) { 
    $varname = $ENote[$a]; 
    if(!$$varname){ 

或(沒有測試,只是憑直覺認爲它可能工作):

foreach ($ENote as $a => $b) { 
    if(!${$ENote[$a]}){ 
+0

完美。謝謝。 – user1459766 2012-07-14 00:11:59

0

你爲什麼不只是創建一個數組或所有的字段,並將該數組傳遞給函數,並在該函數中循環遍歷每個項目,如果爲空則拋出錯誤?

事情是這樣的:

function checkEmpty($some_array) { 
    foreach($some_array as $key=>$value) { 
     if($value=="") { 
     or if(empty($key)) { ///throw error } 
     //put error message and exit 

     } 

    } 
    } 
0

有幾個問題在這裏打球。

首先,每個$ENote條目必須省略前導$Variable variables不得包含$部分。

$ENote[] = 'Terms'; 
$ENote[] = 'FOB'; 
... 

其次,ctrahey說,你需要將變量名存儲到一個變量,以便與其他$將其展開。

這裏有一些代碼清理提示:

  • 合併兩個陣列成一個(地圖)。
  • 在循環內從$_POST分配給命名變量。使用break退出循環。

這會消除很多冗餘。

$ENote = array(
    'Terms' => 'Shipping Terms', 
    'FOB' => 'FOB Method', 
    ... 
); 

foreach ($ENote as $field => $title) { 
    $value = $$field = $_POST[$field]; 
    if (!$value) { 
     ... display error using $title ... 
     break; // exit loop 
    } 
}