He creado una clase 'validar' para validar dos campos, es decir, 'nombre' y 'apellido'. No funciona bien, muestra un error cuando el campo está vacío, pero cuando envío el formulario con campos no vacíos, el error sigue ahí. ¿Cómo ejecutar esto en el envío del formulario?
<?php class validation { public $firstName, $lastName, $errorFirstName = '', $errorLastName = ''; function __constructor($fName, $lName){ $this->firstName = $fName; $this->lastName = $lName; } function check(){ if($_SERVER["REQUEST_METHOD"] == "POST"){ if(empty($this->firstName)){ $this->errorFirstName = 'First name is required'; } else { $this->errorFirstName = 'Input is okay'; } if(empty($this->lastName)){ $this->errorLastName = 'Last name is required'; } else { $this->errorLastName = 'Input is okay'; } } } } $obj = new validation($_POST['firstname'], $_POST['lastname']); $obj->check(); $errorF = $obj->errorFirstName; $errorL = $obj->errorLastName; ?> <!DOCTYPE html> <html lang = "en-US" dir = "ltr"> <head> <title>Home</title> <meta charset = "UTF-8"/> </head> <body> <form method = "POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> <label>First Name: </label> <input type = "text" name = "firstname" placeholder = "John"/> <p class = "error"><?php echo $errorF;?></p> <label>Last Name: </label> <input type = "text" name = "lastname" placeholder = "Doe"/> <p class = "error"><?php echo $errorL;?></p> <input type="submit"> </form> </body> </html>Todos siempre hacen "clase de base de datos" y "clase de validación". Ehh.... queeeee?
No hagas una clase de validación. nunca funciona Las opciones más ... emm ... sostenibles para validar la entrada del usuario son:
Con el uso de entidades para la validación, es bastante simple. En su caso, tendría un Profile de clase donde tiene el método setFirstName(string $name) . Luego, dentro de este método, realiza la validación y, en caso de error, lanza una excepción personalizada, como InvalidFirstName ... o algo así.
El uso de objetos de valor es un poco más complicado, pero evita la duplicación de código. Por ejemplo, necesita validar la dirección de correo electrónico. Entonces, la forma en que le gustaría usarlo sería algo como:
try { $profile = new Profile; $profile->setEmail(new EmailAddress($_POST['email'])); } catch (InvalidArgumentException $e){ // validation failed }Por lo tanto, para obtener este comportamiento, tendría que definir la clase de la siguiente manera:
class EmailAddress { private $email; public function __construct(int $emailId = null, string $email = null) { if (!$this->isValid($email)) { throw new InvalidArgumentException('Not valid email address'); } $this->email = $email; } private function isValid($email) { return filter_var($email, FILTER_VALIDATE_EMAIL) !== false; } public function __toString() { return $this->email; } }Este enfoque es mucho más expresivo, pero tiende a convertirse en un gran nudo cuando interactúa con la capa de persistencia.
En la práctica, la mejor opción es usar una combinación de estas dos soluciones:
Haz una clase de validador.
Los formularios generalmente constan de varios campos, lo que significa que en el enfoque sugerido en el que intenta / detecta un error al configurar el objeto fallará en un solo campo, cuando puede tener múltiples campos no válidos y en el envío del formulario desea que todos los campos estén validados y todos errores devueltos para que puedan presentarse al mismo tiempo.
<?php class MyValidator { /** * Is form valid; * * @var bool */ private $isValid = true; /** * List of errors, assoc array with error messages one per fieldName * * @var array */ private $errors = []; /** * Check if form is valid * * @return bool */ public function isValid(): bool { return $this->isValid; } /** * Get error message * * @param $fieldName * @return mixed|string */ public function getError($fieldName) { return isset($this->errors[$fieldName]) ? $this->errors['fieldName'] : ''; } /** * @param array $rules list of rules * @param array $payload list of form parameters * @return bool Return validation result, same as isValid */ public function validate(array $rules, array $payload) { foreach ($rules as $rule) { if (!$this->validateRequired($rule, $payload)) { continue; } switch ($rule['type']) { case 'string': $this->validateString($rule, $payload); break; case 'email': $this->validateEmail($rule, $payload); break; //extend with other validation rules as needed } } return $this->isValid(); } public function validateRequired(array $rule, array $payload) { if (true === $rule['required'] && !isset($payload[$rule['fieldName']])) { $this->isValid = false; $this->errors[$rule['fieldName']] = 'This field is required'; return false; } return true; } public function validateString($rule, $payload) { // Checkup logic, set $this->isValid to false if not valid, add // See add $this->errors[$rule['fieldname']] = 'your message'; } public function validateEmail($rule, $payload) { // Checkup logic, set $this->isValid to false if not valid, add // See add $this->errors[$rule['fieldname']] = 'your message'; } } // Call validator by giving validator ruleset in the format $rules = [ [ 'fieldName' => 'firstName', 'type' => 'string', 'minLength' => 10, 'maxLength' => 20, 'required' => true, ], [ 'fieldName' => 'email', 'type' => 'email', 'required' => true, ] ]; $validator = new MyValidator(); $isValid = $validator->validate($rules, $_POST); // if false do repeat form with error messages shown // use $validator->getError('firstName'); to get error message for a field.En el código mencionado, está escrito de manera que los valores del formulario se pasarán a la clase mientras se crea, y dentro del constructor, las variables de clase se inicializarán con los valores proporcionados.
Después de eso, el método check() verificará si los campos están vacíos o no.
Pero esto no funciona como se esperaba porque los valores pasados desde el formulario no se pudieron inicializar a $firstName y $lastName.
La razón de esto es,
function __constructor()no es un constructor de una clase, debe ser
function __construct()razón por la cual a las variables de clase no se les asignan los valores dados en el formulario y aparece el error.
Una vez que lo modifique, el problema se resolverá.