Configurando o PHP para exibir erros

Por questões de segurança normalmente servidores configuram o php.ini para inibir a exibição de erros (se um usuário consegue identificar um erro e tem informações sobre ele fica mais fácil explorar o problema).

Configurando pelo php.ini

No php.ini você deve ter uma chave display_errors, que provavelmente está asssim:

display_errors = Off

Para configurar pelo php.ini é só trocar o valor Off por On e todas as páginas em PHP no servidor irão printar os erros – não faça isso em produção, pelo motivo de segurança que citei acima.

 

Configurando pelo código

Considero esta a melhor opção, manter sempre o php.ini configurado para não exibir erros e configurar isso em cada aplicação em que for necessário, pois alterar o php.ini modifica o funcionamento de todos os projetos que estiverem no servidor.

Na última versão do Code Igniter (2.0) ele vem com uma variável de configuração para definir em qual ambiente o projeto está rodando: dev, homologação, produção, e isso define se os erros serão ou não exibidos.

Para configurar no código a exibição de erros e log de erros, adicione o bloco abaixo no teu código:

ini_set('display_errors', 1);
ini_set('log_errors', 1);
ini_set('error_log', dirname(__FILE__) . '/error_log.txt');
error_reporting(E_ALL);

E não se esqueça de omitir os erros quando a aplicação for para ambiente de produção! 🙂

Validação simples de formulário com jQuery

Normalmente opto pelo uso do jQuery Validate para validação de formulário (veja como ignorar o jQuery Validate), mas em uma tela que estava trabalhando eu tinha vários formulários que abriam em modal (usando o PrettyPhoto) e eram manipulados antes da abertura dependendo das ações do usuário naquela tela.

Ao invés de usar o validate achei que seria mais simples implementar uma função para validação, seguindo a seguinte regra:

  • Os elementos com a classe "required" devem ser obrigatórios
  • Adicionar a classe "error" aos elementos obrigatórios não preenchidos
  • Exibir um elemento com a mensagem de erro do formulário
  • Retornar true se passar na validação

A função ficou bastante simples e poderia ser escrita facilmente sem o uso do jQuery.

Validação sem plugin

function validateForm(form){
    var err = 0;
    form.children('.required').each(function(){
        if($(this).val() == '' || $(this).val() == null){
            $(this).addClass('error');
            form.children('.error_form').show();
            err++;
        }
    })
    if(err == 0)
        return true
}

 

Update

Seguindo a dica do Chris, a validação do exemplo acima pode ser substituída por uma expressão regular que verifica se a string é vazia no javascript, como no exemplo abaixo:

function notNull (x){
        if(a!="" && !(a.match(/^\s+$/))){
            return true;
        }else{
            return false;
        }
}

A função segue a seguinte lógica:

  1. Recebe como parâmetro um objeto do jQuery (optei por isso ao invés do id ou classe pois meu código já tinha uma variável com o form selecionado por questões de performance.
  2. Cria uma variável chamada err com valor 0, que irá contabilizar os erros (caso exitam).
  3. Percorre todos os elementos do formulário e busca pelos que tenham a classe "required", percorrendo todos estes e:

    1. Verifica se o valor do elemento é vazio ou null, se for adiciona a classe "error" no elemento e mostra o elemento com classe "error_form" que está no formulário (caso exista).
    2. Soma 1 a variável err.
  4. Se depois de percorrer todos os elementos com classe "required" nenhum erro for contabilizado retorna true.

 

Seria possível retornar também o número de erros em caso de false, modificando o final da função para:

    if(err == 0)
        return true
    else
        return err;

Sei que validação já é um assunto um pouco "manjado" de javascript e muita gente opta pelos plugins, resolvi compartilhar para mostrar como funciona e exeplificar que nem sempre é necessário a gente inserir plugin para tudo o que vamos fazer…

Seletor por classe no javascript

Vi alguns questionamentos em fóruns sobre seletor de classe em javascript e resolvi compartilhar uma solução do fórum, que extende o document para que seja possível fazer seleção de elementos por classe sem a necessidade de usar uma biblioteca (jQuery, por exemplo) para isso.

Já postei um exemplo em HTML5 da selector API (querySelector), mas como isso só é suportado por browsers modernos a solução abaixo quebra o galho (e se getElementsByClassName for nativa do navegador ele usa a função nativa).

Função getElementByClassName

A função abaixo permite que você user document.getElementByClassName('nomeDaClasse') para fazer seletores sem o uso de nenhuma biblioteca.

if (document.getElementsByClassName == undefined) {
    document.getElementsByClassName = function(className)
    {
        var hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)");
        var allElements = document.getElementsByTagName("*");
        var results = [];

        var element;
        for (var i = 0; (element = allElements[i]) != null; i++) {
            var elementClass = element.className;
            if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass))
                results.push(element);
        }

        return results;
    }
}

 

