Feeds:
Posts
Comentários

Esses dias pra trás, em umas das telas do sistema que estou trabalhando precisei forçar a ordenação no MySQL, numa query do tipo SELECT, até então nunca pensado em tal possibilidade e fui pesquisar sobre.

Não achei nenhuma solução em português e contei com a ajuda de um amigo para pesquisar pelo termo correto no Google: MAINTain order “in” mysql.

Bom, vamos à explicação e código.

Caso nenhum dos campos da tabela atenda a sua necessidade de ordenação ou você necessitar dos seus dados ordenados de uma maneira muito particular, trazer na mesma ordem que uma session de carrinho de compras por exemplo, use a seguinte lógica:

SELECT * FROM tbl_name WHERE column_a IN (val1,val2,val3)
ORDER BY FIELD(column_a, val1, val2, val3);

Na prática, vamos imaginar que eu tenho uma tabela ‘produtos’, com a seguinte estrutura:

Produtos
----------------------------
id_produto		int(10)
produto			varchar(80)
descricao		text

Bom, o usuário entrou no meu site, e foi clicando nos produtos, na seguinte ordem: 15,2,36,41,10. Essa ordem não segue nenhuma lógica.
E eu quero, quando ele clique no carrinho de compras, eu faça uma única SELECT, usando o IN para trazer a lista de produtos, mas quero eles nessa ordem, que o meu usuário escolheu.
Como fazer isso? Simples:

/**
 * Minha session
 * $_SESSION['produtos'] = array(15,2,36,41,10);
 */
if(is_array($_SESSION['produtos'])) {
  $produtos = implode(',',$_SESSION['produtos']);
  $query = mysql_query('SELECT * FROM produtos WHERE id_produto IN ('.$produtos.') ORDER BY FIELD(id_produto,'.$produtos.')');
  while($row=mysql_fetch_assoc($query))
  {
    echo $row['id_produto'].' - '.$row['produto'].'<br />';
  }
  mysql_free_result($query);
}

Bom, agora é testar e brincar com a lógica.

PS: se você não sabe para que serve o comando implode, pesquise no manual do PHP. (:P)

Abraços!

Tá certo, muito tempo sem escrever. Mesmo assim, vira e meche eu recebo um comentário agradecendo determinado artigo.

Então, vou tentar organizar alguns assuntos que julgo interessante, e escrever sobre. É uma tarefa complicada, já que grande parte das coisas básicas já foram distrinchadas por excelentes artigos espalhados pela NET.

Sugestões são sempre bem-vindas.

Abraço!

Vida de programador é ingrata, não adianta fugir, se quiser crescer tem que estudar, todos os dias. Se tem uma coisa que eu nunca gostei de fazer é estudar coisas que não me interessam, desde a minha quinta série já tive muitas brigas com professores por simplesmente ignorar suas matérias.

Nosso cérebro é um mecanismo filho da puta de complexo, então não venha explicar para o meu o que ele deve armazenar, ele sabe filtrar isso muito bem. Programador nenhum sabe tudo (salvo nerds retartados que não conseguem completar uma frase inteira olhando nos olhos de alguém), então tenha sempre uma ótima referência em mãos.  Empresas não contratam mais aquele tipo que se mata decorando milhões de coisas, contrata assim aquele que sabe se virar, fazer uma pesquisa no Google ou Wikipedia da vida quando precisa, resolve o problema e guarda a solução, pois sabe que um dia pode precisar dela novamente.

Estou escrevendo isso porque às vezes pego códigos muito mal feitos, e dá raiva de ver o quanto algumas pessoas tem má vontade. Poxa, se vai fazer, faça bem feito, estude, procure aprender com pessoas que tiveram experiências positivas. Tem que saber usar a linguagem, seus recursos, e mais do que isso, saber identar bem um código, escrever um comentário instrutivo e fazer código limpo.

Se escolheu essa vida ingrata, acostume-se com isso, estude, todos os dias, o necessário, para resolver os problemas, melhorar seu código e evitar dores de cabeça futura, pra você, ou para um eventual terceiro que precise dar manutenção naquilo que você fez.  Seria pura ignorância não fazer isso, pois você também vai ter que dar manutenção no código de terceiros um dia, e acredito, não vai ser divertido.

Analise o problema,  melhore o  algoritmo, organize, faça identação e seja feliz!

A brincadeira de hoje é simples e interessante. Precisei dessa solução para um grande portal de vendas de imagens.

A idéia é: o usuário vê um thumb (miniatura) com a marca d’água da empresa, e por uma questão de organização a sua estrutura de diretórios não pode ser exposta.

