MySQL utilizando melhor o servidor – Data e hora

7

Posted by John-Henrique | Posted in Desenvolvimento, MySQL | Posted on 15-12-2008

Economize tempo durante a programação utilizando melhor o servidor MySQL (ou qualquer outro que você utilize), você pode conseguir isto conhecendo melhor as funcionalidades do MySQL, tentarei abordar situações reais do cotidiano de um programador.

Funções

Provavelmente você conheça diversas funções em PHP que permitam manipular data e hora e por este motivo você acostumou-se a trabalhar manipulação de data e hora diretamente no PHP, mas, você pode fazer toda a manipulação no banco de dados.

Imagine que um usuário adicionou uma nova notícia no sistema (qualquer sistema é só um exemplo), provavelmente a função ou script para realizar a gravação deste registro seja algo parecida com esta.

1
2
3
4
5
6
if( mysql_query( "INSERT INTO tabela_noticias ( `id`, `titulo`, `horario` ) VALUES ( NULL, '". $_POST['titulo'] ."', '". date( "Y-m-d H:i:s" ) ."' )" ) )
{
echo "Registro adicionado com sucesso";
}else{
echo "Não foi possível adicionar o registro";
}

A parte que nos interessa é a instrução SQL, mais precisamente a data e hora em que foi adicionada a noticia. Note que foi utilizada a função date do PHP, mas, poderíamos simplificar as coisas e deixar o script um pouco mais ágil trocando a instrução SQL anterior por esta.

1
2
3
INSERT INTO tabela_noticias
 VALUES 
( NULL, '". $_POST['titulo'] ."', NOW() )

Observe que troquei a função date por NOW(), uma função do MySQL (funciona em diversos SGBDs). Esta função retorna a data e hora atual no servidor MySQL e programando desta forma você diminui o tempo de processamento do PHP, claro, é imperceptível a diferença mas, dependendo da complexidade do sistema você notará uma grande diferença no tempo de processamento.

Conhecendo mais

Em alguns casos você precisa retornar em uma consulta apenas registros de determinado mês, como por exemplo somente os registros deste mês, uma consulta assim pode ser feita da seguinte forma.

1
2
3
SELECT * 
FROM tabela_noticias 
WHERE MONTH( `horario` ) = MONTH( NOW() )

Note que é uma consulta bem simples e que você não precisa informar nada além das funções MONTH e NOW, você já conheceu a função NOW, então nos resta a função MONTH, ela é responsável por retornar o mês de uma data. Os valores retornados serão 1 à 12 representando Janeiro à Dezembro.

Talvez você já esteja se perguntando “Mas e se eu precisar retornar os registros de 1 ou 2 meses atrás?”, bom, neste caso poderemos fazer um cálculo simples, direto no MySQL (sim, dá pra fazer cálculos matemáticos no MySQL).

Neste caso podemos resolver de forma simples, dois meses tem em média 60 dias, sendo assim, podemos utilizar a função DATE_ADD() fazer a seguinte consulta para retornar registro de dois meses atrás.

1
2
3
SELECT * 
FROM tabela_noticias 
WHERE MONTH( `horario` ) = MONTH( ADD_DATE( NOW(), -60 DAYS )  )

A mesma consulta mas, utilizando DATE_SUB, que é mais indicada para este caso até mesmo por uma questão de organização já que o nome da função já explica o que está fazendo nesta instrução.

1
2
3
SELECT * 
FROM tabela_noticias 
WHERE MONTH( `horario` ) = MONTH( DATE_SUB( NOW(), -60 DAYS )  )

Você também poderia querer retornar os registros de um ano específico ou do ano passado. E para isso poderia utilizar a função YEAR.

Para retornar registros de um ano especifico, neste caso o ano de 2007

1
2
3
SELECT * 
FROM tabela_noticias 
WHERE YEAR( `horario` ) = 2007

Para retornar registros de um ano anterior, neste caso o ano passado

1
2
3
SELECT * 
FROM tabela_noticias 
WHERE YEAR( `horario` ) = YEAR( DATE_SUB( NOW(), -365 DAYS) )

Conclusão

Trabalhar com datas no MySQL acaba sendo mais simples que trabalhar no PHP, facilita bastante a organização dos dados e o melhor de tudo é que diminui a quantidade de linhas de código na programação PHP já que toda a manipulação das datas ficam por conta do MySQL.

Melhore suas técnicas de programação – Parte 1

3

Posted by John-Henrique | Posted in Desenvolvimento, MySQL, Php, Tecnologia | Posted on 14-05-2007

Existem diversas formas de se escrever o mesmo código e ter o mesmo resultado, algumas destas formas economizam grande parte do seu tempo, vou mostrar aqui alguns exemplos básicos, até você vai se surpreender dizendo “Nossa! porque eu não fazia assim?”.

Em determinada parte do sistema você precisa realizar uma consulta no banco de dados MySQL por exemplo, normalmente você faria assim…

// REALIZANDO A CONSULTA NO BANCO
$sql = mysql_query(“SELECT * FROM tblUsuarios WHERE login = ‘john’”);

// INFORMANDO A QUANTIDADE DE REGISTROS ENCONTRADOS
$numeroRetornado = mysql_num_rows($sql);

