PHP表单验证问题 - 验证大量输入字段

时间:2012-02-15 20:45:23

标签: php forms validation html-form

我的HTML表单中有20个“输入字段”。

这是一个品尝者:

<input id="a1height" />
<input id="a1width" />
<input id="a1length" />
<input id="a1weight" />

<input id="a2height" />
<input id="a2width" />
<input id="a2length" />
<input id="a2weight" />
...and so on

现在,我需要一种方法:

a)将所有值存储在一个变量中,管道(|)位于高度,宽度,长度和宽度之间。每组之间的重量和\ n b)如果集合中的一个或多个字段不完整,我的变量$ errors设置为true。

我对如何实现这一点感到有点失落。从来没有真正好用循环:'(

有人可以解释一下如何做到这一点吗?

非常感谢!!

4 个答案:

答案 0 :(得分:1)

这是一个解决方案,使用存储所有错误的$errors数组和包含所需输出的$all字符串。要检查,请将var_dump( $all);放在脚本的末尾。

$errors = array();
$all = '';

// Loop over the values 1 through 20
foreach( range( 1, 20) as $i)
{
    // Create an array that stores all of the values for the current number
    $values = array( 
        'a' . $i . 'height' => $_POST['a' . $i . 'height'], 
        'a' . $i . 'width' => $_POST['a' . $i . 'width'], 
        'a' . $i . 'length' => $_POST['a' . $i . 'length'], 
        'a' . $i . 'weight' => $_POST['a' . $i . 'weight']
    );

    // Make sure at least one submitted value is valid, if not, skip these entirely
    if( count( array_filter( array_map( 'is_numeric', $values))))
    {
         // This basically checks if there's at least one numeric entry for the current $i
         continue; // Skip
    }

    // Validate every value
    foreach( $values as $key => $value)
    {
        if( empty( $value))
        {
            $errors[] = "Value $key is not set";
        }
        // You can add more validation in here, such as:
        if( !is_numeric( $value))
        {
            $errors[] = "Value $key contains an invalid value '$value'";
        }
    }

    // Join all of the values together to produce the desired output
    $all .= implode( '|', $values) . "\n";
}

要很好地格式化错误,请尝试以下方法:

// If there are errors
if( count( $errors) > 0)
{
    echo '<div class="errors">';

    // If there is only one, just print the only message
    if( count( $errors) == 1)
    {
        echo $errors[0];
    }
    // Otherwise format them into an unordered list
    else
    {
        echo '<ul>';
        echo '<li>' . implode( '</li><li>', $errors) . '</li>';
        echo '</ul>';
    }

    echo '</div>';
}

答案 1 :(得分:1)

首先应为您的输入创建NAME属性,因为这些属性将在_POST数组中用于指定您的值。

<input id="a1height" name="a1height" />
<input id="a1width" name="a1width" />
<input id="a1length" name="a1length" />
<input id="a1weight" name="a1weight" />

<input id="a2height" name="a2height" />
<input id="a2width" name="a2width" />
<input id="a2length" name="a2length" />
<input id="a2weight" name="a2weight" />

然后,在提交之后,遍历post数组,创建管道连接的varibles

$errors = false;
$string = "";
$current_prefix = '';
foreach($_POST as $key=>$posted_value){
   if(trim($posted_value)==""){ //if the value is empty or just spaces
      $errors = TRUE;
   }
   //find out if we need to add a new line
   $number = preg_replace ('/[^\d]/', '', $key) //get the numbers of the name only
   if ($current_prefix != $number){
       $string .= "\n";
   } else {
      $string .= '|';
   }
   $string .= $posted_value;
}

答案 2 :(得分:0)

  1. 创建一个数组来存储您的值。
  2. 循环输入字段,从字段类型(即'height')解析前缀(即'a1')
  3. 将值插入数组中,如下所示:

    $your_array['a1']['height'] = $_POST['a1height'];

  4. 请记住验证并清理您的输入。

答案 3 :(得分:0)

您可以更改您的html,以便发布的字段包含格式良好的数组:

<input name="a1[height]" />
<input name="a1[width]" />
<input name="a1[length]" />
<input name="a1[weight]" />

<input name="a2[height]" />
<input name="a2[width]" />
<input name="a2[length]" />
<input name="a2[weight]" />

这样你就可以获得一个易于使用的数组。您可以访问$_POST['a1']['height']$_POST['a1']['length']$_POST['a2']['height']