Por exemplo, a imagem 4512.jpg, quando enviada para o site terá duas versões, a 4512_wm.jpg (marca d’água), e a original 4512_hg.jpg (imagem original, alta qualidade).
Se o usuário clica com o botão direito e pede pra ver as propriedades da imagem, ele consegue o endereço completo da mesma, e pode matar toda sua segurança, acessando diretamente uma imagem que ele não teria permissão para visualizar / baixar.

Por isso, nós escondemos a URL real da imagem, usando um pequeno truque no PHP:

1º – PASSO
Vamos, a nível de exemplo, imaginar que eu tenha minhas imagens soltas, sem nenhum registro em banco de dados.

2º – PASSO
A minha estrutura de diretórios padrão é /fotos/
Eu tenho 1(um) diretório para cada novo evento, e controlo isso pelo ID do banco de dados.
EX: FOTOS DO CARNAVAL – id: 30

3º – PASSO
Vou criar meu arquivo foto.php, e pra ele eu vou passar os seguintes parâmetros, id_evento, nomedoarquivo_jpg da seguinte maneira:

foto.php?30,4512

foto.php

<?php
/**
 * necessários para evitar cache
*/
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: private');
header('Content-Encoding: FOTO');

/**
 * quebra a QUERY_STRING
 * para quem não sabe, é todo valor escrito após o ? na URL
 * nesse caso: id_evento, nomedoarquivo_jpg
 * exemplo: 30,4512
 */
