Postagens

Mostrando postagens de 2012

MYSQL - Utilizando UNION e multiplas queries para agrupar resultados

Um comando muito pouco utilizado é o UNION mas ele é extremamente útil quando queremos efetuar selects de uma tabela ou várias e uni-las em um único resultado. Isto permite ao programa que receber os dados poder trata-los de uma unica vez ao invés de ter de efetuar vários selects separadamente e junta-los. Neste post vamos trabalhar com duas coisas interessantes que são o comando UNION e SELECTS de uma mesma tabela mas com diferentes critérios. Vamos utilizar como base a tabela 'teste' abaixo id nome idade estado 1 Pedro 50 SP 2 Antonio 30 RJ 3 Amélia 20 SP 4 Marta 15 RJ 5 Maria 80 SP O objetivo é selecionar a maior idade da tabela. Podemos fazer isto de maneira muito fácil pelo comando abaixo: SELECT MAX(idade) FROM teste idade 80 Ótimo, porém o problema é que apenas recuperamos o valor da idade máxima, sem as informações sobre quem possui esta idade, ou seja, não trouxemos a linha inteira. Para que possamos fa

PHP - LENDO ARQUIVOS CSV COM A FUNÇÃO fgetcsv

O PHP possui muitas funções pouco conhecidas mas que quebram um galhão na hora de fazer algo rapidamente e com poucas linhas. Ler e parsear um arquivo no formato CSV pode ser bem chato mas com a função fgetcsv se torna bem tranquilo. Podemos dizer que utilizar funções nativas ao invés de cria-la no próprio script é muito mais eficiente e rápido, tanto na questão da velocidade de se programar quanto na execução. Procure sempre utilizar as funções nativas. Vamos começar criando um script muito simples apenas para ilustrar como a função fgetcsv funciona e depois daremos uma solução completa para ler um arquivo e convertê-lo em array. Vamos trabalhar com um arquivo chamado "test.csv" com a seguinte estrutura: nome;idade Joao;25 carlos;50 O script básico é o que segue abaixo: <?php $handle = fopen("test.csv", "r"); $linha = fgetcsv($handle, 1000, ";"); var_dump($linha); O resultado será: array(2) { [0]=> string

Linux - Substituindo conteúdo de arquivos textos com sed

O Linux pode surpreende-lo de forma muito positiva inúmeras vezes. Uma das coisas mais bacanas que já utilizei e que sei que muita gente procura e não encontra com facilidade é a busca e substituoção de valores dentro de um arquivo texto. Uma grande parte das dicas que encontramos na Web são baseados em loops e etc, o que não é nada prático. A dica aqui é usar o comando "sed" junto com pipes. Vamos ao que interessa então: Busca o padrão DE e substitui por PARA dentro de "arquivo" e salva a modificação. sed -i 's/DE/PARA/g' arquivo Busca o padrão DE dentro de "arquivo" e substitui por PARA e joga para "novoarquivo" a modificação através de um pipe. sed 's/DE/PARA/g' arquivo | cat > novoarquivo

MySQL - Utilizando funções no MySQL - criando slug

Muitas vezes precisamos retirar de um campo de um banco de dados acentos de palavras, pontos e colocar traços no lugar dos espaços. Este formato é comumente chamado de "slug" e possui inúmeras utilidades como parametro de URL, chave de comparação, indice e etc. É comum também utilizar-se funções externas para gerar o slug mas hoje trago uma solução que pode ser implementada no próprio MySQL. A solução é uma função. Esta não é a mais elegante versão, pois usa a "força bruta" do REPLACE para cada caractere, mas funciona bem. delimiter // CREATE FUNCTION slug(Texto VARCHAR(150)) RETURNS VARCHAR(150) NOT DETERMINISTIC BEGIN DECLARE Resultado VARCHAR(150); SET Resultado = UPPER(Texto); SET Resultado = REPLACE(Resultado,' ','-'); SET Resultado = REPLACE(Resultado,'\'',''); SET Resultado = REPLACE(Resultado,'`',''); SET Resultado = REPLACE(Resultado,'.',''); SET

PHP - Classes genéricas com vários níveis - stdClass

O PHP tem uma ferramenta muito interessante chamada Standard Class ou "stdClass". Com ela pode-se criar um objeto sem precisar criar uma classe. O "stdClass" permite que sejam criadas apenas propriedades para seu objeto. Um exemplo de utilização seria para arquivos de configuração, onde necessitamos apenas de "chave"=>"valor" para ativar, desativar ou "printar" algo. Sua sintaxe é: <?php $config = new StdClass; ?> Podemos então começar a criar nosso objetos: <?php $config = new StdClass; $config->titulo = "Branca de Neve"; $config->subtitulo = "Sete anões"; ?> Também podemos criar Arrays: <?php $config = new StdClass; $config->titulo = "Branca de Neve"; $config->subtitulo = "Sete anões"; $config->elenco = Array( "principal" => "Branca de neve", "coadjuvante" => "Bruxa" ) ?>

Regexp - Encontrando o conteúdo até o primeiro ponto

Podemos dizer que REGEXP é uma arte, uma fina arte porque envolve muito, mas muito tempo de aprendizado e prática, além de ser bem "elegante" já que ao invés de usarmos milhares de comandos e "despedaçarmos" as strings para encontrar algo, o REGEXP nos permite fazer isto com apenas uma linha, e muitas vezes com meia duzia de caracteres. Uma dificuldade comum é capturar todo o conteúdo entre um certo padrão e outro quando queremos apenas que esta captura seja somente até a primeira ocorrência, e não todas até a ultima. Um exemplo utilizando uma palavra inicial até o primeiro ponto: /palavra.*\./ Este padrão irá encontrar "Nesta frase existe uma palavra que deverá ser encontrada. Mas ela não foi. " Ou seja, irá pesquisar até o ultimo ponto possível. Mas não queremos isto. Queremos que ele encontre até o primeiro ponto apenas. Para isto colocamos uma negação [^.] no REGEXP A expressão fica: /palavra.[^.]*\./ Este padrão irá encontrar &q

MySQL - Listando apenas os nomes de campos de uma tabela

Para listar apenas os nomes dos campos de uma tabela basta executar a query abaixo: SELECT column_name FROM information_schema.columns WHERE table_name = 'nome_de_sua_tabela' Fácil e rápido!

Linux - Transferência de arquivos utilizando sftp

Existe dois protocolos de transferência comumente usados no ssh, RCP (implementado pelo scp) e o SFTP. Hoje vamos falar um pouco de um programa muito útil do linux, o sftp. Para quem já utilizou o protocolo ftp (de transferência de dados) está ai uma opção muito interessante. Vamos utilizar como plataforma o console do linux e a transferência de exemplo será entre duas máquinas com sistema operacional Linux. Primeiramente temos que saber em qual máquina a conexão será estabelecida. Isto se traduz em saber o endereço, login e senha da máquina. Tendo estas infos em mãos, podemos digitar na shell $ sftp login@endereco ou como um melhor exemplo: $ sftp usuario1@200.200.00.0001 o endereço, neste caso, é o ip da máquina que se quer conectar Após inserir a senha solicitada você estará conectado. A partir deste momento temos de ter em mente que estamos em um "ambiente duplo", ou seja, o sftp nos deixa com a possibilidade de operar comandos tanto no computador local

Linux - Utilizando atalhos de sequência de comandos com alias

Uma técnica muito interessante para quem quer automatizar alguns comandos no linux é utilizar o "alias", algo como um apelido para uma sequência de comandos. A vantagem do "alias" é que você não precisa utilizar de shell script para fazer seus atalhos ou sequência de comandos. $ alias Lista todos os alias atuais no sistema $ alias nome="sequencia de comandos" cria um novo alias Um exemplo de alias útil é listar a quantidade de arquivos no diretório atual. O comando para fazer isto seria: $ ls | wc -l Porém podemos criar um atalho, por exemplo: $alias qtd="ls | wc -l" Pronto! Toda vez que digitarmos: $ qtd o Shell retornará a quantidade de arquivos (inclusive pastas) presentes no diretório atual. Porém quando vc fizer log out estes aliases sumirão. Para mante-los você deve editar o arquivo .bash_profile ou .bashrc com os mesmos para que sejam preservados. Este arquivo pode ser encontrado em /home/usuario.  Use sua cr

Linux - Compactando e Descompactando com .zip

Quando trabalhamos, seja com Linux, seja com outro sistema operacional, uma das operações mais importantes na manipulação de arquivos é a compactação. Existem vários padrões (.gzip,.bzip2, etc) porém neste post vamos falar do padrão zip e como utiliza-lo na linha de comando Linux/Unix (Shell). São inúmeras as opções de compactação e descompactação porém vamos listar aqui as mais comuns e algumas que não são tão comuns mas não por isto menos úteis. Compactação normal de arquivos: $ zip   nome_do_novo_arquivo.zip   arquivo_1   arquivo_2   arquivo_n Compactação recursiva $ zip   -r   nome_do_novo_arquivo.zip   c aminho_do_diretorio Compacta todos os arquivos do diretório em que se está $ zip   -r   nome_do_novo_arquivo.zip   * Compacta os arquivos de um diretório mas sem a sua árvore de diretórios $ zip   -rj   nome_do_novo_arquivo.zip   caminho_do_diretorio Lista o conteúdo do arquivo zip $ unzip   -l   nome_do_arquivo.zip Será exibido algo como abaixo: Archive:

MySQL - TRUNCATE em tabelas com CONSTRAINT de chave estrangeira

Na fase de desenvolvimento e testes é muito comum alterar as propriedades de suas tabelas e preenche-las com informações.  Porém chega um momento que queremos resetar tudo para colocar nosso banco em produção e para isso é sempre bom dar um TRUNCATE nas tabelas, a fim de zera-las, tanto na questão dos dados quanto dos incrementadores (AUTO_INCREMENT).  Dependendo de como seu banco foi modelado podemos ver frustradas estas tentativas. No caso de tabelas com CONSTRAINTS nas chaves estrangeiras simplesmente o MySQL não vai obedecer ao seu comando TRUNCATE. Então o que fazer? Uma solução simples é setar a checagem das CONSTRAINTS para false, truncar a tabela e depois voltar a checagem.  O procedimento para isto é bem simeples: Execute uma query com o comando: "mysql> SET FOREIGN_KEY_CHECKS = 0;"  Execute TRUNCATE em suas tabelas  Execute uma query com o comando: "mysql> SET FOREIGN_KEY_CHECKS = 1;" Desta forma você consegue zerar suas tabelas e m

MySQL - Usando HAVING para limitar queries com agrupamentos GROUP

Agrupamentos são incrivelmente uteis quando precisamos fazer somas ou contar itens de várias linhas de um DB. Apesar de muitas pessoas utilizarem a linguagem em que estão desenvolvendo sua aplicação para fazer este tipo de operação as queries dos bancos de dados são a forma mais eficiente de se fazer isto. Vamos supor que você tenha uma tabela como a que segue abaixo: Nome CPF Veiculo Antonio 240.400.462-00 Corsa Antonio 240.400.462-00 Vectra Pedro 798.455.105-74 Gol E necessitamos do total de veículos de cada CPF. Então teríamos um SELECT deste tipo: SELECT Nome,CPF,COUNT(CPF) AS Quantidade FROM veiculos GROUP BY CPF. E nosso resultado seria algo como Nome CPF Quantidade Antonio 240.400.462-00 2 Pedro 798.455.105-74 1 Mas e se nos interessasse  resultados que trouxessem apenas cpf's com mais de dois carros? É para isto que usamos HAVING. HAVIING é como um WHERE porém utilizado para limitar buscas em agrupamentos. No exemplo acima faria

Desafio SQL

Você consegue desenvolver um SELECT (MySQL) que converta a string de um campo VARCHAR no seguinte padrão: "UM TEXTO" para "Um Texto" "um texto" para "Um Texto" ou seja, transformar a primeira letra de uma  palavra em Maiúscula? Publicaremos aqui a melhor solução enviada.