| Fala povo!
Daremos hoje prosseguimento ao nosso estudo de PHP + mySQL + Flash. Veremos hoje como transformar nossos dados do banco em XML dinamicamente e recuperar as fotos de dentro do banco de dados para exibição na tela do usuário. Caso você ainda não tenha feito a primeira parte do tutorial, clique aqui e acompanhe nosso estudo!.
Primeiramente, vamos fazer um XML de exemplo antes de entrar no código, para que possamos entender como ficará nosso XML gerado pelo PHP. O que precisamos é uma lista de produtos que contenham as seguintes informações (os nomes dos campos da tabela estão entre parênteses):
- Código de identificação do produto (idproduto);
- Nome do produto (nome);
- Tipo (categoria) do produto (campo nome da tabela tipos);
- Valor do produto (valor);
- Descrição do produto (descricao).
Bom, agora que sabemos o que precisamos, vamos fazer um XML para esboçar o possível resultado final:
<?xml version=”1.0″ encoding=”UTF-8″?>
<produtos>
<item idproduto=”1″ nome=”Nome do produto 1″ tipo=”CD’s” valor=”27,50″>
<![CDATA[ descricao ]]>
</item>
<item idproduto=”2″ nome=”Nome do produto 2″ tipo=”DVD’s” valor=”37,30″>
<![CDATA[ descricao ]]>
</item>
<item idproduto=”3″ nome=”Nome do produto 3″ tipo=”Monitores” valor=”19,78″>
<![CDATA[ descricao ]]>
</item>
</produtos>
Como podemos ver, temos uma lista produtos que cada item corresponde a um produto.
A descrição do produto foi colocada em uma seção CDATA por poder conter CR ou LF (caracteres que fazem uma nova linha), aspas duplas, tags, etc. Como podemos notar no início de nossa declaração do XML, estamos utilizando a codificação UTF-8, a mesma utilizada pelo Flash por padrão, logo, não precisamos utilizar o System.useCodepage = true.
Agora, vamos para nosso PHP que gerará o nosso XML.
<?php
/* pega o arquivo de configuração */
require_once ‘config.php’;
/* inicia um XML para retorno */
$xml = ‘<?xml version=”1.0″ encoding=”UTF-8″?>’;
/* inicia a lista de produtos */
$xml .= ‘<produtos>’;
/* monta a SQL */
$sql = “SELECT p.idproduto,p.nome,p.valor,p.descricao,t.nome as tipo “;
$sql .= “FROM produtos p INNER JOIN tipos t on (t.idtipo=p.idtipo) “;
$sql .= “ORDER BY p.idproduto desc”; /* ultimo primeiro */
/* seleciona os produtos que são destaques */
$rs = mysql_query($sql);
/* para cada item encontrado, coloca dentro de um array associativo */
while($row = mysql_fetch_assoc($rs)) {
/* codifica os nomes, descrição, etc para UTF-8 */
$nome = utf8_encode($row['nome']);
$tipo = utf8_encode($row['tipo']);
$descricao = utf8_encode($row['descricao']);
/* formata o valor para ficar no formato de moeda */
$valor = number_format($row['valor'], 2, ‘,’, ‘.’);
/* acrescenta este item no XML */
$xml .= ‘<item idproduto=”‘.$row['idproduto'].’” nome=”‘.$nome.’” ‘;
$xml .= ‘tipo=”‘.$tipo.’” valor=”‘.$valor.’”>’;
/* acrescenta a descricao em uma seção CDATA */
$xml .= ‘<![CDATA['.$descricao.']]>’;
/* fecha o item */
$xml .= ‘</item>’;
}
/* fecha o XML */
$xml .= ‘</produtos>’;
/* fecha a conexão com o banco */
mysql_close($cn);
/* muda o header HTTP para XML */
header(“Content-Type: text/xml”);
/* escreve o XML */
echo $xml;
?>
Como podemos ver, em nossa consulta fazemos um INNER JOIN com a tabela de tipos, para que possamos pegar o nome do tipo de produto, ao invés de fazer uma nova consulta para saber o mesmo. Isto é possível por que na tabela de produtos existe um campo chamado idtipo, que é uma chave estrangeira referenciando a tabela de tipos, que também tem um campo chamado idtipo e é a sua chave primária.
Utilizamos também duas funções muuuuuuuuuuito úteis em nosso PHP para gerar o XML: utf8_encode e number_format.
A função utf8_encode, serve para codificar nossas strings que estão no formato Latin 1 para a codificação UTF-8, para que funcione no Flash sem problemas. Um dos motivos que resolvi utilizar XML ao invés de simplesmente escrever as variáveis no formato chave=valor&chave=valor, é a possível utilização dos símbolos & e +, que são reconhecidos com separador de variáveis e espaços em branco, respectivamente. Com XML, evitamos este tipo de problema.
A função number_format faz exatamente o que seu nome sugere: formata números. O primeiro argumento é o número a ser formatado; o segundo, o número de casas decimais desejadas; o terceiro, a string que fará a separação das casas decimais; e o quarto, a string que irá servir de separação de milhar. Logo, um número como 1789.3, ficaria como 1.789,30 em nossa aplicação.
Depois de terminada a construção do XML, mudamos o header para text/xml, para evitar problemas com outros navegadores.
Logo em seguida, escrevemos o XML.
Clique aqui para ver o exemplo
Agora, vamos criar o PHP que recupera a foto e exibe na tela.
Sua estrutura é bem simples, como mostrado abaixo:
<?php
/* pegamos o arquivo de configuração */
require_once ‘config.php’;
/*
efetua a consulta
a função sprintf serve para garantir que o cara vai enviar
um número como parâmetro. Se não for um número, ele força
a conversão para número inteiro. Se ele não informar nada,
é utilizado 0
Para ver a imagem, use http://www.seusite.com/fotos.php?idproduto={codigo_do_produto}
*/
$rs = mysql_query(sprintf(“select foto from produtos where idproduto=%d”,$_GET['idproduto']));
/* se encontrou o registro */
if($row = mysql_fetch_assoc($rs)) {
/* muda o header para imagem do tipo jpeg/jpg */
header(“Content-Type: image/jpeg”);
/* escreve o conteudo da foto */
echo $row['foto'];
/* do contrário se não encontrado */
} else {
// cria uma imagem de 155*20
$im = imagecreate(155, 20);
// fundo branco e texto vermelho
$bg = imagecolorallocate($im, 255, 255, 255);
$textcolor = imagecolorallocate($im, 255, 0, 0);
// escreve a string em cima na esquerda
imagestring($im, 3, 0, 0, “Imagem não encontrada!”, $textcolor);
// envia a imagem
header(“Content-Type: image/jpeg”);
imagejpeg($im,”,100);
}
?>
Simples, não?
Para ver um exemplo de como mostar as fotos, acesse este link.
Na próxima coluna, iremos jogar tudo isso para o Flash.
@braços e fiquem com o Amor de Deus!
Hugo Ferreira da Silva |
Os exemplos não estão mais funcionando
É, não está mais disponível.
Dá para ver o sistema funcionado de outro jeito?
Obrigado
Muito bom este material Hugo, ainda que o sistema não esteja funcionando me foi completamente útil como referencia para fazer o que eu precisava.
Escrevo-lhe para agradecer pelo post.
Abçs
Eu sou iniciante em php, então não sei aonde no código possa está errado, não sei se as aspas que vc colocou podem gerar algum erro, pois todas as páginas criadas aparecem em branco no navehador. No Banco de Dados na hora de popular a tabela ele encontrou erro nas aspas, tive que montar novamente, e não sei porque ele criou o campo CD e DVD duas vezes.
Infelizmente não vi nada funcionar e seu link também não funciona por estar fora do ar.
Espero que esse tópico reviva, pois é muito bom e pouco se encontra sobre esse assunto na internet.