Laravel é um framework que tem se tornado bastante popular no mundo do PHP. Uma das vantagens dele sobre outros frameworks é que ele permite que seu código fique limpo e fluído, especialmente pela forma como ele trata as dependências e outras ajudas. Mas isso é assunto para outro momento. Agora, queria falar um pouco sobre a manipulação...
7 coisas simples em PHP que alguns ainda complicam

Existem muitas coisas no PHP que deveriam ser feitas de maneira simples pelo seu nível de dificuldade , porém alguns programadores acabam complicando e consequentemente gerando uma dificuldade tanto para a manutenção do código quanto para sua própria legibilidade durante o desenvolvimento do projeto . Para solucionar alguns desses problemas resolvemos listar os erros mais comuns e como resolve-los de maneira eficiente . Vamos lá !
1. Listar arquivos de um diretório
Se não houver um motivo muito claro pra usar opendir, readdir e closedir (não consigo pensar em nenhum), a forma mais prática de listar o conteúdo de um diretório é com DirectoryIterator:
- $iterator = new DirectoryIterator('/var/www');
- foreach ( $iterator as $entry ) {
- echo $entry->getFilename(), "
- ";
- }
Se for necessário listar os arquivos recursivamente, percorrendo todos os subdiretórios, é só usar o RecursiveDirectoryIterator junto com o RecursiveIteratorIterator:
- $iterator = new RecursiveDirectoryIterator('/var/www');
- $recursiveIterator = new RecursiveIteratorIterator($iterator);
- foreach ( $recursiveIterator as $entry ) {
- echo $entry->getFilename(), "
- ";
- }
Com um pouco de criatividade, é possível estender essas classes com qualquer lógica facilmente, como por exemplo, para montar uma árvore com a estrutura dos diretórios.
2. Montar e desmontar query strings
Mesmo que menos comum (e menos útil), colocar uma query string numa URL é um trabalho trivial demais pra ser feito com implode, concatenando tudo ou qualquer outro método engenhoso. Desde o lançamento do PHP 5 é possível contar com a http_build_query:
- $dados = array(
- 'hl' => 'pt-BR',
- 'q' => 'Forgetting Sarah Marshall',
- 'testa-escape' => 'acentuação',
- );
- echo http_build_query($dados);
- // hl=pt-BR&q=Forgetting+Sarah+Marshall&testa-escape=acentua%C3%A7%C3%A3o
E o inverso também é possível com as funções parse_url e parse_str:
- $url=parse_url('https://www.google.com/searchq=anneke+van+giersbergen&num=50');
- parse_str($url['query'], $query);
- echo $query['q'];
- // anneke van giersbergen
Só fique atento que, por motivos alheios ao bom senso, parse_str por padrão extrai as variáveis no escopo onde foi chamada. É necessário passar um segundo argumento para ter um array gerado por referência, como no exemplo acima com a variável $query.
3. Ler páginas remotas
Dentre todas as implementações, a mais desnecessária costuma ser fsockopen, fwrite, feof, fgets e fclose para ler arquivos remotos por HTTP.
Uma função já resolve:$contents =file_get_contents('https://php.net/file_get_contents');
Isso é possível graças aos protocol wrappers que encapsulam a lógica de acesso aos respectivos protocolos, tal como HTTP. Esta forma de acesso, no entanto, depende da configuração allow_url_fopen estar habilitada no php.ini (que é o padrão).
Para ler os response headers da requisição, utilize fopen com stream_get_meta_data.
E se um dia você quiser impressionar a mulherada, veja a função stream_wrapper_register para criar o seu próprio protocol wrapper.
4. Submeter dados por post para uma página remota
A coisa fica mais complicada quando o desenvolvedor pensa em usar cURL pra submeter dados por POST para outro servidor. A extensão até tem seu mérito, mas usá-la apenas pra este propósito é um grande equívoco.
As funções que fazem uso dos protocol wrappers aceitam um objeto de stream context, criado pela função stream_context_create, para configurar alguns aspectos do protocolo. As opções de contexto do protocolo HTTP permitem definir, entre outras coisas, o método de acesso (GET, POST, etc) e o conteúdo a ser postado:
- $content = http_build_query(array(
- 'cidade' => 'Rio de Janeiro',
- 'tipo' => 'Apartamento',
- ));
- $context = stream_context_create(array(
- 'http' => array(
- 'method' => 'POST',
- 'content' => $content,
- )
- ));
- $contents = file_get_contents('https://exemplo/teste.php', null, $context);
Quando não for necessário ler o retorno da requisição, basta chamar a url com fopen passando o contexto como quarto argumento.
5. Fazer download de um arquivo remoto
Vale lembrar que a maioria das funções de stream e filesystem aceitam URLs completas e fazem uso da abstração do protocolo. O que eu vejo muita gente esquecer é que isso inclui a função copy:
- $url = "https://userserve-ak.last.fm/serve/500/4349551/Terri+Clark.jpg";
- copy($url, '/tmp/' . urldecode(basename($url)));
O trecho acima vai baixar a imagem remota e salvar no arquivo local /tmp/Terri Clark.jpg. E caso não seja óbvio, "local" se refere a quem está executando o script PHP, que no caso será o seu servidor caso seja um script web, e não o cliente que está acessando pelo browser.
Se o objetivo for realmente repassar o conteúdo remoto para o cliente que estiver acessando pelo browser, o script é igualmente simples:
- $url = 'https://userserve-ak.last.fm/serve/500/4349551/Terri+Clark.jpg';
- $handle = fopen($url, 'r');
- $meta_data = stream_get_meta_data($handle);
- // Repassa todos os headers do servidor remoto para o nosso cliente
- foreach ( $meta_data['wrapper_data'] as $header ) {
- header($header);
- }
- // Repassa o conteúdo para o nosso cliente
- fpassthru($handle);
Considerando que estamos apenas testando a funcionalidade. Ter um script de proxy totalmente funcional é bem mais complexo, e certamente já tem algo pronto por aí.
6. Fazer cálculo com data
Dentre todas as simplificações possíveis, a que mais costuma comover é a função strtotime. Pra quem já está acostumado, parece que não faz mais do que sua obrigação. Mas pra quem ainda faz cálculos com data multiplicando por 86400, chega a parecer mágico:
- echo 'Amanhã: ', strftime('%A', strtotime('tomorrow'));
- // Amanhã: domingo
- echo 'Próxima segunda: ', strftime('%d de %B de %Y', strtotime('next monday'));
- // Próxima segunda: 01 de junho de 2009
- echo 'Vencimento: ', strftime('%d/%m/%Y', strtotime('+3 months'));
- // Vencimento: 30/08/2009
Mais exemplos você mesmo pode ver no manual do PHP ou na página de Date Input Formats do projeto GNU. Para o nome dos meses e dias da semana ficarem em português, utilize setlocale(LC_TIME, 'pt_BR'); antes de chamar a função strftime.
7. Escapar sql e html
Felizmente nunca mais vi nenhum script com aberrações anti-sql-injection, mas há algum tempo era possível encontrar pessoas removendo palavras-chave de SQL de todas as strings que íam para o banco de dados. Se o usuário digitasse palavras como select, delete ou drop, elas eram simplesmente removidas da frase. Isso quando o programador não interrompia o script e acusava o usuário de estar tentando explorar alguma falha de segurança. Eu juro, isso existia.
Ao trabalhar com PDO, a melhor opção (pra não dizer a única!) é utilizar prepare e execute pra separar a query em si dos seus parâmetros:
- $conexao = new PDO('mysql:dbname=banco;host=localhost', 'login', 'senha');
- $uf = 'RJ';
- $idade = 18;
- $sth = $conexao->prepare('SELECT nome FROM pessoa WHERE uf = ? AND idade > ?');
- $sth->execute(array($uf, $idade));
- while ( $row = $sth->fetch() ) {
- echo $row['nome'];
- }
Se estiver utilizando drivers nativos, veja as funções mysql_real_escape_string ou mysqli_prepare e mysqli_stmt_bind_param, dependendo da extensão. Certamente outros bancos de dados têm a mesma funcionalidade.
A única preocupação é garantir que os parâmetros não se misturem com a query; não precisa inventar moda e remover o que o usuário digitou.
Outra confusão comum é ao escapar HTML. O objetivo é evitar que o texto digitado por um usuário seja interpretado pelo browser de todos os usuários do site.
Conceitualmente, esta é uma responsabilidade da camada de exibição. O template é que deve utilizar htmlspecialchars antes de gerar a saída na tela, e não antes de salvar no banco. Isso garante que o conteúdo que está no banco é fiel ao que foi digitado pelo usuário e pode ser reaproveitado em outras mídias além do HTML.
O que pode e deve ser feito é filtrar conteúdo realmente indevido, como caracteres inválidos ou espaços extras, dependendo da aplicação.
Gostou do artigo? Você pode aprender muito mais e se tornar um programador profissional através de nosso curso Ultimate PHP 2.0
Posts mais recentes em nosso blog
Leia o que há de novo essa semana
Com a popularidade dos frameworks PHP e sua importância no mercado de desenvolvimento de aplicações web , resolvemos fazer esse artigo mostrando os prós e contras em se utilizar o codeingniter ou laravel em seus projetos. Optamos por abordar esses dois em particular pois são os mais utilizados no mercado atualmente . Vamos lá !
8 Dicas de PHP que você deveria conhecer
Apesar do PHP já existir a um bom tempo , muitas são as coisas que se podem fazer com essa linguagem e que ainda são desconhecidas por muitos programadores iniciantes ou até mesmo para aqueles que já trabalham com ela a varios anos .



