sexta-feira, 9 de setembro de 2011

Formulário PHP Validação Dicas de Dados


Uma tarefa comum na web desenvolvimento de aplicações web é validar a entrada de dados por um usuário. Isso geralmente é feito para garantir que o tipo de dados inseridos corresponde a tipos de dados esperado para um banco de dados subjacente. Também é uma boa prática de segurança para limitar os dados que um formulário baseado na web vai aceitar. Embora seja comum em aplicações web 2.0 para usar o código do lado do cliente como o Javascript para validar campos de formulário, isso não deve ser invocado para uma série de razões. Alguns usuários desativar o Javascript assim que você quer fornecer uma interface de trabalho para esses usuários. A partir de uma perspectiva de segurança, você tem que manter em mente que é possível enviar dados para um formulário web, sem carregar o formulário e seu código de cliente.

Se você desenvolver usando um framework PHP como CakePHP, há uma construída em sistema de validação que faz a validação de dados forma trivial. Há também uma série de scripts de terceiros e bibliotecas disponíveis que podem fornecer uma série de classes úteis para validar os dados do formulário. Essas bibliotecas podem ser animadas grande momento, mas por várias razões, pode ser necessário para escrever suas rotinas de validação próprio formulário.


Informar aos usuários o que deu errado


Ao validar os dados do formulário, é provável que um usuário vai apresentar algo que não passa da rotina de validação. Muitas vezes o erro é simplesmente cased usando o formato errado para inserir dados. A fim de fazer suas aplicações web como user-friendly como possível, você deve sempre dar pistas para que seus usuários se você espera um formato específico, como datas em dd / mm / aaaa formato.


Embora este tipo de codificação defensiva vai ajudar muitos usuários brisa através de sua forma, ainda haverá aqueles momentos em que um usuário insere dados incorretos ou um formato incorreto. A melhor maneira de lidar com isso é fornecer uma mensagem de erro útil. Algumas formas irá mostrar todos os erros de validação no topo da forma. Enquanto isso ajuda os usuários a ver que erros ocorreram, é muito mais útil para mostrar a mensagem de erro ao lado do campo que causou o erro. Isso permite que um usuário para fazer a varredura para baixo um formulário e corrigir todos os erros em uma única passagem. Para conseguir isso, eu uso um array chamado $ form_errors . I-chave do array usando o nome do campo de formulário que causou o erro. Eu também encomendar minhas regras de validação em ordem de prioridade. Isso é porque eu geralmente só quero mostrar um erro a cada campo ou porque não uma validação pode fazer outras regras inválido. Por exemplo, se um campo obrigatório é deixado em branco, que pretende mostrar que o campo é obrigatório. Não é necessário para mostrar erros relativa ao formato ou tipo de dados nesta fase. Eu exibir erros no rótulo do campo de formulário entre <strong> tags. Posso, então, usar CSS para estilizar os meus erros, na maioria das vezes, tornando-os vermelhos. Aqui está um trecho do código para exibir uma mensagem de erro:




<Rótulo para = "Nome" > Nome:
<strong> <br>
<? Php
se (isset ( $ form_errors [ 'nome' ])) {
  echo $ form_errors [ 'nome' ];}
?>
</ Strong> </ label>
<Input type = "text" name = "first_name" id = "id_first_name" maxlength = "40" />


Se você precisa fazer para mostrar vários erros, você pode fazer um array multidimensional. Em seguida, basta iterar sobre a matriz para cada campo de formulário em uma lista não ordenada.


Retornar o valor inicialmente inscritas


