domingo, 28 de outubro de 2012

Uma nova função PHP por dia

Já viu aquelas pessoas que na intenção de melhorar seu vocabulário tentam aprender uma nova palavra por dia? Com disciplina é uma prática fácil e eficiente de rapidamente expandir seu vocabulário.

Acho que é uma abordagem interessante para se aprender mais sobre as funções nativas do PHP. E olha que já existe muita coisa implementada. Algumas vezes já vi funções criadas por programadores que já existem nativamente no PHP. E quantas vezes ficamos nos perguntando se já existe uma função que pode fazer o que nós queremos?

A minha dica é que podemos utilizar a técnica de uma nova função PHP por dia. Apenas para efeitos de estudo, obviamente você não vai achar um uso prático imediato para a maioria das funções que você estudar. E é obvio que também você não vai memorizar exatamente como a função funciona, sua lista de parâmetros etc. Isso serve mais para se criar uma lista de "referências" de funções. Uma vez que você gasta algum tempo lendo sobre uma nova função, ela ficará guardada em algum lugar de sua memória e um dia, quando você se deparar com uma situação onde a função pode ser usada, seu cérebro terá maiores chances de fazer a conexões necessárias e assim você se lembrará que já existe uma função que realiza aquela tarefa.

Para ajudar a achar sua função PHP do dia, escrevei este pequeno script que usa dicas que já falei sobre o manual php e a quantidade de funções existentes no PHP.

Basicamente o script escolhe uma função aleatoriamente das funções "internal" do PHP, funções nativas, e te leva para a página do manual sobre ela. Acredito que o script pode ser facilmente alterado caso você queira mudar a browser usado ou obter o conteúdo de outra forma.

terça-feira, 2 de outubro de 2012

Achando a chave primária anterior e posterior de uma chave primária existente

Estava eu trabalhando em uma pequena aplicação e o cliente me pediu para acrescentar um recurso onde ele poderia navegar entre os registros um a um. É um esquema muito parecido com grids de dados. Você está no registro número 50 e tem dois botões, um te leva para o registro 49 e outro para o registro 51.

Pensei rapidamente e primeira solução que veio foi obter todos os id's da tabela ordenados e desta forma usando o id atual obter o id imediatamente anterior e o id imediatamente posterior. Lembrando que os id's podem ter "falhas" entre eles, o registro depois do id 25 pode ser o registro de id número 30. Não é uma solução eficiente mas como a aplicação é pequena, vai ser usada por um pequeno número de usuários e aplicando o princípio "Premature Optimization is the root of all Evil" eu decidi deixar assim mesmo.

Mas mais tarde eu voltei a pensar sobre isso: "Puxa vida! Retornar 5000 valores para se usar apenas dois deles?! Deve existir uma solução que seja pelo menos elegante para este problema!". E existe! É possível retornar o id anterior e posterior de um dado id com apenas uma consulta, e aqui está ela:

Que legal! Vai retornar somente o que preciso e não tem problemas com "falhas" entre os valores e caso o valor não exista será retornado NULL. Tudo o que você tem a fazer é passar o id de referência para que possam ser encontrados os valores imediatamente anterior e posterior a ele, neste exemplo eu passei o valor 100 os valores retornados foram 99 e 101.

Eu não fiz nenhum teste de performance sério, mas usando a tabela students do banco de dados do post anterior sobre transações, que tem 5000 registros, a consulta por todos os id's demora em média 92ms no meu computador (o explain da consulta indica uma leitura de todos os registros da tabela como era de se esperar). Esta nova consulta que retorna apenas o que precisamos levou apenas 12ms em média para retornar os resultados. Eu não conheço muito sobre sql ou bancos relacionais, portanto, é bem provável que existam formas melhores de se fazer o que eu fiz, mas espero que este pequeno exemplo possa ajudá-los.