簡體   English   中英

我該怎么做呢? PHP5表單驗證

[英]How can i do this right? PHP5 Form validation

我正在嘗試進入OO PHP世界的第一步。 我想做的是創建一個可驗證表單輸入的類。 我知道我整個網站需要哪些輸入字段,並且想要進行切換,以根據輸入字段做正確的事情。 假設我們有一個名為'email'的輸入字段,並且我們有一個表格等等。

首先,我想做的是嘗試使用array_key()函數讀取$ _post名稱,因為我有一個開關。

這是我的代碼:

public function __construct ( $var ) {
     $this->arraykeys = array_keys($var);
     $this->error = false;
     $this->message = array();   
}        

public function check() {   

      foreach ($this->arraykeys as $i => $value)
      {

      switch ($value)
      {
        case 'email' :

        $checkmail = new checkEmail($_POST);
        $checkmail->chkEmail($_POST['email']);
        if ($checkmail->chkEmail($_POST['email']) == false)
        {
            array_push($this->message, 'Cannot validate emailadres');
        }            
        break; 

      }


      }

     // print_r($this->field);
}

該檢查有效,但是在發生錯誤后消息數組仍保持為空! 我嘗試了所有操作,但無法在屏幕上顯示!

請幫忙!

謝謝!!

在使用OOP之前,您實際上需要擁有一些更基本的對象,這些對象使您能夠進行表單處理,例如,在PHP超全局變量中使用錯誤消息對表單字段進行面向對象的驗證:

只是模范:

// defining the interfaces and classes of the form values and validation, form field 
// and fields
Interface FormValue
{
    public function getValue();
}

interface FormValueValidator
{
    /**
     * @param FormValue $value
     * @return bool
     */
    public function validate(FormValue $value);
}

class NamedFormValue implements FormValue
{
    private $name;
    private $value;

    public function __construct(array $data, $name, $default = null)
    {
        $this->name = $name;
        $this->value = isset($data[$name]) ? $data[$name] : $default;
    }

    public function getValue()
    {
        return $this->value;
    }

    public function getName()
    {
        return $this->name;
    }
}

class EmailValidator implements FormValueValidator
{
    public function validate(FormValue $value)
    {
        $result = filter_var((string) $value->getValue(), FILTER_VALIDATE_EMAIL);
        return is_string($result);
    }
}

class FormFieldFactory
{
    /**
     * @param $name
     * @param array $field
     * @return FormField
     */
    public function create($name, array $field)
    {
        $validatorClass = sprintf('%sValidator', @$field['validator']);
        $validator = new $validatorClass;

        $formField = new FormField($name);
        $formField->setValidator($validator);
        $formField->setErrorMessage($field['error_msg']);
        return $formField;
    }
}

class FormField
{
    private $name;
    /**
     * @var FormValueValidator
     */
    private $validator;
    private $errorMessage;
    /**
     * @var FormValue
     */
    private $value;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function setValidator(FormValueValidator $validator)
    {
        $this->validator = $validator;
    }

    public function isValid()
    {
        return $this->validator->validate($this->value);
    }

    public function setErrorMessage($errorMessage)
    {
        $this->errorMessage = $errorMessage;
    }


    public function getErrorMessage() {
        return $this->errorMessage;
    }

    public function setValue(FormValue $value)
    {
        $this->value = $value;
    }

    /**
     * @return FormValue
     */
    public function getValue()
    {
        return $this->value;
    }
}

class FormFields extends IteratorIterator
{
    private $fieldFactory;
    private $invalidFields;

    public function __construct(array $definitions, $fieldFactory)
    {
        parent::__construct(new ArrayIterator($definitions));
        $this->fieldFactory = $fieldFactory;
    }

    public function current()
    {
        $name = $this->getInnerIterator()->key();
        $definition = $this->getInnerIterator()->current();
        return $this->fieldFactory->create($name, $definition);
    }

    public function valid()
    {
        return $this->getInnerIterator()->valid();
    }

    /**
     * @param array $data
     * @return bool true on success, false on validation error
     */
    public function validateOn(array $data)
    {
        $this->invalidFields = array();

        foreach($this as $name => $field) {
            /* @var $field FormField */
            $value = new NamedFormValue($data, $name);
            $field->setValue($value);
            $valid = $field->isValid();
            $valid || ($this->invalidFields[$name] = $field);
        }

        return 0 === count($this->invalidFields);
    }

    /**
     * @return FormField[]
     */
    public function getInvalidFields()
    {
        return $this->invalidFields;
    }
}

// defining the form in array notation:
$form = array(
    'fields' => array(
        'email' => array(
            'validator' => 'Email',
            'error_msg' => 'Cannot validate emailadress',
        ),
    ),
);

// processing the form validation
$messages = array();
$fields = new FormFields($form['fields'], new FormFieldFactory());
$fields->validateOn($_POST)
foreach ($fields->getInvalidFields() as $field) {
    $messages[] = $field->getErrorMessage();
}
var_dump($messages);

示例輸出:

array(1) {
  [0]=>
  string(27) "Cannot validate emailadress"
}

試試這個代替:

public function check()
{   

      foreach ($this->arraykeys as $i => $value)
      {

      switch ($value)
      {
        case 'email' :

        $checkmail = new checkEmail($_POST);
        $checkmail->chkEmail($_POST['email']);
        if ($checkmail->chkEmail($_POST['email']) == false)
        {
            $this->message[] = 'Cannot validate emailadres';
        }            
        break; 

      }


      }

     print_r($this->message);
}

另外,請確保您的媒體資源設置為公開。

您確定$checkmail->chkEmail()變得虛假並且運行良好嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM