Leandro Vieira Pinho´s Blog

Just another WordPress weblog

Archive for 'php'

Otimização de códigos PHP: Prefira as funções da extensão ctype do que expressões regulares

February 4th, 2007. Published under ctype, otimização, php. 2 Comments.

As funções da extensão ctype devem ser utilizadas ao invés de expressões regulares para conferir caracteres e strings. Com a utilização da extensão ctype você estará otimizando seu código PHP.

Segundo o manual do PHP as funções da extensão ctype devem ser utilizadas ao invés de expressões regulares e no lugar de algumas funções str_* e is_*. Pelo simples fato da extensão ctype utilizar um biblioteca nativa, a “C library”. O que significa dizer que você terá um ganho de performance e o processamento dos seus código será mais rápido.

As função da extensão cytpe são as seguintes:

Visite a página exclusiva de cada função descrita acima e comprove que além de otimizar seu código PHP as função da extensão ctype fará com que a tarefa de conferir caracteres e strings seja simples e fácil.

Ler arquivos remotos com PHP na DreamHost

December 27th, 2006. Published under curl, dreamhost, php. 9 Comments.

Durante todo o dia, estive desenvolvendo alguns recursos para um projeto em que estou envolvido. E para tal utilizei a função file do PHP. Uma vez que se fazia necessário a leitura remota de arquivos.

Meu código era mais ou menos o seguinte:

$arrLinhasPagina = file($url);
foreach( $arrLinhasPagina as $strLinha ) {
	// fal algo
}

Mas ao testar o sistema on-line recebi uma mensagem de erro, um tanto quanto inesperada por mim (já é tarde, quero dormir.) que me informava o seguinte: “URL file-access is disabled in the server configuration in [...]“. Caramba não funcionou, e agora José? A solução foi a de sempre.

E com isso, descobri que a DreamHost desabilita a opção allow_url_fopen que nos permite abrir, ler, incluir um arquivo remoto, entre outras opções. A alternativa é utilizar a cURL library.

Então, o código demonstrado acima teve que ser refeito, e assim foi. Resultando no seguinte:

$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 0);
$file_contents = curl_exec($ch);
curl_close($ch);
$arrLinhasPagina = explode("n",$file_contents); // Há uma \ (barra invertida) junto ao n.
foreach( $arrLinhasPagina as $strLinha ) {
	// fal algo
}

Este foi meu desafio de hoje e espero que a solução também possa ser útil a vocês.

Mais informações a respeito.

Funções do PHP para trabalhar com IP

December 19th, 2006. Published under php. 10 Comments.

O PHP oferece diversas funções para trabalharmos com endeços de IP. Veja alguns exemplos:

$ip = $_SERVER['REMOTE_ADDR'];
echo $ip; // 127.0.0.1

$host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
echo $host; // localhost

$get_ip = gethostbyname('www.uol.com.br');
echo $get_ip; // 200.221.2.45

$get_ips = gethostbynamel('www.google.com');
print_r($get_ips); // Array ( [0] => 66.102.7.99 [1] => 66.102.7.147 [2] => 66.102.7.104 )

A primeira função, $_SERVER['REMOTE_ADDR'], é utilizada para sabermos o endereço de IP de um usuário, por exemplo. A segunda, gethostbyaddr(), informa o nome do host name de Internet referente ao endereço de IP. A função gethostbyname() retorna o endereço de IP correspondente a um host name de internet, já a última delas, gethostbynamel(), retorna uma lista de endereços de IP correspondente ao host name de internet.

Hoje, conheci mais duas funções para se trabalhar com IP muito interessantes. São elas, ip2long() e long2ip(). Observe:

$receive = ip2long($_SERVER['REMOTE_ADDR']);
$output = long2ip($receive);
echo $receive; // 2130706433 {integer}
echo $output; // 127.0.0.1 {string}

Uma trabalha em conjunto com a outra. Enquanto a ip2long() converte uma string contendo um “Internet Protocol dotted address” válido em um integer; a long2ip() converte o integer em uma string.

A função ip2long() se torna muito útil, quando se faz necessário armazenar endereços de IP em um banco de dados. Reduzindo consideravelmente o espaço utilizado, além de tornar muito mais rápida uma futura consulta no banco de dados por esses endereços de IP.