$vars = explode(',',$_SERVER&#91;‘QUERY_STRING’&#93;);

/**
 * caso qualquer um dos dois valores esteja vazio ou o arquivo não exista, você pode configurar uma imagem padrão de erro, e mandar exibi-lá.
 */
if(empty($vars&#91;0&#93;)||empty($vars&#91;1&#93;)) {
	$arq = 'fotos/erro1.jpg';
} else if(file_exists('fotos/’.$vars&#91;0&#93;.'/'.$vars&#91;1&#93;.'_hg.jpg')) {
	$arq = 'fotos/'.$vars&#91;0&#93;.'/'.$vars&#91;1&#93;.'_hg.jpg';
}

/**
 * determina o tipo de imagem, e exibe
 * nesse caso, estamos usando jpg como padrão, poderia ser específico
 */
header('Content-Type: image/jpg');
header('Content-Length: '.filesize($arq));
readfile($arq);
?>

4º – PASSO
Na chamada da imagem no site ficaria assim:

<img src="foto.php?30,4512" alt="foto" border="0" />

Bom, é claro que muitas coisas podem ser desenhadas sobre esse simples código.
Abraço e divirtam-se!

each

(PHP 4, PHP 5)

each — Retorna o par chave/valor corrente de um array e avança o seu cursor

Descrição

array each ( array $array )
Retorna o par chave/valor corrente de array e avança o seu cursor. Esse par é retornado num array de quatro elementos, com as chaves 0, 1, key, e value. Os elementos 0 e key contêm o nome da chave do elemento do array, e 1 e value contêm o valor.

Essa função (fiquei sabendo através do Paulo, “o cara”!) é do PHP 3, e acabou caindo em desuso. É uma função extramente prática, que pode facilitar a vida de quem precisa ler um ‘array’, com suas chaves e valores, ou apenas um dos dois.

<?php
$fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');
reset($fruit);

echo '<ul>'."\n";
while (list($chave,$valor)=each($fruit)) {
      echo '<li>'.$chave.' - '.$valor.'</li>'."\n";
}
echo '</ul>'."\n";

/**
 * Saída:
 * a => apple
 * b => banana
 * c => cranberry
 */

/**
 * Depois da execução de each(), o cursor interno do array vai apontar para o próximo elemento do array, ou após o último elemento se ele chegar ao final do array.
 * Você deve usar reset() se quiser percorrer o array novamente.
 */
reset($fruit);

/**
 * Temos as variações
 */
echo '<ul>'."\n";
while (list(,$valor)=each($fruit)) {
      echo '<li>'.$chave.' - '.$valor.'</li>'."\n";
}
echo '</ul>'."\n";

/**
 * Nesse caso, você pode perceber que o local onde deveria ser definido a variável que vai receber o valor da chave da está vazio, colocando apenas ",$valor". Já vi muito programador olhar isso com cara estranha e perguntar se estava realmente certo 😛
 */
?>

Bom, é isso…copiei boa parte das informações do manual do PHP, aliás, boa parte do meu conhecimento se deve à ele.

Então, se for faz aquele famoso ‘count’, e depois usar um ‘for’ pra ler um array, pode se utilizar dessa técnica para ler os mesmos, é interessante, rápido e prático.

Mais uma vez espero ajudar, grande abraço!

Bom, mais uma vez venho falar de funções implementadas na versão 5 do PHP, e que vieram pra facilitar muito a nossa vida.

Uma coisa que dava um puta trabalho pra fazer até pouco tempo era ler um arquivo XML.

No PHP5 foi implementada a classe domDocument, que é uma API (ou extensão) para se trabalhar tanto com leitura quando escrita de documentos XML (para maiores informações: http://br.php.net/dom).

Bem, vamos lá, esse script simples mostra como ler o conteúdo de um documento XML.

Primeiramente, vamos carregar um documento XML válido, vou usar como exemplo o RSS do Charges.com.br, dos E-mails comentados 😛

Vamos ao código:

<?php
/**
 * Faz a leitura do arquivo, pode ser local, ou um arquivo externo com permissão para esse tipo de imporção.
 * Joga o conteúdo do arquivo numa 'string'.
 */
$filename = 'http://charges.p.rss.uol.com.br/charges_comentarios.xml';
$xmlstr = file_get_contents($filename);
/**
 * Instância a classe, e carrega o XML que está na 'string'.
 */
$dom = new domDocument();
$dom->loadXML($xmlstr);
$xml = simplexml_import_dom($dom);
/**
 * A função 'simplexml_import_dom' carrega todo o conteúdo do XML, montando uma estrutura semelhante à de um objeto, e você pode acessar as tags do XML como se fossem atributos do objeto, como no exemplo:
 * echo utf8_decode($xml->channel->title);
 * (usando o 'utf8_decode' você previne problemas na acentuação)
 * Exibe "Charges.com.br E-mails Comentados"
 */

/**
 * Mostra toda a estrutura do documento.
 */
echo '<pre>'."\n";
print_r($xml);
echo '</pre>'."\n";;

/**
 * Para listar todos os itens de destaque do documento, você poderia fazer da seguinte maneira:
 */
$c = count($xml->channel->item);
echo '<ul>'."\n";
for($i=0;$i<$c;$i++)
{
	echo '<li>'.utf8_decode($xml->channel->item[$i]->title).'</li>'."\n";
}
echo '</ul>'."\n";

/**
 * Claro que cada documento XML tem a sua estrutura, e cabe a você programador, estudar a mesma e chamar os referentes objetos.
 */
?>

Bom, é isso, espero mais uma vez ter ajudado.

Qualquer dúvida, estou à disposição.

Grande abraço!

MySQL recorset!

Essa função que vou mostrar é uma maneira muito prática de ler o recordset retornado pela consulta SQL.

Vamos supor que tenho uma tabela MySQL com a seguinte estrutura:

Produtos
----------------------------
id_produto		int(10)
produto			varchar(80)
descricao		text

Bom, o resultado final é muito simples e básico, o que quero se atentem é na maneira como eu vou mostrar esses dados, a função facilita muito a vida e pode lhe ser muito útil para precisa de detalhamento nos dados, ou seja, eu quero ver o ‘produto’ do índice 5 por exemplo, bastaria exibir a variável $recordSet[5][‘produto’];

Vamos ao código:

<?php
function trataRecordSet($recordSet)
{
	$numField = mysql_num_fields($recordSet);
	$j=0;
	while($linha = mysql_fetch_assoc($recordSet))
	{
		for($i=0;$i<$numField;$i++)
		{
			$dbField = mysql_fetch_field($recordSet,$i);
			$rows&#91;$j&#93;&#91;$dbField->name] = $linha[$i];
		}
		$j++;
	}
	return ($rows);
}
?>

Bom, agora um exemplo de uso da função:

<?php
/**
* CONECTA NO BANCO DE DADOS
*/
mysql_connect('localhost','root','senha');
mysql_select_db('lojavirtual');
/**
 * EXECUTA CONSULTA SQL
 */
$recordSet = mysql_query('SELECT * FROM produtos ORDER BY produto');
$row = trataRecordSet($recordSet);
mysql_free_result($recordSet);
/**
 * LISTA DE TODOS OS PRODUTOS
 */
$numRows = count($row);
echo '<ul>'."\n";
for($i=0;$i<$numRows;$i++)
{
	echo '<a href="verdetalhes.php?idProduto='.$row&#91;$i&#93;&#91;'id_produto'&#93;.'">'.$row[$i]['produto'].'</a>'."\n";
}
echo '</ul>'."\n";
/**
 * LISTA APENAS O PRODUTO DE ÍNDICE 2
 * (lembrando que o índice inicia em 0)
 */
echo 'O terceiro produto da minha lista é: '."\n";
echo '<h1>'.$row[2]['produto'].'</h1>'."\n";
?>

Entenderam? Espero que sim…
Ou seja, a facilidade está em poder acessar o valor do campo diretamente pelo índice.
Eu utilizo esse método sempre, já que a função está implementada na minha classe de MySQL, espero que gostem, ou que pelo menos conheçam mais essa maneira.Estou começando nesse história de blog, então, caso tenha alguém lendo, usando ou qualquer coisa do tipo, e quiser mandar e-mail pedindo pra escrever sobre determinado assunto, ou queira enviar uma dúvida, por favor.

Agradeço e grande abraço.

Pra começar, vou republicar um artigo (aliás, meu único até o momento) que escrevi no final do ano passado com dicas para se trabalhar com datas no PHP5.

O original está publicado em: http://www.php5.com.br/?php=_artigos/mostra&id_cat=103

Vamos lá:

  • Quantidade de dias no mês
$timestamp = mktime(0,0,1,$mes,1,$ano);
$dias_no_mes = date('t',$timestamp);
  • Retorna o dia da semana em um valor númerico, começando com 0=domingo
$dia_semana = date('w',mktime(0,0,0,$mes,$dia,$ano));
  • No PHP5 existe uma função muito interessante, que seta o fuso horário do servidor, que pode ser muito útil para quem utiliza servidores americanos por exemplo, como o GoDaddy.com. Para setar o fuso do Brasil, basta colocar este comando antes de chamar qualquer função de data/hora:
date_default_timezone_set('Brazil/East');
  • Outra coisa interessante no PHP é a possibilidade de calcular data passando apenas uma string de texto para a função, por exemplo, se você quer saber qual o dia do mês que caiu o segundo domingo de agosto de 2006, basta dar o seguinte comando:
echo date('d/m/Y',strtotime("Second Sunday August 2006"));
  • E por último, o que julgo mais interessante, como mostrar a data em português sem precisar usar aquelas “array” com os dados traduzidos. Existe no PHP um comando chamado setlocale, que possui pré-configurações de alguns dados nas línguas que ele dá suporte, uma dessas línguas é o português. Então, veja como é simples mostrar o dia da semana e data de hoje em português:
setlocale(LC_TIME,'pt_BR','ptb');
echo strftime('%A, %d de %B de %Y',mktime(0,0,0,date('n'),date('d'),date('Y')));

Para mais informações consulte o manual do PHP5 as funções citadas.

Bom, é isso…à partir de agora, só novidades!

Hello World!

Meu nome é Douglas Miguel, tenho 20 anos.

Trabalho na área desde os 14 anos…e desde o início percebi que era isso que queria fazer pelo resto da vida, então investi todas as minhas fichas.
E claro, morando no interior (Uberaba/MG), não dispondo daquelaaaa condição financeira, fica difícil fazer bons cursos, então o jeito foi recorrer à internet (de vez em quando dava sorte e conhecia bons profissionais pessoalmente, e claro, tentava aprender o máximo com eles também).
Hoje, depois desses anos todos estudando e ralando, muitas vezes virando madrugadas, vejo que valeu a pena.

Moro atualmente em São Paulo/SP, e trabalho na Fundação Cásper Líbero como Programador de Sistemas, basicamente desenvolvendo sites e sistemas em plataforma WEB, usando tecnologias como xHTML, CSS (Tableless!), JavaScript, PHP5 e MySQL, e claro, AJAX para misturar tudo e fazer aquela salada. (:P)

Portanto, esse é o motivo desse blog, eu sempre aprendi com pessoas que tiveram essa boa vontade de gastar seu tempo escrevendo para ajudar outras pessoas, e agora quero de alguma forma fazer o mesmo, quem sabe não tem aí do outro lado um cara como eu…apaixonado, sempre esperando por um pouquinho mais de conhecimento.

Durante anos eu tive vontade de fazê-lo, mas sempre deixava de lado por algum motivo, e quem me inspirou e animou foi meu amigo Daniel Ribeiro, que criou o /* Code-Import */.

Bom, depois conto essa história com mais detalhes, e outras também, quando for dando na telha.

Mais uma coisa importante, pretendo escrever aqui com frequência…mas não espere muitoooooo, pois o tempo é curto.