// VERIFICANDO SE RETORNOU ALGUM REGISTRO
if($numeroRetornado != 0){

// FOI RETORNADO ALGUM REGISTRO
echo “Login existente!”;

}else{

// NÃO FOI RETORNADO REGISTRO
echo “Login inexistente!”;

}

Bom, neste pequeno trecho fizemos uma consulta e verificamos se o login “john” já existe no banco, mas, poderíamos ter feito de uma forma mais abreviada e “limpa”, veja…

// VERIFICANDO SE O LOGIN JÁ EXISTE NO BANCO
if(mysql_num_rows(mysql_query(“SELECT login FROM tblUsuarios WHERE login = ‘john’”)) != 0){

// FOI RETORNADO ALGUM REGISTRO
echo “Login existente!”;

}else{

// NÃO FOI RETORNADO REGISTRO
echo “Login inexistente!”;

}

Note que economizamos três linhas, mesmo sendo poucas deixamos a aparência do código mais “limpa”, ou seja, deixamos apenas o necessário.

Note também que abreviamos o retorno da consulta ao indentar mysql_num_rows() ao mysql_query() isso funciona perfeitamente já que o argumento de mysql_num_rows() é um link identificador de consulta que é exatamente o que o mysql_query() retorna, sendo assim, um ajuda o outro.

Ainda no mesmo código abreviamos o resultado da consulta informando quais os campos que desejamos usar, observe que eu informei apenas o campo login, isso faz com que o retorno da consulta seja menor e com isso o tempo de processamento do script também diminui deixando o sistema mais rápido.

Com estas pequenas dicas poderíamos melhorar o desempenho de um sistema qualquer deixando-o mais rápido, economizando processamento do hardware o que pode ser muito útil para sites que possuem alto trafego de dados.

MySQL REPLACE melhore seu INSERT e UPDATE

25

Posted by John-Henrique | Posted in Desenvolvimento, MySQL, Tecnologia | Posted on 02-05-2007

Por diversas vezes ao desenvolver determinada função de um sistema precisamos criar um registro ou alterar seu valor caso o registro já exista, para realizar esta operação � s vezes criamos um código relativamente grande e inútil. Isso por que, quando não criamos uma gambiarra ou como eu gosto de chamar “POGramação das boas” criamos um formulário para cadastrar e outro para atualizar.

Parando para analisar o código e codificando menos e pensando mais poderíamos realizar o procedimento de cadastrar e atualizar dados em um único formulário, até por que, normalmente os campos são os mesmos, esta operação pode ser facilitada usando a função REPLACE do [bp]MySQL[/bp].

Podemos utilizar a função REPLACE para realizar os dois procedimentos (inserção e atualização). A função REPLACE substitui um valor por outro, sendo assim, sempre que você informar um valor existente o MySQL irá apagá-lo e criar outro para substituí-lo. Para melhorar o entendimento vamos “desenhar”, ilustrado sempre é mais fácil.

ID NOMEUSUARIO
1 John
2 Fádylla
3 Rones

Só um detalhe meu nome é John-Henrique (é com o hifém mesmo), sendo assim, vamos atualizar o registro com id 1 para o valor correto usando REPLACE, deixando de ser “John” e passando a ser “John-Henrique”.

REPLACE INTO tabelaUsuario (id, nomeUsuario) VALUES (1, ‘John-Henrique’);

Observe que informei o nome de todos os campos da tabela e todos os valores que preciso trabalhar, note que no parâmetro VALUES eu informei o número que corresponde ao id do registro a ser atualizado, e é isso que permite a atualização. Se o id do registro informado não existir REPLACE irá criar um novo registro com o id informado

Com isso nossa tabela ficaria assim

ID NOMEUSUARIO
1 John-Henrique
2 Fádylla
3 Rones

Agora vamos imaginar que eu precise criar um novo registro, vejamos como criar um registro usando REPLACE.

REPLACE INTO tabelaUsuario (id, nomeUsuario) VALUES (NULL, ‘Cássia’);

Observe que informei todos os campos da tabela e deixei nulo o valor correspondente ao ID, também poderia fazer assim:

REPLACE INTO tabelaUsuario (id, nomeUsuario) VALUES (‘’, ‘Cássia’);

Desta forma teríamos criado um novo registro e nossa tabela estaria assim

ID NOMEUSUARIO
1 John-Henrique
2 Fádylla
3 Rones
4 Cássia

Esta função é bastante útil, mas, ainda não acabou tem mais. Além de permitir cadastrar e atualizar registros ela também permite saber qual foi o procedimento realizado através da quantidade de registros afetados na consulta.

Quando o valor de registros afetados for 2 significa que fora realizado um processo de atualização, é uma questão de lógica também, como eu havia dito no inicio REPLACE substitui um registro existente, sendo assim, existia um registro e foi atualizado, por isso a atualização com REPLACE afeta dois registros.

Quando o valor de registros afetados for 1 significa que fora criado um novo registro, também é questão de lógica, não havia registro então foi criado um.

Mais informações sobre:
REPLACE
MySQL REPLACE, INSERT e UPDATE unidos

MYSQL_AFFTED_ROWS
Registros afetados na consulta