PHP

Armazenando arquivos (zip, mp3, xls, etc) no banco de dados

Conteúdo abordado no tutorial: PHP e MySQL

Você já se perguntou “Como armazeno arquivos no banco de dados ao invés de armazenar um endereço de localização?”. A resposta é bem simples, basta usar o tipo BLOB (Binary Large Objects) no campo de sua tabela. Campos do tipo BLOB podem armazenar praticamente qualquer tipo de dados, desde um arquivo .txt até um arquivo .mp3.

Quando um arquivo é armazenado no banco de dados usando um campo do tipo BLOB, ele é convertido para binário, não podendo ser alterado diretamente no banco, a não ser que seja enviado novamente.

Em se tratando de MySQL, existem quantro variações do tipo BLOB, cada uma com sua limitação de armazenamento, conforme mostrado abaixo:

tinyblob = tamanho máximo de 255 caracteres

blob = tamanho máximo de 65535 caracteres

mediumblob = tamanho máximo de 16777215 caracteres

longblob = tamanho máximo de 4294967295 caracteres

Para este tutorial iremos utilizar o tipo “mediumblob”, mas você deve escolher aquele que se adequa melhor à sua necessidade.

Para começar a trabalhar, vamos criar o banco de dados, que se chamará ‘tutorial_manipblob_db”. Você pode criar usando o phpmyadmin ou qualquer outro SGBD de sua escolha.

Após criar o banco de dados, vamos criar a tabela que se chamará “arquivos”. Para isso, basta rodar a instrução SQL a seguir:

CREATE TABLE arquivos(
   id int not null auto_increment primary key,
   nome varchar(50),
   titulo varchar(50),
   conteudo mediumblob,
   tipo varchar(50)
);

Com estrutura de banco de dados para armazenamento das informações criada, chegou a hora de começar a escrever um pouco de código e fazer tudo funcionar.

Serão criado 4 arquivos:

index.php – formulário para envio do arquivo

gravar.php – gravará o arquivo no banco de dados

listar.php – listará os registros armazenados no banco de dados

baixar.php – fará o download do arquivo, ou abrirá o mesmo no browser

Criando o arquivo index.php

Nesse arquivo está o código html do formulário responsável por enviar o arquivo para o servidor, para que seja armazenado no banco de dados.

<html>
<head>
 <title>Armazenado arquivos no banco de dados</title>
<head>
<body>
<form enctype="multipart/form-data" action="gravar.php" method="post">
<label>Descrição</label>
<input type="text" name="titulo" size="30">
<label>Arquivo</label>
<input type="file" name="arquivo">
<input type="submit" value="Enviar arquivo">
</form>
</body> 
</html>

Importante!
Sempre que um formulário for fazer envio de arquivos, ele precisa ter a propriedade “enctype” setada como “multipart/form-data”, senão o arquivo não será enviado.

Criando o arquivo gravar.php

Esse é o responsável por fazer a gravação dos dados do arquivo e do próprio arquivo no banco de dados.


<?php
//Faz a conexão com o banco de dados (troque usuário e senha pelos dados de acesso ao seu banco de dados)
$conn = mysql_connect("localhost","usuario","senha");
mysql_select_db("tutorial_manipblob_db");

//Extrai as informações do arquivo para serem armazenadas em seus respectivos campos na tabela do banco de dados
$arquiivo = $_FILES['arquivo']['tmp_name'];
$tamanho = $_FILES['arquivo']['size'];
$tipo    = $_FILES['arquivo']['type'];
$nome  = $_FILES['arquivo']['name'];
$titulo  = $_POST['titulo'];

//Verifica se foi enviado algum arquivo através do formulário
if ($arquivo != "none"){
//Abre o arquivo enviado como somente leitura
   $fp = fopen($arquivo, "rb");
   //lê o conteúdo do arquivo e o armazena em uma variável
   $conteudo = fread($fp, $tamanho);
   //insere uma \ antes de ', " e /
   $conteudo = addslashes($conteudo);
   //fecha o arquivo
   fclose($fp);
   //Instrução SQL para inserir os dados do arquivo e o próprio arquivo no banco de dados
   $qry = "INSERT INTO arquivos VALUES (0,'".$nome."','".$titulo."','".$conteudo."','".$tipo."')";
   //Executa a instrução criada na linha acima
   mysql_query($qry);
   //Verifica se os dados foram armazenados no banco de dados
   if(mysql_affected_rows($conn) > 0){
      //Se foram, então informa sobre a gravação e exibe um link para a lista com os dados armazenados no banco de dados
      echo "O arquivo foi gravado na base de dados.<br/><br/>";
      echo "<a href=\"listar.php\">Veja os arquivos armazenados clicando aqui.</a>";
   }else
      //Se não foi feita a gravação, então informa que não foi possível gravar
      echo "Não foi possível gravar o arquivo.";
}else
   //Se não foi enviado nenhum arquivo pelo formulário, então informa ao usuário
   echo "Não foi possível carregar o arquivo.";
?>

Criando o arquivo listar.php

Esse arquivo irá exibir uma lista com as informações de cada registro do banco de dados e um link para o download do arquivo.

<?php
//Conexão com o banco de dados
$conn = mysql_connect("localhost","root","");
mysql_select_db("tutorial_manipblob_db");
//Instrução SQL para trazer todos os registros armazenados no banco de dados
$qry = "SELECT id, nome, titulo, tipo FROM arquivos";
//Executa a instrução criada na linha acima
$res = mysql_query($qry);
//A execução da instrução SQL retornará um array, então será feito um loop por ele
//para listar cada um dos registros retornados
while($fila = mysql_fetch_array($res)){
 //imprime na tela os dados do registro incluindo um link que aponta para o arquivo baixar.php
 //e uma variável id, que contém o código do registro no banco de dados, para que possa ser recuperado e baixado
 echo $fila['titulo']."<br/>".$fila['nome']."(".$fila['tipo'].")<br/><a href=\"baixar.php?id=".$fila['id']."\">Fazer Download</a><br/><br/>";
}
?>

Criando o arquivo baixar.php

O arquivo baixar.php é o responsável pelo download do arquivo armazenado no banco de dados. Conforme o tipo de arquivo armazeado, ele poderá ser aberto no próprio browser ou então aberta uma tela para salvar o arquivo em disco.

<?php
//Faz a conexão com o banco de dados
$conn = mysql_connect("localhost","root","");
mysql_select_db("tutorial_manipblob_db");
//Instrução SQL que irá recuperar o arquivo selecionado
$qry = "SELECT tipo, conteudo FROM arquivos WHERE id=".$_REQUEST['id'];
//Executa a instrução SQL criada na linha acima
$res = mysql_query($qry);
//Passa à variável $tipo o tipo do arquivo
$tipo = mysql_result($res, 0, "tipo");
//Passa à variável $conteudo o conteúdo, o arquivo propriamente dito
$conteudo = mysql_result($res, 0, "conteudo");
//Adiciona o cabeçalho para o tipo de arquivo armazenado,
//para que o browser possa interpretá-lo corretamente
header("Content-type: $tipo");
//Imprime na tela o conteúdo do arquivo ou abre uma tela para gravar em disco.
echo $conteudo;
?>

Com isso foi criado um simples sistema para armazenamento de arquivos em banco de dados, usando PHP, MySQL e o tipo de dados BLOB.

Clique aqui e faça o download dos fontes para estudo.

Em caso de dúvidas, esclarecimentos, sugestões ou elogios, deixe nos comentários, que responderei o mais breve possível.

Bookmark e Compartilhe

Previsão do tempo no seu site com o Google Weather

Hoje vamos aprender mais um pouco com as inovações do Google, só que dessa vez vamos ver a API do Google Weather, que permite a você colocar a previsão do tempo em seu site de uma maneira bem simples, usando PHP e XML, além do bom e velho HTML e CSS (para estilizar a página).

