Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

203
Vistas
Cómo validar un campo de formulario en PHP usando la Técnica Orientada a Objetos

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>
about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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:

  • realizar la validación en entidades de dominio
  • objetos de valor de uso

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:

  • mantener la validación en entidades, para reglas, que son únicas
  • usar objetos de valor para restricciones que se repiten a menudo
about 4 years ago · Santiago Trujillo Denunciar

0

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.
about 4 years ago · Santiago Trujillo Denunciar

0

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á.

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda