[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Упростить
Mirexzpalich
В общем, решил написайть небольшой, но довольно крепкий сайтец. Как же без валидации вводимых данных?
Решил написать небольшой класс, который этим и будет заниматься. (Не особо люблю готовые решения. jQuery исключение :) )
Для начало надо было решить, как все это будет работать...
Первое что пришло на ум это передавать массив с ключами ТИП ВАЛИДАЦИИ и ЗНАЧЕНИЕ для валидации
Н-р:

array(
'valid' => ШАБЛОНЫ
'value' => ЗНАЧЕНИЕ
)

Теперь осталось разобраться с передачей инфы о валидации... ну тут просто, как и везде что-то типа 'maxlen[35]|email|null'...

[1] => Array
(
[
value] => insert_em@fefef
[valid] => email
)

[
2] => Array
(
[
value] => ins
[valid] => minlen[5]|maxlen[25]
)


Теперь сам класс

/**
* Класс валидации
*
**/



/*
Ошибки:
1 => Превышена максимальная длинна
2 => Меньше минимальной длины
3 => Не является мылом
4 => Не соответствует указанному шаблону
5 => Не содержит целое число
6 => Не содержит число
7 => Не заполнено
8 => Только латиница

*/

class validator
{
function valid(array $array)
{
// Массив ли был передан?
if(!is_array($array))
{
trigger_error('In function validaror::valid() parametr is not array.'.errorFileLine(debug_backtrace()),E_USER_WARNING);
return false;
};

//Массив ошибочеГ
$error = array();

//Просматриваем элементы
foreach($array as $key => $info)
if(!empty($info['valid']))
{
// Получили массив прохожения валидации
$valid_array = array_diff(explode("|",$info['valid']),array(''));
// Делаем проверку валидности
foreach($valid_array as $value)
{
// Необходимо если есть какое-то соответвсвие н-р: maxlen[25]
$match = '';
// Сморим есть ли соответствие
if(preg_match("#\[.+\]#",$value,$match)) $match = $match[0];
// Выделяем метод
$valid_method = str_replace($match,'',$value);
// Выделяем соответствие
$match = preg_replace("#^\[|\]$#",'',$match);
// Смотрим, есть ли такой метод валидации
if(method_exists($this,$valid_method))
{
// Если есть, то вызываем метод, передаем ему параметры
$error[$key] = $this->$valid_method($info['value'],$match);
// Если была ошибка выйдем из валидации для этого значения
if($error[$key]) break;
}
}
}


return $error;
}

// Максимальная длинна
function maxlen($value,$size)
{
if(strlen($value)>((int)$size)) return 1;
return false;
}

// Минимальная длинна
function minlen($value,$size)
{
if(strlen($value)<((int)$size)) return 2;
return false;
}

// корректность мыла
function email($value)
{
if(preg_match("#[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+#",$value)) return false;
return 3;
}

// корректность шаблона
function regular($value,$pattern)
{
if(preg_match($pattern,$value)) return false;
return 4;
}

// Только целые числа
function onlyint($value)
{
if(preg_match("#^[0-9]*$#",$value)) return false;
return 5;
}

// Только числа
function onlynum($value)
{
if(preg_match("#^\d+(\.\d*)?$#",$value)) return false;
return 6;
}
// Заполненно ли?
function null($value)
{
if(strlen($value)) return false;
return 7;
}
// Только латиница
function onlylatin($value)
{
if(preg_match('#^[A-Za-z]*$#',$value)) return false;
return 8;
}
}


Как видим, получилось многа которые функций, которые портят всю красоту...
Вопрос. Как переделать, чтобы было этичнее?



Спустя 4 минуты, 48 секунд (1.07.2011 - 22:32) Dezigo написал(а):
Класс который несодержит свойства - это не класс. Это в твоём случаее куча функций.
Не проще тебе сделать файл с функциями для обработки?
И второе - возврощай true или false.

Спустя 1 минута, 56 секунд (1.07.2011 - 22:33) Mirexzpalich написал(а):
Dezigo
это только часть класса.... которая меня не очень устраивает....

Спустя 51 секунда (1.07.2011 - 22:34) Mirexzpalich написал(а):
Цитата
Не проще тебе сделать файл с функциями для обработки?

Поподробнее пожалуйста

Спустя 3 минуты, 44 секунды (1.07.2011 - 22:38) Dezigo написал(а):
Ну смотри в проекте есть файл , который ты подключаешь и он имеет функции для обработки, который ты используешь и проверяешь - правельно или не правельно.
При этом тебе не надо создавaть объект.

То что ты возврощаешь 1,2 ,3,4,5 как ты потом это будешь использовать?
Функция is_array она же тебе не возврощает например return 5.? И что с этим делать?

