[英]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.