Digo, reduzir o espaço por que ao invés de armazenar o endereço de IP como uma string - 127.0.0.1 - e utilizando para tal um campo do tipo char(15), o que gastaria 15 bytes. Você pode pode armazená-lo como um integer - 2130706433 - e gastar 4 bytes ao invés de 15. Posteriormente para exibir o endereço de IP, você usaria a função long2ip().

Para finalizar. Conheci a função ip2long() e long2ip neste post: 10 things you (probably) didn’t know about PHP e cheguei até ele através deste outro: Links comentados via del.icio.us - 7

Formatar as datas do MySQL com SQL ou PHP

December 7th, 2006. Published under mysql, php. 18 Comments.

Para cada campo de uma tabela em um banco de dados MySQL você deve definir um tipo de campo correspondente aos dados que serão inseridos nesse campo. Lhe recomendo a leitura deste artigo: Escolhendo um Tipo de Campo Correto, MySQL e deste: MySQL - Data Types.

Para gravarmos datas em um campo, por exemplo, podemos usar DATE (YYYY-MM-DD), DATETIME (YYYY-MM-DD HH:MM:SS) ou TIMESTAMP (YYYYMMDDHHMMSS). Mas, na hora de exibirmos estes dados no site, nem sempre queremos exibí-los da mesma forma como foram gravados. Principalmente se tratando de datas, pois elas são gravadas no padrão americano: ano-mês-dia, e para nós brasileiros que estamos acostumados com o nosso padrão: dia/mês/ano pode ficar bem confuso e desconfortável.

Vou mostrar-lhe duas formas de exibir as datas no formato brasileiro, ou seja, dia/mês/ano.

Através de instruções SQL

Você irá criar sua instrução SQL assim:

SELECT *,date_format(nome_do_campo, '%d/%m/%Y') AS data FROM nome_da_tabela

E para exibir, usaremos:

$row['data']

Através do PHP com a função strtotime

echo date('d/m/Y', strtotime($row['nome_do_campo']));

Portanto, basta você escolher a que lhe for mais conveniente.

Ajax e os acentos

December 7th, 2006. Published under ajax, javascript, php. 7 Comments.

Neste post, irei reproduzir um outro post que eu havia escrito em Janeiro deste ano, o qual falava sobre Ajax e os acentos.

Você já “queimou a cuca” ao trabalhar com Ajax e perceber que os acentos não estão sendo exibidos corretamente? Então, passei por isso ao desenvolver uma busca instantânea com esse método. E a solução? Vou explicar-lhe neste post.

Sempre que tenho alguma dúvida durante o meu trabalho, recorro aos amigos, aos fóruns e principalmente ao Google; e foi nesse último que encontrei a solução para o meu problema, no tutorial: Ajax para quem só ouviu falar, escrito pelo Élcio.

Lembrando que trabalho com PHP e se você trabalha com outra linguagem dinâmica, faça as modificações necessárias.

No arquivo PHP, precisamos utilizar a função urlencode(). Então, teremos algo assim:

$txt = "Tenha um bom coração.";
$txt = urlencode($txt);

O texto retornado será algo assim:

Tenha+um+bom+cora%E7%E3o.

Bom, agora no javascript fazemos assim:

var resultado = ajax.responseText; // Texto retornado pela requisição do ajax.
resultado = resultado.replace(/\+/g,” “); // Substitue o “+” por um espaço.
resultado = unescape(resultado); // Desfaz o que a função urlencode(); fez.

Bom, este é o processo para termos os acentos funcionando perfeitamente em nossas aplicações em Ajax.

Somando dias utéis a uma data específica com PHP

December 5th, 2006. Published under mysql, php. 14 Comments.

Durante meu trabalho hoje no desenvolvimento de um projeto, precisei somar uma quantidade X de dias úteis a uma data específica. Logo recorri a um grande amigo que sempre me diz se alguém já precisou do mesmo recurso e encontrou/desenvolveu algo a respeito.

Nessa recorrida, encontrei um tópico e um post que me inspirou a criar a seguinte função em PHP:

[UPDATE] Anderson Mello contribui para a solução de bug na função. Grato Anderson. [/UPDATE]

