Netadmin.ws

Data Validator v1.0
Дата: 13.12.2005 - 20:17
Тема: Сборник рецептов
Представляю вашему вниманию универсальную функцию для проверки значений переменных, которая с успехом может использоваться для проверки переданных данных, например через $_POST, $_GET etc. Функция может проверять имеет ли переменная пустое значение, максимальную и минимальную длину строки, а также проверять строку по заданному регулярному выражению. На данный момент функция имеет встроенное регулярное выражение для проверки правильности формата адреса электронной почты. В дальнейшем планируется добавить возможность проверки гиперссылок. Для более детальной информации смотрите ниже предоставленный код.





PHP:

/**
/* PHP function Data Validator v1.0
/* author: polo
/* website: http://netadmin.ws
/* Функция для проверки ошибок в переменных.
/* Идеально подходит для проверки введенной пользователем информации.
/* В качестве первого аргумента получает проверяемый массив,
/* в нашем случае может быть $_POST, $_GET...
/* В качестве второго аргумента должна получить массив с параметрами для каждого поля
/* ключи массива должны совпадать с ключами проверяемого массива.
/* Пример массива параметров:
/* array(
/*   'field_name' => array(
/*                     'req' => boolean, // может ли поле иметь пустое значение
/*                     'regexp' => string, // валидное регулярное выражение PCRE для проверки значения поля или 'email' для проверки email адреса
/*                     'min' => int, // минимальное значение поля
/*                     'max' => int, // максимальное значение поля
/*                     'unset' => boolean // удалить переменную в случае ошибки
/*                   )
/* )
*/
function validate_data(&$arry$params)
{
    
// массив ошибочны переменных
    
$error = array();
    
// сообщения которые будут выдаваться как ошибки
    
$phrase = array(
                
'req' => 'Поле обязательно',
                
'bad' => 'Неверный формат',
                
'short' => 'Слишком короткое. Должно содержать не менее %s символов.',
                
'long' => 'Слишком длинное. Должно содержать не более %s символов.'
              
);
    
    
// проходимся по массиву параметров и проверяем на валидность
    
foreach ($params AS $f_name => $f_info)
    {
        if (
$f_info['req'] AND strlen($arry[$f_name]) == 0// обязательно ли поле, пустое?
        
{
            
$error[$f_name] = $phrase['req']; // устанавливаем ошибку для данного поля
            
if ($f_info['unset']) // удаляем переменную если требуется
            
{
                unset(
$arry[$f_name]);
            }
        }
        elseif((
$f_info['min'] AND $f_info['min'] > 0) AND (($len strlen($arry[$f_name])) > AND $len $f_info['min'])) // миниму символов
        
{
            
$error[$f_name] = sprintf($phrase['short'], $f_info['min']);
            if (
$f_info['unset'])
            {
                unset(
$arry[$f_name]);
            }
        }
        elseif((
$f_info['max'] AND $f_info['max'] > 0) AND strlen($arry[$f_name]) > $f_info['max']) // максимум символов
        
{
            
$error[$f_name] = sprintf($phrase['long'], $f_info['max']);
            if (
$f_info['unset'])
            {
                unset(
$arry[$f_name]);
            }
        }
        elseif ((
$f_info['regexp'] AND !empty($f_info['regexp'])) AND !empty($arry[$f_name])) // проверяем по регулярному выражению
        
{
            switch (
$f_info['regexp'])
            {
                case 
'email':
                    
// обратный слеш между & и '
                    
$regexp '#^[a-z0-9.!#$%&'*+-/=?^_`{|}~]+@([0-9.]+|([^s]+.+[a-z]{2,4}))$#si';
                    break;
                //case 'url': TODO
                default:
                    
$regexp = $f_info['regexp'];
            }
            if (!preg_match(
$regexp$arry[$f_name]))
            {
                
$error[$f_name] = $phrase['bad'];
                if (
$f_info['unset'])
                {
                    unset(
$arry[$f_name]);
                }
            }
        }    
    } // end foreach
    
    return 
$error;
}


Скрипт для проверки работы:

PHP:
<?php
// скрипт проверки Data validator
$show_form true;
$error null;
$fields_check = array(
                    
'name' => array(
                                
'req' => true,
                                
'regexp' => '',
                                
'min' => 6,
                                
'max' => 60,
                                
'unset' => false
                                
),
                    
'email' => array(
                                
'req' => true,
                                
'regexp' => 'email',
                                
'min' => 6,
                                
'max' => 60,
                                
'unset' => false
                                
),
                    
'phone' => array(
                                
'req' => false,
                                
'regexp' => '#+{0,1}[0-9 -]+#'// обратный слеш перед первым плюсом
                                
'min' => 7,
                                
'max' => 25,
                                
'unset' => true
                                
)
                );

if (
$_SERVER["REQUEST_METHOD"] == 'POST')
{
    
$show_form false;
    
$error validate_data($_POST$fields_check);
    if (empty(
$error))
    {
        echo 
'Все верно. Можно продолжать.';
    }
    else
    {
        
$show_form true;
    }
}


if (
$show_form)
{
?>
<form id="form" name="form" method="post" action="test.php">
  Полное имя*: 
  <input name="name" type="text" id="name" tabindex="1" value="<?php echo $_POST['name']; ?>" size="50" />
  <?php if($error['name']) echo '<font color="red" size="1">' $error['name'] . '</font>'?>
   <br />Email*: 
  <input name="email" type="text" id="email" tabindex="2" value="<?php echo $_POST['email']; ?>" size="50" />
  <?php if($error['email']) echo '<font color="red" size="1">' $error['email'] . '</font>'?>
   <br />Телефон : 
  <input name="phone" type="text" id="phone" tabindex="3" value="<?php echo $_POST['phone']; ?>" size="50" />
  <?php if($error['phone']) echo '<font color="red" size="1">' $error['phone'] . '</font>'?>
  
  <br /><br />

  <input type="submit" name="Submit" value="Отправить" />
</form>
<?php
}
?>



Посмотреть рабочую версию функции

Обсуждение статьи

Примечание: Данная статья является собственностью netadmin.ws, любое ее использования за пределами сайта netadmin.ws строго воспрещается.
Эта статья находится по адресу:
http://netadmin.ws/article.php?sid=78