Raramente é útil para retornar uma mensagem de erro sem também mostrando ao usuário o que eles inicialmente inscritas. Pela devolução dos valores que o usuário inicialmente inscritas você realizar duas tarefas. Você se torna mais fácil para eles para comparar o que eles entraram para a mensagem de erro. Isto torna mais fácil para um usuário para determinar o que eles fizeram de errado. Ele também impede que um usuário de ter que voltar a entrar todos os campos para corrigir seu erro e completar o formulário. Para conseguir isso no meu próprio código, eu copio os valores do $ _POST array para outro array. Esta matriz é então utilizado para realizar a validação e, no caso de um erro, a prefill a forma com a entrada original do usuário. Por que não eu só uso o $ _POST array, você pode perguntar? Costumo usar o mesmo formulário para editar e adicionar itens a um banco de dados. Usando uma matriz genérica como $ valores , eu posso carregar o formulário com os dados do meu banco de dados, atribuindo o registro para a valores $ array. Aqui está um trecho de HTML para mostrar prefill um campo de formulário usando esta técnica:


<Input type = "text" name = "first_name" id = "id_first_name"
<? Php
se (isset ( $ valores [ 'nome' ])) {
  echo "value =" " . $ valores [ 'nome' ]. '"' ;}  
?>
/>


Verificando Campos Obrigatórios


Certificando-se que um usuário tenha entrado um valor para um campo obrigatório é bastante trivial. Nós só precisamos ver se o campo foi incluído quando o formulário foi enviado e se ele contém um valor. Aqui está uma função de validação de base para um campo de preenchimento obrigatório:




função (is_required campo $ , $ valores ) {
  se (isset (! $ valores [ $ campo ]) | | vazia ( $ valores [ $ campo ])) {
    retornar false;
  } mais {
    retornar true;
  }
}


Esta função simplesmente garante que um valor foi definido para o campo e que não é um campo vazio. Esta segunda etapa é importante porque um formulário HTML irá retornar um elemento para uma entrada de texto, mesmo que o campo de texto está vazio. Você pode usar essa função para testar se um campo necessário está presente e em seguida, definir um erro apropriada se a função retorna falso.


Verificação Tipos de Dados


Muitas vezes você vai querer um campo para conter um determinado tipo de dados como um número ou uma data. PHP tem uma série de built-in métodos para testar estes tipos de dados. Por exemplo, a função is_numeric PHP retorna true se o valor passado é um número. Isto significa que uma string pode conter apenas números e um ponto decimal. Isso também significa que é preciso ter cuidado para informar aos usuários a não utilizar formatação especial. Esta função retornará false se o usuário inclui outros personagens, como uma vírgula (isto é, 60.000). Eu não vou entrar em grandes detalhes aqui, porque essas funções já estão bem documentados na documentação do PHP.


Validar números de telefone


Muitas vezes, os formulários web que exigem um número de telefone irá especificar um formato específico para o número de telefone. Algumas formas, no entanto, conseguem validar números de telefone em uma variedade de formatos. Números de telefone dos EUA pode ser escrito em uma de várias maneiras. É sempre útil para ser capaz de aceitar qualquer um dos formatos mais comuns. Este é realmente mais fácil do que parece. Sabemos que um número de telefone nos EUA irá conter 10 dígitos, nem mais nem menos. Como resultado, nós realmente só precisa confirmar que temos 10 dígitos. Aqui está uma função para lidar com uma variedade de formatos.


função validate_telephone_number ( $ number ) {
  $ Formatos = matriz ( '###-###-####' ,
        '(###)###-####' ,
        '##########' , '###.###.####' ,
        '(###) ###-####' );
  $ Format = trim (preg_replace ( "/ [0-9] /" , "#" , $ number ));
  se (in_array ( $ format , $ formato )) {
    retornar true;
  } mais {
    retornar false;
  }
}


Esta função define os formatos geral vamos aceitar e coloca-los em uma matriz. Cada formato usa # onde um número deve ser. Em seguida, usamos o preg_replace função que usa uma expressão regular para fazer substituições. Em nossa função que estamos dizendo a ele para substituir qualquer dígito, tal como indicado por [0-9] com um caractere #. A função trim remove qualquer espaço em branco à direita. O resultado é que a entrada do usuário irá se parecer muito com um dos nossos formatos com s # "no lugar de números. O passo final é verificar se o número de telefone modificado está contido em nossa matriz formatos $. Se for, o usuário digitou 10 dígitos, em formato apropriado. Caso contrário, o número de telefone falha na validação. Esta técnica pode ser adaptada para outros campos de dados em que a formatação é variável, mas sabemos com certeza que somente dígitos será usado. Também é melhor se o número de dígitos foi definido. Como exemplo, números de segurança social e EINs usado por corporações conter o mesmo número de dígitos, mas diferem apenas em onde os traços são colocados. Você poderia usar um $ formatos matriz como:


$ Formatos = matriz ( '#########' , '##-###-####' , '###-##-####' , '##-# ##-####' );


para garantir que a segurança social ou número de EIN foi digitado.


Datas validando


Há uma série de técnicas para validação de datas. O mais comum é dividir a entrada do usuário para o componente de mês, dia, ano e depois usar a função checkdate do PHP para ver se é uma data válida. Isso funciona melhor do que uma simples expressão regular, uma vez que vai pegar os erros que uma expressão regular pode perder, como uma data como 2010/11/31. Aqui está uma função de exemplo:


função validate_date ( $ value ) {
  se (preg_match ( "/^([ 0-9] {2}) \ / ([0-9] {2}) \ / ([0-9] {4 })$/" , $ value , $ partes )) {
    se ( checkdate ( $ partes [1], $ partes [2], $ partes [3])) {
      retornar true;
    }
  } mais {
    se (preg_match ( "/^([ 0-9] {2 })-([ 0-9] {2 })-([ 0-9] {4 })$/" , $ value , $ partes )) {
      se ( checkdate ( $ partes [1], $ partes [2], $ partes [3])) {
        retornar true;
      }
    }
  }
  retornar false;
}


Nesta função, estamos usando uma expressão regular para dividir a entrada do usuário em suas partes componentes. Vamos olhar um minuto a essa expressão. O símbolo ^ significa para começar no início da string. [0-9] {2} significa que estamos à procura de dois dígitos. O \ / é simplesmente escapar da barra, uma vez que tem um significado diferente em expressões regulares. Então [0-9] {2} significa mais 2 dígitos seguido por uma barra de novo \ / e, finalmente, 4 dígitos: [0-9] {4}. Nós armazenar os elementos combinados em um array chamado $ partes . Então $ partes é passado para checkdate para ver se é uma data válida. Observe que, se essa expressão regular não tentamos novamente com a mesma expressão regular, mas usando "-" como um separador. Isto permite que nossos usuários insiram datas como 2010/9/21 ou 2010/09/21. Poderíamos também testar por um ano de dois dígitos para tornar nosso sistema mais flexível quanto à entrada, ele vai aceitar.


Enquanto isso vai lidar com campos mais data, às vezes, nós estamos olhando para o usuário introduzir uma data, mas podemos não ser guardá-lo como uma data ou pode não ser capaz de validá-lo como uma data completa. Como por exemplo, eu recentemente codificadas um pedido de emprego que exigia uma data mês / ano para as datas de início e fim da história de um candidato ao emprego. Existem duas abordagens que você pode usar ao validar esses tipos de datas. O primeiro é usar uma expressão regular e restrição que pode ser aceite. Em vez do padrão [0-9] {2} para o mês que você usaria algo como [0-1] {1} [0-9] {1} para o mês. Este padrão só permite um 0 ou 1 para o primeiro dígito e qualquer dígito para o segundo. Enquanto isso vai ser "suficientemente bom" para muitas finalidades, ele permite que os dados de entrada, tais como 19 para o mês. Um segundo método é dividir o mês eo ano como fizemos no exemplo anterior e definir a parte do dia a "01". Então você pode usar o checkdate função para se certificar de que é uma data válida.


Tempo validando


Eu mencionei que recentemente codificadas um pedido de emprego para um cliente. Sobre este projeto, eles tinham uma seção que um candidato utilizado para indicar a sua disponibilidade para o trabalho. Eles queriam um formato de hora simples, como uma 07:00 ou 12:45 p. Esta validação foi facilmente resolvido com uma expressão regular:


função validate_time ( $ value ) {
  se (preg_match (! "/ ^ [0-1] [0-9]: [0-9] {2} [ap] /" , $ value )) {
    retornar false;
  } mais {
    retornar true;
  }
}


Novamente o ^ representa o início da string. [0-1] indica que o primeiro dígito deve ser um 0 ou 1. [0-9] indica que o segundo dígito pode ser qualquer dígito. Após a: estamos à procura de dois dígitos e, finalmente, [ap] significa que o personagem final deve ser um só "a" ou "p". Enquanto essa função satisfazendo as necessidades de meu cliente, deve-se notar que ela sofre do mesmo problema que o mês anterior / ano validação por expressões regulares. Ainda é possível que alguém inserir dados inválidos, como a. 17:00 Para a validação mais precisa, PHP strtotime função pode ser usada. Você vai precisar de ajustar a sua expressão regular para garantir que o usuário entra em um tempo em um dos formatos válidos usado por strtotime . Verifique a documentação do PHP para mais informações sobre strtotime formatos e válido.


Validar endereços de e-mail


Uma expressão comum regular para validar um endereço de e-mail é o seguinte:


retorno preg_match ( "/^[_ a-z0-9-] + (\. [_a-z0-9-]+)*@[ a-z0-9-] + (\. [a-z0-9-] +) * (\ [az] {2,3 })$/". , $ email );


Isto irá permitir apenas letras minúsculas, números, hífens, sublinhados e períodos na primeira parte do e-mail. Embora esta seja a forma mais popular de validação para um endereço de e-mail, ele vai impedir que endereços de e-mail válida de validação. Linux Journal publicou um excelente artigo sobre esta questão. No artigo, eles discutem RFC 3696 que trata de e-mails válidos sendo rejeitado por métodos de validação popular.


Não se esqueça do óbvio


Se os dados sejam inseridos em seu formulário serão armazenadas em um banco de dados, você pode ter limites de comprimento a considerar. Uma prática comum é usar o atributo maxlength do seu elementos de formulário HTML para limitar a entrada para o comprimento máximo de um campo de banco de dados como um varchar. Como exemplo, se você definiu um campo de primeiro nome em sua tabela MySQL como varchar (40), você pode usar maxlength = "40" na sua tag input HTML para limitar a entrada de 40 caracteres. O problema com essa técnica é que alguém que artesanato uma solicitação POST para o seu código pode enviar 50 caracteres, uma vez que não estiver usando o formulário. Isso não importa muito já que irá gerar um erro e realmente quiser que os usuários usam seu formulário. No entanto, em casos como AJAX ou se você está escrevendo uma API que pode ou não pode usar um formulário, você precisará para validar as coisas como o comprimento dos seus campos. Também é uma boa prática defensiva para testar o tamanho de campos.


Validando não é Sanitizing


Validação de dados aumenta a segurança de sua aplicação, limitando a entrada para os valores que você estava esperando. No entanto, a validação é ainda diferente de dados saneantes que envolve escapar caracteres especiais. Se você está interagindo com um banco de dados, é importante que depois de concluir a validação, mas antes de tentar salvar os dados, você higienizar-lo. Se você estiver usando o MySQL, o PHP função mysql_real_escape_string função irá ajudá-lo a higienizar os seus dados escapando caracteres especiais para MySQL.


Embora existam muitas bibliotecas de boa qualidade de validação disponíveis para PHP, desenvolvendo sua própria biblioteca de rotinas de validação permite que você personalize a validação para atender às suas necessidades específicas. Isso muitas vezes leva a uma melhor experiência do usuário ao aceitar mais formatos e estilos. A validação é um passo importante para orientar os usuários sobre o tipo de dados do seu aplicativo web está esperando. É também um passo fundamental para garantir a sua aplicação pelo estreitamento dos tipos de dados de um usuário pode enviar a sua candidatura. Enquanto a validação pode aumentar a segurança, os dados saneantes sendo enviadas para um banco de dados ainda é um passo crucial.

Nenhum comentário :

Postar um comentário

Total de visualizações de página