Na maioria dos projetos uso jQuery, mas tem alguns que o javascript é tão simples que não é necessário os 29Kb – e esse seletor de classes já quebra o galho. 🙂

Solução de um colaborador do DevShed.

27 maneiras de ser um melhor programador

Hoje o @chrisbenseler twittou sobre uma apresentação chamado  27 maneiras de ser um melhor programador PHP. São apenas tópicos específicos que servem para qualquer desenvolvedor – e algumas se aplicam para outras profissões.

Vale a pena ler até o final (em inglês) e rever alguns conceitos e atitudes que temos no dia a dia e que podemos mudar a fim de melhorar nossa carreira.

Ps: se você está pensnado em comentar reclamando que está em inglês e pedindo uma tradução eu tenho uma dica que vai te ajudar em qualquer carreira: estude inglês, recomendo o Live Mocha para isso. 🙂

Como criar um bom XML Sitemap

A nova versão do And After teve algumas mudanças bastante significativas de front-end e back-end, e isso causou uma gigantesca penalização na indexação do Google – deixamos de utilizar o subdomínio www e viramos um domínio no-www classe B (que redireciona tudo que tenha www retirando o subdomínio).

Seria possível manter o subdomínio www funcionando para evitar isso, mas resolvemos assumir o risco pois acreditamos que atualmente não faz sentido seu uso e também evita a possibilidade do conteúdo ser considerado duplicado nos domínios andafter.org e andafter.org.

Se você quer aprender um pouco mais sobre Search Engine Optimization (SEO) recomendo algumas leituras:

Sitemap protocol

Padronização é a palavra que faz a web funcionar de forma organizada e bonita, existem recomendação para criação de sitemaps em XML que são usada por vários motores de busca, incluindo o Google (que sempre foi o buscador que mais trouxe resultados para o And After).

Você pode encontrar a documentação completa e mais informações no sitemaps.org

 

Exemplo de sitemap

Segue um exemplo de sitemap com as especificações do sitemap protocol 0.9:

 

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <url>
      <loc>http://www.example.com/</loc>
      <lastmod>2005-01-01</lastmod>
      <changefreq>monthly</changefreq>
      <priority>0.8</priority>
   </url>
</urlset>

 

Cada link para o seu site deve ser um tag seguindo a estrutura acima, e as tags filhas são:

  • loc (obrigatório) – a url completa da página, incluindo o protocolo (http:// por exemplo)
  • lastmod (opcional) – a data da última modificação da página, seguindo a formatação do
    W3C Datetime  (exemplod: YYYY-MM-DD)
  • changefreq (opcional) – frequência de atualização da página, pode ter os seguintes valores:

    • always
    • hourly
    • daily
    • weekly
    • monthly
    • yearly
    • never
  • priority  (opcional) – define a importância relativa entre as páginas do seu site, o valor vai de 0.0 a 1.0.

 

Dicas: um sitemap não deve ter mais do que 50.000 links, se for necessário você pode criar mais de um sitemap e criar um índice de sitemaps (leia mais em inglês).

Depois de feito você pode cadastrar seu sitemap no Google Webmaster Tools e isso vai evitar que alguma de suas páginas não seja encontrada pelo Google e com a seleção de prioridade interna (priority) você pode escolher quais urls devem ter preferência sobre as outras do seu domínio no posicionamento das buscas (lembrando que isto não influencia o posicionamento na busca quando comparado com outros domínios, apenas define uma url preferencial quando páginas do seu domínio estão "concorrendo" por uma posição).