1

我有一个 php 页面,我正在尝试简化它并且遇到了一些我无法单独解决的问题。我的表单获取用户数据,发布到自身,验证字段是否已填写,然后将表单内容/发布到 mysql 数据库。

我遇到的问题是,我不想有 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
}
}
?>

先感谢您。

4

3 回答 3

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]}){
于 2012-07-13T23:43:13.737 回答
0

为什么不创建一个数组或所有字段并将该数组传递给一个函数,然后在该函数中循环遍历每个项目,如果为空则抛出错误?

像这样的东西:

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

       }

    }
  }
于 2012-07-13T23:45:44.593 回答
0

这里有几个问题在起作用。

首先,每个$ENote条目必须省略前导$变量变量不得包含该$部分。

$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
    }
}
于 2012-07-14T00:13:25.133 回答