Проверка формы PHP - PullRequest
       22

Проверка формы PHP

0 голосов
/ 12 мая 2010

На этот вопрос, несомненно, будет сложно ответить и задать вопрос, который имеет смысл, но я буду стараться изо всех сил:

У меня есть форма, которая использует PHP для отображения определенных разделов формы, таких как:

<?php if ($_SESSION['EnrType'] == "Individual") { display only form information for individual enrollment } ?>

и

<?php if ($_SESSION['Num_Enrs'] > 6) { display only form information for 7 total members enrollment } ?>

В каждом элементе формы собирается уникальная информация о каждом зачисленном, но основные критерии для каждого зачисляемого одинаковы, т. Е. Все зачисленные участники должны иметь значение в поле FirstName. Каждое поле названо в соответствии с номером зачисленного, то есть Num1FirstName; Num2FirstName.

У меня есть скрипт проверки PHP, который просто фантастический, и я не собираюсь его менять, но проблема, с которой я сталкиваюсь, - это дублирование сценария для проверки ВСЕХ полей одним махом.

При отправке все элементы POSTED запускаются через мой сценарий проверки и на основании установленных правил возвращают ошибку, если они не равны true.

Пример кода:

if (isset($_POST['submit']))
{
  // import the validation library
  require("validation.php");

  $rules = array(); // stores the validation rules

  //All Enrollee Rules
  $rules[] = "required,Num1FirstName,Num2FirstName,The First Name field is required.";

Сценарий, приведенный выше, выполняет следующее: $ rules [] = "ТРЕБОВАНИЕ, имя поля, сообщение об ошибке" где требование определяет критерии (в данном случае это просто передача значения), fieldname - это имя проверяемого поля, а сообщение об ошибке возвращает использованную ошибку.

Моя цель состоит в том, чтобы использовать ту же формулу, что и выше, чтобы $ rules [] проходил через ВСЕ имена и возвращал сообщение об ошибке ТОЛЬКО, если они существуют (т.е. не проверяйте имя участника # 7, если его нет на экране).

Если я просто вставлю запятую между «именами полей», это будет проверять только первое, второе и т. Д., Так что это не сработает.

Есть идеи?

1 Ответ

0 голосов
/ 12 мая 2010

Если я понимаю, что вы пытаетесь сделать правильно:

1. Определить типы
Во-первых, вам нужно определить, какой тип поля требует каких правил, например: $type['FirstName']['requirement'] = 'required'; $type['FirstName']['error_message'] = 'The First Name field is required.';<br> // just random example: $type['MobilePhone']['requirement'] = 'optional'; $type['MobilePhone']['error_message'] = 'Only enter digits.';

2. Просмотрите каждое объявленное значение
Во-вторых, проверьте для каждого проведенного значения, какой это тип поля. Теперь многие вещи могут быть включены в массив $_POST, и вам нужно только проверить определенные поля. Это может упростить использование имен, таких как checkthis;1234;FirstName, для полей ввода. foreach ($_POST as $key => $value) { // split the key, so you know what's what: $data = explode(';',$key);<br> // now $data[0] tells you what kind of field it is // $data[1] is the ID of the enrollee (your Num1, Num2) // $data[2] is the type of field<br> // only do checks for posted fields that start with "checkthis" if ($data[0]=='checkthis') { // now you can fill the $rule array: $rule[] = $type[$data[2]]['requirement'] . ',' . $key . ',' . $type[$data[2]]['error_message']; } } Таким образом, не имеет значения, что вы включаете в свою форму. Пока вы определили тип поля, правило будет добавлено в массив правил, если оно включено в значения $ _POST, и ваш скрипт проверки сделает все остальное.

<ч />

Редактировать
Если вы структурируете свои поля ввода следующим образом:


<input type="text" name="F1Firstname" value="" />
<input type="text" name="F2Firstname" value="" />
etc..

.. и вы отправите форму, массив $ _POST будет, например, выглядеть так:

//print_r($_POST) gives:

Array
(
    [F1FirstName] => John
    [F2FirstName] => Jane
)

.. самое простое, что нужно сделать, - это просмотреть каждый из них с помощью foreach:

foreach ($_POST as $key => $value) {
  // first $key will be "F1FirstName"
  // first $value will be "John"

  // second $key will be "F2FirstName"
  // second $value will be "Jane"

  // etc
}

Теперь в этом $ _POST также будут поля других типов, например, например. F1MobilePhone или что-то еще, что требует разных проверок и разных сообщений. Поэтому для каждого из этих полей вам необходимо выяснить, какой это тип, чтобы определить, какой тип сообщения вводить в вашу функцию проверки. Один из вариантов будет (это входит в оператор foreach):

if (strstr($key,'FirstName')) {
  // add a validation rule for the FirstName type
}
if (strstr($key,'Somethingelse')) {
  // etc
}

Я не знаю, как работает ваш сценарий проверки, но я предполагаю, что вы делаете что-то вроде этого:

// import the validation library
require("validation.php");

$rules = array(); // stores the validation rules

// All Enrollee Rules
$rules[] = "required,Num1FirstName,The First Name field is required.";

// Call on the validation function
$result = validate($rules);

Тогда вы, вероятно, получите ответ, было ли в этом случае Num1FirstName допустимым или нет. Поскольку вы используете массив $rules, валидатор может обрабатывать несколько строк одновременно. Просто добавьте больше значений в массив, но не добавляйте другую переменную. Если вы сделаете это:

<code>$rules[] = "required,Num1FirstName,Num2FirstName,The First Name field is required.";

.. Валидатор будет думать, что «Num2FirstName» - это сообщение об ошибке, поскольку это 3-е значение, которое вы вводите, и он не будет знать, что делать с реальным сообщением, которое теперь является 4-м значением. Попробуйте вместо этого:

<code>$rules[] = "required,Num1FirstName,The First Name field is required.";
$rules[] = "required,Num2FirstName,The First Name field is required.";

Итак, все это вместе дает вам:

foreach ($_POST as $key => $value) {
  // first $key will be "F1FirstName"
  // first $value will be "John"

  // second $key will be "F2FirstName"
  // second $value will be "Jane"

  if (strstr($key,'FirstName')) {
    $rules[] = "required,$key,The First Name field is required.";
  }
  if (strstr($key,'Somethingelse')) {
    $rules[] = "required,$key,Some other message for this type of field.";
  }
}

// call on your validate function and feed it the $rules array you've created

Добавление JavaScript для (предварительной) проверки - это совсем другая история. В конце концов, вам все равно нужно проверить его на PHP, потому что, как вы сказали, проверку JS можно легко обойти. Поэтому я думаю, что исправить это первым может быть лучше.

...