Em minha leitura matinal de feeds, me deparei com um post que aborda 40 dicas de como otimizar códigos PHP. Super interessante. Leia:40 Tips for optimizing your php Code
Arquivos da Tag: php
É ímpar ou par? Confira facilmente usando o PHP
Utilizando o seguinte código:
$status = (1 & $number) ? 'Ímpar' : 'Par';
Verificamos se o número informado é ímpar ou par, simples ou não?
Leia o original Odd and Even Numbers
Função para criar breadCrumbs
Desenvolvi uma função que facilita a criação de breadCrumbs. Veja como utilizá-la:
echo build_bread_crumbs(array('Home','Produtos','Produtos da categoria XXX'),array('/','/produtos/',''));
Observe que o último item do array no segundo parâmetro foi passo como vazio, com isso, o último item da lista do breadCrumbs não terá um link.
O código da função:
/**
* Função para criar breadCrumbs
* @autor Leandro Vieira Pinho [http://leandro.w3invent.com.br]
* @version 1.0
* @created sábado, 8 de abril de 2007
* @param $arrTetxt array informe os textos dos links
* @param $arrLinks array informe o link para os textos
* @param $strMessageBreadCrumb string mensagem inicial do breadCrumb
*/
function build_bread_crumbs($arrText = array(), $arrLinks = array(), $strMessageBreadCrumb = 'Você está aqui:') {
$strHtml = '';
$strHtml .= "<div id=\"bread-crumbs\">\n";
$strHtml .= "\t<ul>\n";
$strHtml .= "\t\t<li><strong>$strMessageBreadCrumb</strong></li>\n";
$i = 0;
foreach ( $arrText as $text ) {
if ( $arrLinks[$i] != '' ) {
$strHtml .= "\t\t<li><a href=\"$arrLinks[$i]\">$text</a></li>\n";
} else {
$strHtml .= "\t\t<li>» $text</li>\n";
}
$i++;
}
$strHtml .= "\t</ul>\n";
$strHtml .= "</div><!-- / bread-crumbs -->";
return $strHtml;
}
Talvez seja útil para mais alguém.
Atenção: atente-se aos “n” e “t” que na verdade são “\n” e “\t”;
Otimização de códigos PHP: Links
Segue abaixo alguns links de artigos que falam a respeito da otimização de códigos PHP.
Otimização de códigos PHP: Prefira as funções da extensão ctype do que expressões regulares
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:
- ctype_alnum;
- ctype_alpha;
- ctype_cntr;
- ctype_digit;
- ctype_graph;
- ctype_lower;
- ctype_print;
- ctype_punct;
- ctype_space;
- ctype_upper;
- ctype_xdigit
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
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
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
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
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
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í!