За последние 24 часа нас посетили 18055 программистов и 1658 роботов. Сейчас ищут 1559 программистов ...

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

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

  1. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Simpliest
    он самого себя и взвращает
    блин не тупи
     
  2. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Кто-то из нас двоих идиот.

    Код (Text):
    1. !$errors=Validator::Run($_POST)
    2.    ->NoEmpty("Переменная {var} не должна быть пустой")
    3.    ->MaxLength(30,"максимальная длина {var} {arg[1]} символов")
    4.    ->HtmlSpecialEscape()
    Где он самого себя возвращает у HtmlSpecialEscape()? в $errors ты возвращаешь инстанс Validator?
    А какая тогда в жопу проверка с отрицанием "!"
    Или все же там false/null?
    Тогда получается ты в chain методе можешь вернуть что-то отличное от инстанса класса? Ты гонишь.
     
  3. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ты прикалываешься?
     
  4. kostyl

    kostyl Guest

    Приду домой, покажу тру валидатор....
     
  5. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    а ну это я ошибся,сор,
    вот так понятно?
    PHP:
    1.  
    2.  <?
    3.  if(!$errors=Validator::Run($_POST)
    4.    ->NoEmpty("Переменная {var} не должна быть пустой")
    5.    ->MaxLength(30,"максимальная длина {var} {arg[1]} символов")
    6.    ->HtmlSpecialEscape()
    7.    ->End()){
    8.   print "Офыбок нетушки";
    9.  }else{
    10.    print_r($errors);
    11.  }
    12. ?>
    PHP:
    1. <?
    2. class Validator {
    3.    function __construct(){
    4.       die("Фигуфки");
    5.   }
    6. }
    7. ?>
     
  6. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Нет, это ты ерунду написал

    Конструкция вида
    Код (Text):
    1. if(!$errors=Validator::Run($_POST)
    2.    ->NoEmpty("Переменная {var} не должна быть пустой")
    3.    ->MaxLength(30,"максимальная длина {var} {arg[1]} символов")
    4.    ->HtmlSpecialEscape()){
    5.  }else{
    6.    print_r($errors);
    7.  }
    Не имеет смысла, если у тебя возвращается всегда сам объект.

    Потому что всегда будет выполняться else, независимо от результатов работы. Т.е. весь if теряет смысл.

    Возможный вариант правильного использования
    Код (Text):
    1. Validator::Run($_POST)
    2.    ->NoEmpty("Переменная {var} не должна быть пустой")
    3.    ->MaxLength(30,"максимальная длина {var} {arg[1]} символов")
    4.    ->HtmlSpecialEscape();
    5. if($errors = Validator::getErrors()) {
    6.     print_r($errors);
    7. }
    Ошибки мы должны получить отдельно и проверить их наличие отдельно.

    Еще один вариант правильного использования. Это наличие финального метода завершающего цепочку вызовов.
    И уже этот метод может возвращать false/true/null или просто массив с ошибками.
    Код (Text):
    1. if(!$errors=$Validator::Run($_POST)
    2.    ->NoEmpty("Переменная {var} не должна быть пустой")
    3.    ->MaxLength(30,"максимальная длина {var} {arg[1]} символов")
    4.    ->HtmlSpecialEscape()
    5.    ->validate()) {
    6. };
    Мало того что ты смешал фильтрацию с валидацией - бог с ним. Не самый смертельный случай, если правильно пользоваться.
    Но твои примеры абсолютно бессмыслены и поэтому бесполезны.

    Выводов может быть только два.
    Ты действительно так пишешь и считаешь это правильным (это мрак полный).
    Ты допустил ошибку в примере и боишься это признать.
     
  7. Mr.M.I.T.

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

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

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Да, блин отвлекают :(
    Пока напишешь...

    Да. В таком варианте все нормально.
     
  9. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Mr.M.I.T., ты уж извини, но действительно твой подход имеет кое-какие изьяны:
    1. Лично для меня он достаточно нечитаем. Ты засунул в иф ­­— присвоение переменной значения, отрицание и ChainingMethod — if просто распух.
    2. Непонятно, как его расширять ­— под каждый проект изменять дописывать класс?
    3. У тебя весь $_POST проверяется одними правилами ­­— но ведь для разных полей нужны разные правила! Емейл проверить на валидность, пароль — на силу, подтверждение пароля — на совпадение с оригинальным паролем и так далее
    4. Позволю себе согласиться с Simpliest в том, что HtmlSpecialEscape ­— это всё-таки малость из другой оперы. Все-таки изменение данных и проверка их на правильность — это совершенно разные вещи, которые должны производится в разных частях приложения: проверка — при получении данных от пользователя, а изменение — при выводе на экран/записи в базу.

    Вот моё предложение (писал на ходу, хотел подать только идею). Думаю, оно достаточно очевидно, но всё-же почему-то все его опасаются:
    PHP:
    1. <?php
    2. $form = new Validator;
    3. $form
    4.     ->newString(Request::get('nickname'));
    5.     ->addRules(
    6.         new FW\Rules\NotEmpty(),
    7.         new FW\Rules\Length(4, 16),
    8.         new FW\Rules\RegExp('/^[a-z]+$/i')
    9.     );
    10.     ->newString(Request::get('password'))
    11.     ->addRules(
    12.         new FW\Rules\NotEmpty(),
    13.         new FW\Rules\MinLength(3),
    14.         new App\Rules\PasswordStrength(40)
    15.     );
    16.     ->newString(Request::get('confirm'))
    17.     ->addRules(
    18.         new FW\Rules\NotEmpty(),
    19.         new FW\Rules\Equals(Request::get('password'))
    20.     )
    21.     ->newString(Request::get('email'))
    22.     ->addRules(
    23.         new FW\Rules\NotEmpty(),
    24.         new FW\Rules\ValidEmail(Request::get('email'))
    25.     );
    26. if ($form->isValid()) {
    27.     reg_user(Request::get('nickname'), Request::get('password'), Request::get('email'));
    28. } else {
    29.     print_r($form->getErrors());
    30. }
    При том, допустим, в нашем фреймворке (FW) есть какой-то список базовых правил. Но наше приложение требует какие-то специфические правила (например, проверка того, что данный код — это действительно валидное название координат в формате XX.YY:ZZ.KK) — такая проверка не требуется в фреймворке по-умолчанию и будет излишней для других проектов. Мы создаем это правило в нашем приложении и не нагружаем фреймворк! ( App\Rules\PasswordStrength(40) в примере )
     
  10. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    TheShock
    ёблянах =)
    этот код что ты написал, я даже обсуждать не хочу

    1. Ну дак вынь из ифа
    PHP:
    1. <?
    2. $errors=validator bla bla bal
    3. if(!$errors)
    4. ?>
    2. Я для кого писал?
    PHP:
    1. <?
    2. $validator->Exec("myvalidator")
    3. $validator->ExecErrors("myDefaultErrorsData");
    4. ?>
    3. Есть там, мне просто лень было писать очевидное
    validator::Run($_POST,array("key1","key2"))
    4. Какая нафиг разница из какой оно оперы? главное удобно и практично
     
  11. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Mr.M.I.T., вот посмотри — я тебе корректно и грамотно ответил, без всяких оскорблений, или наездов. Вот хули эти понты "твой код я даже обсуждать не хочу"? Конечно не хочешь, потому-что в отличии от твоего говна тут обсуждать нечего — всё логично, красиво и понятно
     
  12. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    С последнее время на форуме все мы только сремся друг с другом.
    Что сказать - осень! =)
     
  13. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    TheShock
    я тебе вроде предлагал if...else переписать? =)

    ты мне нифига не грамотно ответил, ты даже не вник и написал ересь

    вот я те отвечаю более расширено =)
    1. то что ты написал в 2 раза больше моего, больше жрёт ресурсов
    2. то что ты написал вообще заменяется парой обычных ифов
    3. то что ты паписал типичный пример ООП ради ООП

    ps/ перепиши уже весь php давай не мелочись

    так и должно быть
     
  14. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Мне тут еще товарищ предлагает воспользоватся YAML для валидации. Что-то типа такого:

    Код (Text):
    1. UserReg:
    2.     Nickname:
    3.         NotEmpty: true
    4.         Length: [4, 16]
    5.         RegExp: /^[a-z]+$/i
    6.     Password:
    7.         NotEmpty: true
    8.         MinLength: 3
    9.         PasswordStrength: true
    10.     Confirm:
    11.         NotEmpty: true
    12.         Equals: Password
    13.     Email:
    14.         NotEmpty: true
    15.         ValidEmail: true
    PHP:
    1. <?php
    2. $form = new YamlValidator ('UserReg', $_REQUEST);
    3. if ($form->isValid()) {
    4.     user_reg(/**/);
    5. } else {
    6.     print_r($form->getErrors());
    7. }
    8.  
     
  15. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    что за тупые нлп-приёмы? при чём тут "переписать вес пхп"? я показал стандартные, всем известные возможности пхп.

    если ты гонишься за размером кода ­— пиши на HQ9+, это язык как раз для тебя.
    а на счёт ресурсов — утверждение голословное. доказательства.
    тем более оно у меня в два раза больше, потому что я написал разные проверки четырёх полей, а ты все поля проверил одинаково (ну и глупость, боги!)

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

    эээх. хотел прокомментировать, да не буду...
     
  16. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ну понесло, ответить видно больше нечего потому что сам всё понял?

    отвечу на одну здравую фразу
    я расчитывал на вашу фантазию.
    PHP:
    1. <?
    2. $errors=Validator::Run($_POST)
    3.    ->NotEmpty("Ошибка тут",array("key1","key2"))
    4.    ->maxLength(30,"Ошибка тут",array("key3","key5"))
    5.    ->HtmlSpeclEscape(/*...логика ясна ..*/);
    6.  
    7. /* Ещё */
    8.  
    9. $errors=Validator::Run($_POST,array("key1","key2"))
    10. ?>
     
  17. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    да нет, задолбался просто отвечать на этот вопрос таким умственно-отсталым, как ты.
     
  18. Mr.M.I.T.

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

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

    kostyl Guest

    может пожмете друг другу руки и типа того... Или хотя бы четко сформулируйте недостатки не понравившихся реализаций. Идеально было бы эти недостатки решить потом совместно - то есть прийти к общему мнению. Этого очень недостает в дискуссиях на этом форуме, потому что все выделываются своими способностями и решениями. Конечно идеального не существует. Но лучше остановиться на более-менее приемлемым, или просто остановится. А наезжать друг на друга - дерьмовое это дело. Не так ли?
     
  20. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    kostyl
    да он козёл просто =)) не вникая пишет, думать не хочет
    я голосую на отмену валидаторов как единых структур!
    однако в контексте этого топика, решение я привёл аж 2 раза

    смысл в том чтобы выложить своё решение и обосрать чужое
    кто сильнее и обоснованнее чужое обосрал тот и прав
     
  21. kostyl

    kostyl Guest

    Mr.M.I.T.
    ну можно было хотя бы написать этот пост без слова козёл:
    Ну а TheShock стоило бы ответить:
    и было бы намного лучше...
     
  22. sorteros

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

    С нами с:
    28 авг 2009
    Сообщения:
    54
    Симпатии:
    0
    Хватит уже хуями мериться. Как это по нашему: надо не только представить свою позицию, но и обосрать того, чья позиция отличается от твоей.
     
  23. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    мда, типа, каждый понял в меру своей испорченности
    ладно плевать мне, по смоему подходу я уже достаточно постов написал
     
  24. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    kostyl, а я изначально так и попробовал поступить. но видишь, он не понимает нормальный язык
     
  25. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    замечательно бы было еслиб ещё дурь не писал =)