function somar_dias_uteis($str_data,$int_qtd_dias_somar = 7) {

    // Caso seja informado uma data do MySQL do tipo DATETIME - aaaa-mm-dd 00:00:00

    // Transforma para DATE - aaaa-mm-dd

    $str_data = substr($str_data,0,10);

    // Se a data estiver no formato brasileiro: dd/mm/aaaa

    // Converte-a para o padrão americano: aaaa-mm-dd

    if ( preg_match("@/@",$str_data) == 1 ) {

        $str_data = implode("-", array_reverse(explode("/",$str_data)));

    }

    $array_data = explode('-', $str_data);

    $count_days = 0;

    $int_qtd_dias_uteis = 0;

    while ( $int_qtd_dias_uteis < $int_qtd_dias_somar ) {

        $count_days++;

                if ( ( $dias_da_semana = gmdate('w', strtotime('+'.$count_days.' day', mktime(0, 0, 0, $array_data[1], $array_data[2], $array_data[0]))) ) != '0' && $dias_da_semana != '6' ) {

            $int_qtd_dias_uteis++;

        }

    }

    return gmdate('d/m/Y',strtotime('+'.$count_days.' day',strtotime($str_data)));

}

Exemplo de uso:

echo somar_dias_uteis('05/12/2006');

echo somar_dias_uteis('2006-12-01',15);

O que ela faz é pegar a data informada, somar uma quantidade de dias úteis a ela e retornar uma nova data com a soma realizada.

Se você informar à função uma data no formato brasileiro - dd/mm/aaaa - ela irá convertê-la para o padrão americano - aaaa-mm-dd. Esse padrão americano é utilizado pelo MySQL quando você define um campo com o formato DATE. Caso sua data esteja armazenada no formato DATETIME a função irá pegar somente a data e excluir o horário :)

Alguma dúvida? Sugestão? Comente aí!

Característica comum nos aplicativos web 2.0 me preocupa.

December 4th, 2006. Published under DOM, ajax, javascript, php, web 2.0, web standards. 2 Comments.

Tenho percebido uma característica comum nos aplicativos web 2.0 que me preocupa em muito, se trata da utilização do javascript obstrutivo. Sim, muitos sites a la web 2.0 utilizam o javascript dessa maneira, que pena.

O que me intrigou a observar essa questão, foi a agilidade em que os aplicativos são desenvolvidos, muitos deles não gastam mais de uma semana. E com isso, a acessibilidade em alguns aspectos é desconsiderada.

Ora, em meados a propagação cada dia mais e mais dos padrões da web, por que os desenvolvedores estão utilizando o javascript de forma obstrutiva? Seria a pressa em lançar seus serviços on-line? Seria uma desconsideração para com aqueles que navegam com o javascript desabilitado? Ou seria uma forma para posteriormente (e se acontecer) incrementar uma versão com o HTML puro?

Todos os dias eu penso em um forma de ser produtivo e ágil no desenvolvimento para web, trabalhando com Ajax, javascript não-obstrutivo, DOM e o PHP (linguagem dinâmica com o qual eu trabalho). No meu curso Web Sites com Ajax eu explico e exemplifico a metodologia que utilizo, mas confesso, estou ávido a procura de algo novo.

Qual a sua metodologia de desenvolvimento para se trabalhar com javascript não-obstrutivo?

[update]
Uma boa matéria do parceiro Metzen sobre javascript não-obstrutivo

[/update]

Dreamweaver + PHP + MySQL. É simples e fácil!

November 16th, 2006. Published under dreamweaver, iMasters, mysql, php. 5 Comments.

Neste mês de novembro, o CD-ROM Dreamweaver + PHP + MySQL de minha autoria e lançado em parceria com o iMasters Shop completa um ano de vida.

Fiquei muito satisfeito com a receptividade que ele obteve perante ao público do iMasters. E mais ainda com os feedbacks recebidos. A grande maioria fala sobre a didática simples e de fácil entendimento, fator que considero primordial para facilitar o aprendizado e que me preocupo muito quando escrevo.

O curso é divido em 10 capítulos e aborda o trabalho diário de desenvolvimento integrando o Dreamweaver, o PHP e o MySQL. O objetivo final do curso é o desenvolvimento de um sistema completo de notícias e administração, utilizando todas as tecnologias abordadas.

Se você ainda não teve a oportunidade de conhecer o CD-ROM Dreamweaver + PHP + MySQL , conheça-o.