PHP Form Doğrulama

1 Cevap php

Bu soru kuşkusuz cevap ve mantıklı bir şekilde soruyorum ama ben elimden geleni yapacağım zor olacak:

Ben gibi formun belirli bölümlerini görüntülemek için PHP kullanan bir form var:

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

ve

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

Her form parça, benzersiz bilgi her kayıtlı kişi hakkında toplanan ancak her kayıtlı kişi için temel kriter, yani bütün Kayıtlı Kullanıcı ad alanında bir değere sahip kullanmanız gerekir, aynıdır. Her alan kayıtlı kişi sayısı yani Num1FirstName göre isimlendirilir; Num2FirstName.

I have a PHP validation script which is absolutely fantastic ve am not looking to change it but the issue I am running into is duplication of the script in order to validate ALL fields in one swoop.

On submission, all POSTED items are run through my validation script ve based on the rules set return an error if they do not equal true.

Örnek kod:

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.";

The script above does the following, $rules[] ="REQUIREMENT,fieldname,error message" where requirement gives criteria (in this case, simply that a value is passed), fieldname is the name of the field being validated, ve error message returns the error used.

My Goal is to use the same formula above ve have $rules[] run through ALL firstnames ve return the error posted ONLY if they exist (i.e. dont check for member #7's first name if it doesnt exist on the screen).

If I simply put a comma between the 'fieldnames' this only checks for the first, then second, ve so on so this wont work.

Herhangi bir fikir?

1 Cevap

Ben doğru yapmaya çalışıyoruz anlamak eğer:

1. Define types
First, you need to define what type of field requires what kinds of rules, e.g.:

$type['FirstName']['requirement'] = 'required';
$type['FirstName']['error_message'] = 'The First Name field is required.';
// just random example: $type['MobilePhone']['requirement'] = 'optional'; $type['MobilePhone']['error_message'] = 'Only enter digits.';

2. Go through each posted value
Second, check for each posted value what type of field it is. Now a lot of stuff might be included in the $_POST array, and you only need to check certain fields. It might make it a lot easier to use names like checkthis;1234;FirstName for your input fields.

foreach ($_POST as $key => $value) {
  // split the key, so you know what's what:
  $data = explode(';',$key);
// 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
// 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']; } }
This way it doesn't matter what you include in your form. As long as you've defined the type of field, a rule will be added to the rule array if it's included in the $_POST values, and your validation script will do the rest.


Edit
If you structure your input fields like this:


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

.. Ve formu gönderin, $ _POST dizi olacak ör Bu gibi görünüyor:

//print_r($_POST) gives:

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

.. Yapılacak en kolay şey foreach olan her döngü için:

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
}

Şimdi, bu $ _POST aynı zamanda, örneğin gibi alanlarda diğer türleri, olacak F1MobilePhone veya farklı doğrulamaları ve farklı mesajlar gerektiren ne olursa olsun,. Yani bu alanların her biri için, size doğrulama işlevine girmek için mesajın ne tür belirlemek için, ne tip bulmak gerekir. Bir seçenek (bu foreach deyimi içinde gider) olacaktır:

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

Ben senin doğrulama komut dosyası nasıl çalıştığını bilmiyorum, ama ben böyle bir şey yaptığını tahmin ediyorum:

// 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);

Sonra muhtemelen bu durumda, "Num1FirstName" geçerli ya da değil, olsun geri alırsınız. Bir dizi $rules kullanmak beri, validator muhtemelen bir kerede birden fazla satır işleyebilir. Basitçe diziye daha fazla değer katmak, ama başka bir değişken eklemek gerekmez. Bunu yaparsanız:

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

.. O Girdiğiniz 3 değer beri validator, "Num2FirstName" hata mesajı olduğunu düşünüyorum, ve şimdi 4 değer gerçek mesajın ne yapacağını bilemezsiniz. Bunun yerine bu deneyin:

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

Böylece hep birlikte bu getirerek bu veriyor:

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

(Pre-) doğrulamak için JavaScript ekleme tamamen farklı bir hikaye. Dediğin gibi, JS onay kolaylıkla atlanabilir, çünkü sonunda yine PHP bunu doğrulamak gerekir. Yani bu ilk iyi olabilir sabitleme sanırım.