За последние 24 часа нас посетили 22032 программиста и 1104 робота. Сейчас ищут 735 программистов ...

form validation [готовое решение, принимаются замечания]

Тема в разделе "Решения, алгоритмы", создана пользователем Koc, 15 фев 2009.

  1. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Добрый день. Есть несколько форм. И классы, которые из обрабатывают. В этих классах есть метод checkForms, который проверяет введенные данные (длина, допустимые символы, нет ли такого логина/мыла в БД). Если происходят ошибки, то мы получаем поле $errors['поле_формы'] = 'Текст ошибки для этого поля'; Далее это дело уже применяем.

    Так вот, как это дело можно оптимизировать? Ну можно сделать что-то для проверки мин, макс длины, символы, но еще придется проверять, есть ли пользователь с таким логином уже, есть ли запрашиваемый атрибут для удаления в базе и тд.

    Если есть какие-то идеи по этому поводу - интересно их услышать.

    UPD: последняя версия и пример расширения своими ф-циями - проверками
    предпоследняя версия и пример проверки на реальной форме
     
  2. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Мне в этой теме Олег(флоппик) несколько ссылок кидал любопытных. Посмотри, возможно поможет.
     
  3. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Ок, спасибо.
    Мне кажется, или у тебя раньше ник был dAllone?
     
  4. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    true
     
  5. sylex

    sylex Активный пользователь

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    это че, щас мода, ники менять? :)
     
  6. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Не угнетайте мну, где-то в глубинах помойки я писал почему я сменил ник :)
     
  7. md5

    md5 Активный пользователь

    С нами с:
    29 янв 2007
    Сообщения:
    250
    Симпатии:
    0
    похоже на actimel =)
    acti regularis с бифидобактериями эсенсис )
     
  8. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
  9. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
  10. klerick

    klerick Guest

    а в чем собственно оптимизацию увидеть хотели? в оптимизации кода или алгоритма(последовательности процессов)?

    я так понимаю вы просто выбрали из имеющихся скриптов более подходящий....
     
  11. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Оптимизация в том, что бы не писать каждый раз в классе что-то*Manage
    PHP:
    1. <?php
    2.     private function checkForm()
    3.     {
    4.         $title = trim($_POST['title']);
    5.         if(!$title)
    6.             $this->errors['title'] = 'поле не заполнено';
    7.         elseif(!$this->id) {
    8.             if($this->db->numRows('SELECT id FROM ?t WHERE title=?s', 'manufacturer', $title))
    9.                 $this->errors['title'] = 'Такой производитель уже присутствует';
    10.         }
    11.        
    12.         $this->values['title'] = $title;
    13.     }
    14.  
    15.     private function checkForm()
    16.     {
    17.         $reWriteUrl = trim($_POST['reWriteUrl']);
    18.         if($reWriteUrl{0} != '/')
    19.             $this->errors['reWriteUrl'] = 'Uri alias must begin with "/"';
    20.         elseif(!strlen($reWriteUrl = substr($reWriteUrl, 1)))
    21.             $this->errors['reWriteUrl'] = 'Uri alias is empty';
    22.         elseif($this->db->numRows(
    23.             'SELECT url FROM ?t WHERE url=?s AND ?c NOT IN(SELECT url_rewrite FROM ?t WHERE ?c=?i)',
    24.             'rewrites', $reWriteUrl, array('rewrites', 'id'), 'goods', array('goods', 'id'), $this->id
    25.         ))
    26.             $this->errors['reWriteUrl'] = 'The page with the same Uri alias already exists, please enter another Uri alias.';      
    27.     }
    28.    
    29. ?>
    а сделать это удобнее и красивее. Пока я ничего не выбрал. Я все еще определеюсь с тем, что именно хочу, и как это должно выглядеть.
     
  12. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    По-бырику накидал такое. Не проверял еще и не отлаживал. Не знаю вот, как ошибки обрабатывать - возвращать коды ошибок или сообщения?

    код помещен в репозиторий
     
  13. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Я бы сообщения сразу выдавал. Коды ошибок хорошо, но придётся запариться с переводом кода ошибки в сообщение. Ну и предусмотрел бы возможность установить свои сообщения для любого правила.
     
  14. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    + еще хочу сделать возможность расширять класс, делать пользовательские ф-ции (на основе класса работы с имеджесами - проверку загружаемых файлов), проверку дублирующихся пользователей и тд.

    Можно в принципе попробовать сразу выдавать сообщения. Нужно подумать, как их устанавливать.

    Такой класс имеет право на существование? Не сильно будет тормозить?


    Посоветуйте по поводу куска, который закомментирован ###. Если к примеру мы вообще не объявили значение какого-то поля (ну какой-то бот отправлял и этот бот не знал, что у меня есть поле hash). Бот посылает запрос, а $_POST['hash'] не объявлен, нет такого ключа. Тогда стоит присвоить ошибку EMPTY и перейти к следующей итерации? Или забить на проверку в этом месте, и подождать когда эта ошибка всплывет или не всплывет при проверке в теле switch?
     
  15. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
  16. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Да нет. У меня вобще каждое правило представлено объектом и ничего, работает.
     
  17. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    а по остальным вопросам можешь что-нить подсказать? Может какие-нить советы есть.
     
  18. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    как можно компактнее записать че-то типа:
    PHP:
    1. <?
    2. $form['name'] = array(
    3.     array('trim'),
    4.     array('nonEmpty', 'Логин не может быть пустым'),
    5.     array('minLength[3]'),
    6.     array('maxLength[10]', 'Имя слишком длинное')
    7. );
    8. $form['mail'] = array(array('mail', 'Некорректный адрес мыла'));
    9. $form['pass'] = array(
    10.     array('trim'),
    11.     array('minLength[6]'),
    12.     array('maxLength[8]', 'Не длиннее 8 символов'),
    13.     array('md5')
    14. );
    15.  
    ?
    json'ом не получится. Сообщения есть не для каждых ошибок
     
  19. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    разве что правила в одну строчку через разделитель какой-нибудь
     
  20. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Советую посмотреть как валидация форм в фреймворке Symfony работает.
     
  21. klerick

    klerick Guest

    Полагаю код:
    Код (Text):
    1.  
    2. if($i = strrpos($rule, '[')) {
    3.              $param = substr($rule, $i+1, -1);
    4.              $rule = substr($rule, 0, $i);
    5.          }
    Будет выглядеть понятней и удобней так:
    Код (Text):
    1.  
    2. list($rule, $param) = explode("[", $rule);
    3. $param = explode("]", $param)[0];
    А так класс довольно интересный. А что касается торможений, то сомневаюсь, поскольку не такие уж и большие формы на обработку пойдут, к тому же количество правил небольшое.[/quote]
     
  22. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    код помещен в репозиторий
     
  23. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Очень хотел задействовать чем-то конструктор. Пожтому:
    По обновлению класса - теперь можно задавать свои сообщения для ошибок. Как в конструкторе так и через отдельный метод. Если сообщение не установлено, то будет возвращен код ошибки.
    + теперь при нахождении в поле какой-либо ошибки остальные проверки по этому полю не проводятся. Возможно это выведу опцией.

    если честно, то не сильно понравился. Я свой делаю по образу CodeInteger, но исходник не смотрел даже, только мануал читал. Есть спорный вопрос на тему requried. Отдельно его как-то задавать или просто в списке правил?

    Что нам даст отдельное задавание: поле как бы необязательно для заполнения (мыло, к примеру). Но если уж ты решил его заполнить, будь добр вводить корректный адрес. Сейчас так нельзя. А это нужная штука. Возможно сделаю что-то типа array('trim', 'nonEmpty', 'mail'), где по проверке на наличие/осутствие nonEmpty будет устанавливаться флаг. Есть флаг и данные введены - проверяем валидность мыла, нет флага и данных - не проверяем.

    нужно подумать об этом. Я первоначально хотел так делать, но: потом все равно к массиву приводить нужно. Регулярка или explode, а это время и ресурсы. Лучше сразу массивом задавать, но много писанины лишней. array(array())

    а разве уже можно писать function()[0]? я думал, что только с 5.3 версии. Ну и по удобству если честно не уверен. 2 раза explode или 3 операции со строками.

    спасибо, старался. Нужно еще расширяемость продумать.

    upd:
    1) как можно оптимизировать рутинные isset (сообщение) : сообщение ? код ошибки?
    2) не слишком ли много используется ссылок?
    3) вводить ли проверки на корректность данных типа "length[]" или "length[ффф]" - некорректно. Или писатель не дурак, сам отловит такие вещи?
    4) может разбавить все это исключениями? При наличии хоть одной ошибки выбрасывать исключение. Или не стоит?
     
  24. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    ап, ответьте че-нить.
     
  25. issa

    issa Активный пользователь

    С нами с:
    31 мар 2009
    Сообщения:
    1
    Симпатии:
    0
    Koc
    Класс понравился :) Все просто и логично.
    Только объясни, плз, для чего нужна customFunction, ежели она ничего не делает?
    PHP:
    1. protected function customFunction($rule, $param, &$value, &$error){}