Xpoint
   [напомнить пароль]

Идеологически правильная проверка данных из формы

Метки: [без меток]
2006-02-17 16:02:17 [обр] Антон Иконников(0/30)[досье]

Подскажите, пожалуйста, где почитать по следующему вопросу.

Есть форма, в которой юзер должен ввести некоторые данные (например, номер телефона). Нужно сделать проверку до отправки формы на тот случай, если пользователь ошибся (в этом случае, alert ему какой-нибудь выдать). А также сделать проверку на сервере после отправки формы, на тот случай, если враг нам вместо номера всякую хрень подсовывает, или у юзер JS отключен (в этом случае хотелось бы опять показать форму с уже заполненными полями и какой-нибудь надписью рядом с неправильным полем). Вопрос в том, как это сделать наиболее универсально и оптимально.

спустя 16 минут [обр] Thirteensmay(0/157)[досье]
Универсально и оптимально - взаимоисключающие вещи ;) Универсально делал так: писал Jскрипт который при отправке формы проверял все поля с заданными постфиксами в имени например: _data - проверка на тип дата, _number - на нумбер - ессно поля в форме должны называться соответствующим образом. На приеме тоже можно обертку для взятия параметров написать... Еслиже нужно оптимально - то все ручками... (на Assemblere :) Вам решать...
спустя 30 минут [обр] Алексей Севрюков(0/1292)[досье]
Thirteensmay[досье] _data => _date :-)
спустя 56 минут [обр] Андрей Брайнин(3/127)[досье]
Thirteensmay[досье] пре/постфиксы - зло. валидация не должна зависеть от названия поля.
Антон Иконников[досье] решение сильно завсисит от ваших подходов к построению форм.
идеальное решение - использование т.н. серверных контролов.
Контрол - это, грубо говоря, некий серверный код, отвечающий за HTML-представление одного поля (простого или составного) формы и прием данных этого поля.
на данный момент такой подход (хоть, и на мой взгляд, крайне криво) реализован в стандартном ASP.NET.
т.к. тема достаточно объемна, я не буду ее здесь разворачивать. почитайте про ASP.NET - будет полезно познакомиться с подходом. надо заметить, что внешне валидация в ASP.NET выглядит ровно так, как вы хотите.
спустя 1 час 41 минуту [обр] Thirteensmay(0/157)[досье]
Алексей Севрюков[досье] О, Да ;) давеча обозвал столбик в базе как DESC (ну типа описание будет), так 3 часа убил чтобы понять в чем ошибся ;)
Андрей Брайнин[досье] Идеальных решений не бывает...
Антон Иконников[досье] Все зависит от конкретной задачи
спустя 16 минут [обр] schleicher(0/7)[досье]
Ну да, скорее всего контрол - это лучшее, что тут может быть. Забавная тема для вас - это еще и Xforms, в которых описываются и данные и их визуализация. Можно глянуть. А по этим мотивам создать контрол. Я сделал как-то раз для себя подобие xforms - грубо говоря, объект описывающий поля и правила их валидации. Собственно, все равно - валидация осуществляется и на клиенте и на сервере (на сервере валидация всегда обязательна).
И еще AJAX всему.
спустя 6 часов [обр] Victor Gr.(0/20)[досье]

А что, если при выводе страницы, возле каждого поля для ввода заготавливать место для вывода ошибки. К примеру, на JavaScript (предпочтительнее) или в скрипте на сервере, в шаблоне. Если всё в порядке: там ничего не выводится. Если ошибка, то в переменной, которая обычно должна быть пуста - текст ошибки.

Впрочем, проще это же сделать в самом верху страницы, опять же, JavaScript-ом.

Так вот. Пользователь вводит данные, они отправляются серверу. Серверный скрипт же, вместо того, чтобы сразу выдавать пользователю информацию, проверяет поля. Если какое-то поле не соответствует допустимому содержанию - перепрыгивает на код, который обрабатывает ошибки. Ну, а там уже в зависимости от ситуации :)

Т.е. выглядеть эту будет примерно так:

Заполнение формы.
Пересылка её серверу.

  [ скрипт ]
  Проверка полей на валидность.
    Если всё ОК: продолжение работы. -> [ вывод страницы ]
    Если ошибка: редирект на обработчик ошибок -> [ обработчик ошибок ]

  [ вывод страницы ]
  ...

  [ обработчик ошибок ]
  Посмотреть в чём ошибка.
  Присвоить переменной $error текст описание ошибки.
  Снова показать предыдущий шаблон, в котором $error уже будет с описанием ошибки.
спустя 2 дня 8 часов [обр] Антон Иконников(0/30)[досье]
Victor Gr.[досье]
Ага, а если два поля: e-mail и текст. e-mail неправильно заполнили, а в текстовом поле статья на мегабайт. Все это на сервер отправляется, мыло неправильное, опять показываем форму (заполненную, к счастью) и юзеру приходится опять мегабайт отправлять?
спустя 3 дня [обр] Victor Gr.(0/20)[досье]

Антон Иконников[досье]
почему "Ага?". Делайте как хотите.

Я предпочитаю проверять верность введенных данных JavaScript-ом на клиенте (рег.вырами те же email-ы). Если JavaScript отключен (умышленно или нет) - проверка дублируется на сервере.

Да, если у пользователя отключен JavaScript и он не может ввести без ошибок своей email - ага, пусть снова мегабайт отправляет.

Powered by POEM™ Engine Copyright © 2002-2005