Nesse tutorial serão utilizados 3 arquivos, que podem ser baixados ao final dessa página.

index.php

Arquivo onde está a exibição da previsão do tempo.

previsao.class.php

Arquivo com a classe e os métodos utilizados para gerar a previsão.

previsao.xml

Arquivo utilizado para que seja possível ver os resultados sem uma conexão com a internet, sendo utilizado nesse artigo somente para facilitar a compreensão e visualização dos resultados caso não se tenha uma conexão com a internet.

Faça o download dos arquivos: Previsão do Tempo com Google Weather

Antes de começar a explicar/ensinar a codificação de cada um dos arquivos citados acima, vamos entender primeiro como funciona a API e o que é preciso enviar a ela para que se tenha o retorno dos dados necessários.

Quando solicitamos ao Google Weather a uma previsão do tempo, ele busca essas informações com base em 4 parâmetros, que são: cidade, estado, país e idioma, onde no nosso caso o idioma utilizado deve ser pt-br, cidade e estado devem ser escritos por extenso e o país escrito por extenso e em inglês, no caso Brazil.

Essa solicitação é enviada para o Google através de uma URL, que tem o seguinte formato:

Base: http://www.google.com/ig/api?weather=cidade,estado,país&hl=idioma

Com parâmetros: http://www.google.com/ig/api?weather=Vitoria,Espirito Santo,Brazil&hl=pt-br

Ao enviar esses parâmetros para o Google através da URL http://www.google.com/ig/api e seus respectivos parâmetros, será retornado um arquivo XML com a previsão do tempo para a localidade solicitada.

Esse arquivo retornará os seguintes dados:
Informações sobre a localidade para a qual foi solicitada a previsão do tempo
A previsão do tempo para o dia atual
A previsão do tempo para os próximos 4 dias
Atenção
Toda vez que a página onde está a previsão do tempo é carregada, é feito o acesso ao Google para se obter a previsão do tempo, o que pode tornar o carregamento da página lento. Recomenda-se gravar o arquivo XML retornado pelo Google no servidor, para que o acesso aos dados seja mais rápido.
Veja abaixo um exemplo do XML retornado pelo Google.

<xml_api_reply version=”1″>

<weather module_id=”0″ tab_id=”0″ mobile_row=”0″ mobile_zipped=”1″ row=”0″ section=”0″ >

<forecast_information>

<city data=”Vitória, ES”/>

<postal_code data=”Vitoria,Espirito Santo,Brazil”/>

<latitude_e6 data=”"/>

<longitude_e6 data=”"/>

<forecast_date data=”2010-05-24″/>

<current_date_time data=”2010-05-24 22:00:00  0000″/>

<unit_system data=”SI”/>

</forecast_information>

<current_conditions>

<condition data=”Nublado”/>

<temp_f data=”77″/>

<temp_c data=”25″/>

<humidity data=”Umidade: 78%”/>

<icon data=”/ig/images/weather/cloudy.gif”/>

<wind_condition data=”Vento: O a 3 km/h”/>

</current_conditions>

<forecast_conditions>

<day_of_week data=”seg”/>

<low data=”19″/>

<high data=”28″/>

<icon data=”/ig/images/weather/chance_of_rain.gif”/>

<condition data=”Possibilidade de chuva”/>

</forecast_conditions>

<forecast_conditions>

<day_of_week data=”ter”/>

<low data=”20″/>

<high data=”29″/>

<icon data=”/ig/images/weather/mostly_sunny.gif”/>

<condition data=”Ensolarado na maioria”/>

</forecast_conditions>

<forecast_conditions>

<day_of_week data=”qua”/>

<low data=”21″/>

<high data=”28″/>

<icon data=”/ig/images/weather/chance_of_rain.gif”/>

<condition data=”Possibilidade de chuva”/>

</forecast_conditions>

<forecast_conditions>

<day_of_week data=”qui”/>

<low data=”21″/>

<high data=”27″/>

<icon data=”/ig/images/weather/chance_of_rain.gif”/>

