Проверка формы PHP с массивом - вывести имя переменной - PullRequest
0 голосов
/ 06 декабря 2009

Я пытаюсь выполнить проверку формы, помещая значения записей в переменные и эти переменные в массив, а затем циклически перебирая их и выводя сообщения об ошибках для полей, которые не заполнены. У меня есть две проблемы. Во-первых, оператор if выполняется для всех значений, даже если поле пустое или от == до 'undefined', а во-вторых, я не знаю, как распечатать фактическое имя переменной вместо значения переменной. Например

$variable = 'hello';

print_x($variable)//prints 'variable' instead of 'hello'

Я пробовал два метода, которые показаны ниже.

   $error_message = "The following fields must be filled in:<br />";
        $fields_to_validate_arr = array($category,$producer,$product_name,$image_name,$description,$stock_quantity,$min_sale);
        foreach($fields_to_validate_arr as $v){
            if(empty($v) || $v = 'undefined'){//using variable bariables
                //increment the error message with a custom error message. 
                $error_message .= "->" . ucwords(str_replace('_',' ',$v)) . "<br />";//no need to use variable variables
            }
        }

И другой метод, в котором я использую переменные переменные

$error_message = "The following fields must be filled in:<br />";
    $fields_to_validate_arr = array('category','producer','product_name','image_name','description','stock_quantity','min_sale');
    foreach($fields_to_validate_arr as $v){
        if(empty($$v) || $$v = 'undefined'){//using variable bariables
            //increment the error message with a custom error message. 
            $error_message .= "->" . ucwords(str_replace('_',' ',$v)) . "<br />";//no need to use variable variables
        }
    }

Переменные назначаются дальше в моем коде, как

$category = myescape_function($_POST['category']);

Спасибо

Ответы [ 2 ]

1 голос
/ 06 декабря 2009

Нет необходимости создавать собственный массив входных переменных, так как у вас уже есть $ _POST:

$_POST = array_map('myescape_function', $_POST);
foreach($fields_to_validate_arr as $v){
    if(empty($_POST[$v]) || $_POST[$v] == 'undefined'){
       //increment the error message with a custom error message. 
       $error_message .= "->" . ucwords(str_replace('_',' ',$v)) . "<br />";
    }
}

Поскольку значения не хранятся в отдельных переменных, проблема печати имени переменной, а не ее значения, устраняется.

Если вы хотите стать действительно модным, вы можете добавить поддержку пользовательских валидаторов:

function inputExists($name, &$source) {
    return !empty($source[$name]) && 'undefined' != $source[$name];
}
function inputIsNumeric($name, &$source) {
    return inputExists($name, $source) && is_numeric($source[$name]);
}
// checks for U.S. phone numbers only
function inputIsPhone($name, &$source) {
    if (inputExists($name, $source)) {
        // strip whatever non-numeric 
        $value = preg_replace('/[-.,() \t]+/', '', $source[$name]);
        return preg_match('^(1?[2-9]\d{2})?[2-9]\d{6}$', $value);
    }
    return False;
}
function inputMatchesRE($name, &$source, $RE) {
    return inputExists($name, $source) && preg_match($RE, $source[$name]);
}
function nameAndValidator($name, $validator) {
    if (function_exists($validator)) {
        return array('name' => $name, 'validator' => $validator, 'data' => '');
    } elseif (is_numeric($name)) {
        // if index is numeric, assume $validator actually holds the name
        return array('name' => $validator, 'validator' => 'inputExists', 'data' => '');
    } else {
        return array('name' => $name, 'validator' => 'inputMatchesRE', 'data' => $validator);
    }
}

$fields_to_validate_arr = array('name', 'street' => '/^\d+ +[a-z ]+(ave|st|wy|way|ln|lp|blvd)$/i', 'age'=> 'inputIsNumeric', 'phone' => 'inputIsPhone');

$_POST = array_map('myescape_function', $_POST);

foreach($fields_to_validate_arr as $name => $validator){
    list($name, $validator, $data) = nameAndValidator($name, $validator);
    if(! call_user_func($validator, $name, $_POST, $data)){
       //increment the error message with a custom error message. 
       $error_message .= "->" . ucwords(str_replace('_',' ',$v)) . "<br />";
    }
}
1 голос
/ 06 декабря 2009

Что касается вашего первого блока кода, у вас есть ошибка в вашем операторе IF. Вы устанавливали $ v = 'undefined' , который будет принимать значение true каждый раз. Вам нужно использовать оператор равенства для оператора IF.

   $error_message = "The following fields must be filled in:<br />";
   $fields_to_validate_arr = array($category,$producer,$product_name,$image_name,$description,$stock_quantity,$min_sale);
   foreach($fields_to_validate_arr as $v){
       if(empty($v)){ //using variable variables
           //increment the error message with a custom error message. 
           $error_message .= "->" . ucwords(str_replace('_',' ',$v)) . "<br />";//no need to use variable variables
       }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...