2012-07-13 122 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 
    } 
}