<condition data=”Possibilidade de chuva”/>

</forecast_conditions>

</weather>

</xml_api_reply>

Explicando o arquivo previsão.xml

< forecast information> – armazena as informações da localidade para a qual foi solicitada a previsão do tempo.

< city data=”"/> – nome da cidade e o estado

< postal_code data=”"/> – uma estrutura de exibição como “cidade, estado, país”

< forecast_date data=”" /> – data da solicitação da previsão do tempo (data em que foi gerado o arquivo XML)

< current_date_time data=”" /> – data e hora corrente

< current_conditions> – armazena as informações da previsão do tempo para a data atual

< condition data=”"/> – condição do tempo (nublado, possibilidade de chuva, etc)

< temp_f data=”"/> – temperatura em graus Farenheit

< temp_c data=”"/> – temperatura em graus Celsius

< humidity data=”"/> – Umidade do ar

< icon data=”"/> – imagem que representa a condição do tempo

< wind_condition data=”"/> – velocidade do vento

< forecast_conditions> – armazena as informações da previsão do tempo para os próximos 4 dias

< day_of_week data=”"/> – dia da semana

< low data=”"/> – temperatura mínima

< high data=”"/> – temperatura máxima

< icon data=”"/> – imagem que representa a condição do tempo

< condition data=”"/> – condição do tempo (nublado, possibilidade de chuva, etc)

Após entender o XML, vamos ver o arquivo previsao.class.php, responsável pelos métodos que irão armazenar os parâmetros para a solicitação da previsão do tempo e a geração do XML com a previsão do tempo.

<?php

class PrevTempo {

function Parametros($cidade,$estado,$pais,$idioma){

$parametros['cidade'] = $cidade;

$parametros['estado'] = $estado;

$parametros['pais'] = $pais;

$parametros['idioma'] = $idioma;

$parametros['urlapi'] = ‘http://www.google.com/ig/api’;

return $parametros;

}

function GeneratePrevTempo($parametros){

$url = $parametros['urlapi'].”?weather=’” . urlencode($parametros['cidade']) .”‘,’” . urlencode($parametros['estado']) . “‘,’” . urlencode($parametros['pais']) . “‘&hl=” . $parametros['idioma'];

/* A $url_alternativa é usada para que você possa acompanhar esse tutorial de forma offline */

$url_alternativa = “previsao.xml”;

$resultado = file_get_contents($url_alternativa);

$xml = simplexml_load_string(utf8_encode($resultado));

$dados['info'] = $xml->xpath(‘/xml_api_reply/weather/forecast_information’);

$dados['atual'] = $xml->xpath(‘/xml_api_reply/weather/current_conditions’);

$dados['proximos'] = $xml->xpath(‘/xml_api_reply/weather/forecast_conditions’);

return $dados;

}

}

?>

Entendendo o arquivo previsao.class.php

function Parametros() – essa função é responsável por retornar um array com os parâmetros necessários para a solicitação da previsão do tempo.

function GeneratePrevTempo($parametros) – essa função gera um array multidimensional com as informações retornadas pelo Google sobre a previsão do tempo.

Na função GeneratePrevTempo($parametros) são passados os parâmetros retornados na função Parametros($cidade,$estado,$pais,$idioma), para seja feita a requisição dos dados ao Google.

Observação:

A variável $url_alternativa está sendo usada para chamar o arquivo previsao.xml, para que seja possivel rodar localmente, sem conexão com a internet. Para acessar as informações online, basta usar a variável $url.

$url = $parametros['urlapi'].”?weather=’” . urlencode($parametros['cidade']) .”‘,’” . urlencode($parametros['estado']) . “‘,’” . urlencode($parametros['pais']) . “‘&hl=” . $parametros['idioma'];

Essa linha é responsável por montar a url que solicitará os dados ao Google, passando os parâmetros necessários, como explicado no inpicio desse tutorial. Repare que está sendo utilizada a função urlencode() para que seja feita a codificação correta da url, de forma que o Google consiga entender os dados enviados.

