Проблема с проверкой формы PHP - Проверка большого набора полей ввода - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть 20 "наборов" полей ввода в моей HTML-форме.

Вот дегустатор:

<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 между каждым набором б) если одно или несколько полей в наборе являются неполными, моя переменная $ errors устанавливается в true.

Я немного растерялся из-за того, как мне этого добиться. Никогда не очень хорошо с петлями: '(

Может кто-нибудь объяснить, как это сделать?

Большое спасибо !!

Ответы [ 4 ]

1 голос
/ 16 февраля 2012

Вот решение, использующее массив $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 голос
/ 16 февраля 2012

Сначала необходимо создать свойства 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, создав переменные, соединенные с конвейером

$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;
}
0 голосов
/ 16 февраля 2012

Вы можете изменить 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'].

0 голосов
/ 16 февраля 2012
  1. Создайте массив для хранения ваших значений.
  2. Переберите поля ввода, анализируя префикс (например, 'a1') по типу поля (например, 'height')
  3. Вставьте значения в массив следующим образом:

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

  4. Не забудьте проверить и дезинфицировать ваш ввод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...