Спустя 2 минуты, 27 секунд (1.07.2011 - 22:40) Winston написал(а):
Цитата (Mirexzpalich @ 1.07.2011 - 22:34)
Поподробнее пожалуйста

Он имеет ввиду, чтобы убрал
class validator
{}
и оставил только ф-и smile.gif

Спустя 4 минуты, 38 секунд (1.07.2011 - 22:45) Dezigo написал(а):
Цитата (PHPprogramer @ 1.07.2011 - 19:40)
Цитата (Mirexzpalich @ 1.07.2011 - 22:34)
Поподробнее пожалуйста

Он имеет ввиду, чтобы убрал
class validator
{}
и оставил только ф-и smile.gif

Правильно.
При этом фунции
is_numeric, is_array и тд. Не нужно же создавать объект что бы сними работать .

Спустя 44 секунды (1.07.2011 - 22:46) Mirexzpalich написал(а):
Dezigo
PHPprogramer
Понял о чем вы... Время вечернее, голова тупит. Можно и так. Но тут представлена только часть класса... Там и свойства есть и конструкттор и еще пара вкусностей.... =)

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


Только что пришла одна идейка... как наваяю - отпишу smile.gif

Спустя 21 минута, 48 секунд (1.07.2011 - 23:08) Invis1ble написал(а):
Mirexzpalich
Я месяца 4 назад баловался, написал небольшой валидатор, но он завязан на всей системе, сырой и я им в реальных проектах еще не пользовался smile.gif
Собственно, получился мини-фреймворк.

Спустя 13 минут, 17 секунд (1.07.2011 - 23:21) Mirexzpalich написал(а):
Invis1ble
Можешь показать, что у тебя за валидатор вышел?

Спустя 3 минуты, 42 секунды (1.07.2011 - 23:25) Invis1ble написал(а):
Mirexzpalich
Могу smile.gif Но рассматривать надо в контексте всей системы, поэтому прикрепляю архив.
Сам валидатор - libs/core/lfValidator.class.php
Громко не смеяться, делалось все за пару дней for fun smile.gif

Спустя 44 минуты, 16 секунд (2.07.2011 - 00:09) Mirexzpalich написал(а):
Invis1ble
Пасиба... покурю на ночь =)

Вот как я переделал свое решение
Все эти валидации - сплошная регулярка по сути... Но есть исключения... их мона добвить и обработать отдельно.

class validator
{
var $pattern = array();

function validator()
{
$this->pattern = array(
'maxlen' => array(
'pattern' => '.{0,%%0%%}',
'error' => 1
),
'length_between' => array(
'pattern' => '.{%%0%%,%%1%%}',
'error' => 4
),
'minlen' => array(
'pattern' => '.{%%0%%,}',
'error' => 2
),
'email' => array(
'pattern' => "[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+",
'error' => 3
)
);

}


function valid(array $array)
{
// Массив ли был передан?
if(!is_array($array))
{
trigger_error('In function validaror::valid() parametr is not array.'.errorFileLine(debug_backtrace()),E_USER_WARNING);
return false;
};

//Массив ошибочег
$error = array();

//Просматриваем элементы
foreach($array as $key => $info)
if(!empty($info['valid']))
{
// Получили массив прохожения валидации
$valid_array = array_diff(explode("|",$info['valid']),array(''));
// Делаем проверку валидности
foreach($valid_array as $value)
{
// Необходимо если есть какое-то соответвсвие н-р: maxlen[25]
$match = '';

// Сморим есть ли соответствие
preg_match_all("#\[([^\]]+)\]#",$value,$match);

// Выделяем метод валидации
$pattern = preg_replace("#\[.+\]#", '', $value);

// Смотрим, есть ли такой способ валидации
if(array_key_exists($pattern,$this->pattern))
{
//Собирем массив для подмены
$match[0] = explode("|",'%%'.implode('%%|%%',array_keys($match[1])).'%%');

// Если есть, то проверяем метод, передаем ему параметры
$exec = "#^".str_replace($match[0],$match[1],$this->pattern[$pattern]['pattern'])."$#";

// Выполним
if(!preg_match($exec,$info['value'])) $error[$key] = $this->pattern[$pattern]['error'];
// Если была ошибка выйдем из валидации для этого значения
if(!empty($error[$key])) break;
}
}
}


return $error;
}
}


Спустя 7 минут, 28 секунд (2.07.2011 - 00:16) Invis1ble написал(а):
Да, там кстати лишняя директория nbproject, забыл ее удалить перед сжатием

Спустя 22 минуты, 41 секунда (2.07.2011 - 00:39) Mirexzpalich написал(а):
Invis1ble
для пары дней не плохой результат smile.gif Но у тебя как и в моем первом варианте - слишком много однотипных действий... не люблю это...


_____________
Дорогу осилит идущий...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.