$resultado = file_get_contents($url_alternativa);

Aqui é feita a leitura do arquivo retornado para a variável $resultado. Esse arquivo, no caso deste tutorial é um XML.

$xml = simplexml_load_string(utf8_encode($resultado));

Agora fazemos a leitura da string XML armazenada em $resultado e codificada para UTF8 através da função utf8_encode();

$dados['info'] = $xml->xpath(‘/xml_api_reply/weather/forecast_information’);

$dados['atual'] = $xml->xpath(‘/xml_api_reply/weather/current_conditions’);

$dados['proximos'] = $xml->xpath(‘/xml_api_reply/weather/forecast_conditions’);

Nas linhas acima separamos em um array multidimensional os valores recuperados da string XML usando xpath, onde o parâmetro passado é o caminho onde a informação deverá ser buscada dentro do XML. Esse caminho são as tags que armazenam o conteúdo, por exemplo, ‘/xml_api_reply/weather/forecast_information’ corresponde às tags , e , respectivamente.

return $dados;

Enfim, retornamos o array com os dados da previsão do tempo, para que possam ser utilizados no arquivo index.php, que será explicado agora.

<?php

include(‘prevtempo.class.php’);

$parametros = PrevTempo::Parametros(‘Vitoria’,'Espirito Santo’,'Brazil’,'pt-br’);

$previsao = PrevTempo::GeneratePrevTempo($parametros);

?>

<html>

<head>

<title>Previsão do Tempo com a API do Google Weather</title>

</head>

<body>

<h1>Previsão do Tempo – <?php echo date(‘d/m/Y’, strtotime($previsao['info'][0]->forecast_date['data'])); ?></h1>

<p><b>Cidade:</b> <?php echo utf8_decode($previsao['info'][0]->city['data']); ?></p>

<h2>O Tempo Hoje</h2>

<table>

<tr>

<td><img src=”http://www.google.com<?php echo $previsao['atual'][0]->icon['data']; ?>” alt=”clima” /></td>

<td><?php echo $previsao['atual'][0]->temp_c['data']; ?>°C<br />

<?php echo $previsao['atual'][0]->condition['data']; ?></td>

</tr>

</table>

<h3>Nos Próximos Dias</h3>

<table>

<?php foreach ($previsao['proximos'] as $item) { ?>

<tr>

<td><img src=”http://www.google.com<?php echo $item->icon['data']; ?>” alt=”clima” /></td>

<td><b><?php echo $item->day_of_week['data'];?></b> – <?php echo $item->condition['data']; ?><br /><?php echo $item->low['data']; ?>/<?php echo $item->high['data']; ?>° C</td>

</tr>

<?php } ?>

</table>

</body>

</html>

Entendendo o arquivo index.php

Como pode ser observado, a base desse arquivo é o bom e velho HTML, então dividi o mesmo em blocos de relevância, para que fique mais fácil compreender o que está sendo executado, uma vez que o foco desse tutorial não é ensinar o HTML e sim como implementar a previsão do tempo via API.

O primeiro bloco a ser visto é o seguinte:

<?php

include(‘prevtempo.class.php’);

$parametros = PrevTempo::Parametros(‘Vitoria’,'Espirito Santo’,'Brazil’,'pt-br’);

$previsao = PrevTempo::GeneratePrevTempo($parametros);

?>

Nesse bloco nós damos a include do arquivo prevtempo.class.php, que contém os métodos responsáveis pela solicitação e manipulação dos resultados retornados pela API.

Em seguida retornamos para a variável $parametros os parâmetros para solicitação das informações.

Depois retornamos para a variável $previsao os dados da previsão do tempo, através da função GeneratePrevTempo($parametros).

O segundo bloco a ser visto é:

<h1>Previsão do Tempo – <?php echo date(‘d/m/Y’, strtotime($previsao['info'][0]->forecast_date['data'])); ?></h1>

<p><b>Cidade:</b> <?php echo utf8_decode($previsao['info'][0]->city['data']); ?></p>

Na primeira linha imprimimos a data atual, que é retornada a partir do array $previsao['info'][0]->forecast_date['data']. Veja a explicação a seguir para compreender essa chamada.

Na segunda linha imprimimos o nome da cidade e o estado usando a mesma chamada da linha 1, substituindo somente a tag com o dado a ser impresso. Usamos a função utf8_decode() para retornar à codificação padrão da página.

$previsao['info'][0]->forecast_date['data']

array_e_posicao->tag_com_o_dado['campo_com_o_valor']

Sintaxe da chamada

O terceiro bloco é:

<h2>O Tempo Hoje</h2>

<table>

<tr>

<td><img src=”http://www.google.com<?php echo $previsao['atual'][0]->icon['data']; ?>” alt=”clima” /></td>

<td><?php echo $previsao['atual'][0]->temp_c['data']; ?>°C<br />

<?php echo $previsao['atual'][0]->condition['data']; ?></td>

</tr>

</table>

Esse bloco é muito parecido com o anterior, porém pegamos as informações da previsão do tempo para o dia atual, inserindo o dia da semana, uma imagem da condição do tempo, a temperatura e a condição do tempo. Dessa vez pegamos os dados do array na posição ‘atual’.

No último bloco temos:

<h3>Nos Próximos Dias</h3>

<table>

<?php foreach ($previsao['proximos'] as $item) { ?>

<tr>

<td><img src=”http://www.google.com<?php echo $item->icon['data']; ?>” alt=”clima” /></td>

<td><b><?php echo $item->day_of_week['data'];?></b> – <?php echo $item->condition['data']; ?><br /><?php echo $item->low['data']; ?>/<?php echo $item->high['data']; ?>° C</td>

</tr>

<?php } ?>

</table>

Nesse bloco, como vamos ter mais de um registro, será preciso percorrer todas as posições do array, então utilizamos o loop foreach para executar essa leitura. Para cada posição do array encontrada fazemos a impressão dos dados assim como foi feito no bloco anterior.

Atenção:

As imagens da condição do tempo devem ser inseridas usando a seguinte sintaxe:

Base: <img src=”http://www.google.com/endereco_retornado_na_requisicao” alt=”clima” />

Com o parâmetro: <img src=”http://www.google.com<?php echo $item->icon['data']; ?>” alt=”clima” />

Dessa forma o resultado será o demonstrado na imagem abaixo:

Exemplo do Resultado

Exemplo do Resultado

(continue reading…)

Bookmark e Compartilhe

{Livro do Dia} Criando Aplicações PHP com Zend e Dojo

Criando Aplicações PHP com Zend e Dojo

Criando Aplicações PHP com Zend e Dojo

O reuso de software traz vários benefícios, como: aumento de confiança no sistema, redução do risco de processo, uso eficiente por especialistas, conformidade com padrões e desenvolvimento acelerado. Mas como tornar possível o reuso?

Zend Framework proporciona o reuso de aplicações PHP com uma biblioteca de componentes fortemente testada, que combina simplicidade com produtividade e as últimas características do desenvolvimento Web. Zend Framework permite o desenvolvimento simultâneo de partes do sistema, com baixo acoplamento, por meio da aplicação de padrões de projeto como o MVC.

Este livro descreve passo a passo como criar uma aplicação Web completa em PHP com Zend Framework, focando o reuso de componentes. Além disso, traz uma introdução ao Dojo Toolkit, uma biblioteca de JavaScript que facilita o controle de eventos, a manipulação de Ajax e a geração de gráficos sem necessidade de plugins.

Informações sobre o Livro

Título: Criando Aplicações PHP com Zend e Dojo
Autor: Flávio Gomes da Silva Lisboa
ISBN: 978-85-7522-235-5
Páginas: 192
Ano: 2010
Editora: Novatec (@novateceditora)
Bookmark e Compartilhe

  • Copyright © 1996-2010 Jonathan Lamim } jlamim. All rights reserved.
    iDream theme by Templates Next | Powered by WordPress