Postagens

Mostrando postagens com o rótulo Database

PHP - Criando uma Array de objetos igual ao retorno de uma consulta PDO

Você pode criar uma array de objetos como aquela retornada através do PHP PDO quando realiza uma consulta a um banco de dados. A sintaxe não tem segredos. É como 'tipar' uma variável com (String), (Int), (Float) etc. $object_array = Array( (object) Array( 'codMunicipio' => '09210', 'uf' => 'MA' ), (object) Array( 'codMunicipio' => '12190', 'uf' => 'PI' ), (object) Array( 'codMunicipio' => '71072', 'uf' => 'SP' ) ); Se você printar a array com 'var_dump()' obterá a seguinte...

PHP - Conectando bancos de dados através do PDO (PHP Data Object)

Imagem
Com o advento do php 7 precisamos rever alguns procedimentos que acabaram ficando conosco desde os primórdios do PHP. Um destes pontos a serem revistos é o trabalho com bancos de dados. Uma grande parte dos desenvolvedores PHP ainda trabalha com mysql_query, seja pelo costume, preguiça ou mesmo ambiente legado. Precisamos evoluir deste ponto e começar a trabalhar com bibliotecas mais modernas e flexiveis. Está na hora de começarmos a trabalhar com PDO ou PHP Data Object. PDO é uma classe nativa para conexão com banco de dados e que, além de trazer recursos excelentes, também pode ser mais rápida se adequadamente utilizada, além de adicionar uma camada de abstração que faz o trabalho de mudar de base de dados muito tranquila. PDO suporta inúmeros bancos como MySQL, SQLite, Postgree, Oracle e outros. Vamos dar algumas dicas simples e rápidas para começar a usar o PDO. CONEXÃO Abaixo segue um exemplo de conexão, juntamente com o tratamento de erro adequado para o caso da cone...

Livro 'PHP Master' é uma boa dica para quem quer se aprimorar na linguagem.

Imagem
Os livros de programação e TI não são literatura e por isso geralmente são bem difíceis de ler de cabo a rabo. É comum lermos um ou outro capítulo que nos interessa mais e de vez em quando consultá-lo para tirar alguma dúvida. Além disso hoje é mais fácil consultar o Google e encontrar um código ou exemplo pré-pronto e adapta-lo, muitas vezes na tentativa e erro, do que ler um livro sobre o assunto. Porém de vez em quando é interessante ler um livro não apenas para resolver questões técnicas específicas ou um problema pontual mas para adquirir fundamento teórico sobre o que estamos trabalhando, algo que não necessariamente um tutorial será o suficiente. Assim ler um livro técnico sobre determinado assunto acaba sendo uma opção inteligente, especialmente se é uma tecnologia ou assunto muito novo. 'PHP Master' da Sitepoint é um tipo de livro destes que você deve ler do começo ao fim. Ele é dedicado a programadores PHP intermediários ou que sabem algo sobre orientação a...

MySQL - Cálculo de período de tempo entre duas datas com TIMESTAMPDIFF

Imagem
Muitas vezes precisamos saber quantos dias se passaram desde que um dado registro entrou no banco de dados ou outros cálculos com datas e horas que precisemos agrupar em dias, meses, horas e etc. Este tipo de informação geralmente é útil nos processos de limpeza e backup de dados mas também em outras situações como a exibição de dados para um usuário. Geralmente este procedimento é delegado ao software que lê o banco de dados e realiza as operações necessárias, seja para backup, limpeza ou exibição de dados. Porém o MySQL possui uma função interessante para efetuar este tipo de procedimento diretamente na query do banco de dados, o que é mais natural já que se trata de um dado. A função TIMESTAMPDIFF() do MySQL calcula o tempo decorrido entre duas datas que pode ser em dias, meses, minutos e etc. A lista completa segue abaixo: FRAC_SECOND (microsegundos), SECOND (segundos), MINUTE (minuto), HOUR (hora), DAY (dia), WEEK (semana), MONTH (mês), QUARTER (trimestre),...

MySQL - Dump de banco de dados sem a estrutura de tabelas

É com certeza uma das práticas mais comuns entre os profissionais que trabalham com banco de dados o backup ou restore de dados. Para isso é muito comum o uso do mysqldump . Em sua configuração padrão o mysqldump , além de copiar os dados da banco também copia toda a estrutura de tabelas e índices. $ mysqldump -uusername -psenha database > /diretorio/backup.sql Porém existem algumas situaçães em que o Dump de uma tabela ou banco não serve apenas para backup. Uma delas, por exemplo, é quando precisamos recriar algum índice novo para a tabela, a fim de melhorar o desempenho. Quem já trabalhou com índices saberá de antemão que lidar com eles em tabelas com milhões de registros, atualizando, trocando, deletando ou criando é um verdadeiro inferno, já que muitas vezes o processo leva horas, quando não dias. Eu mesmo, certa vez, tive que deletar um indice de uma tabela com alguns milhões de registros e me arrependi brutalmente pois levaram 'apenas' 8 horas para o process...

MySQL - Gerando arquivos .csv com cabeçalho e acentuação diretamente de uma query no banco de dados

Já tratamos anteriormente de como gerar um arquivo a partir de uma consulta no MySQL porém não falamos especificamente de arquivos .CSV (aqueles separados por ponto e vírgula e que são reconhecidos diretamente pelos editores de planilha) Além disso não tratamos também de como inserir um cabeçalho com os nomes dos campos e nem como esta saída ser gerada diretamente com acentuação, importante para nós que trabalhamos com o português. Vamos começar com nosso exemplo padrão Para DOS SELECT * INTO OUTFILE 'C:/diretorio/arquivo.txt' FROM tabela Para Linux SELECT * INTO OUTFILE '/diretorio/arquivo.txt' FROM tabela As queries acima geram arquivos com acentuação no padrão UTF8, fora do padrão .csv e sem cabeçalho. Vamos transformar as queries acima para que a saída esteja no padrão .csv SELECT * FROM tabela INTO OUTFILE 'C:/diretorio/arquivo.csv' FIELDS ENCLOSED BY '"' TERMINATED BY ';' ESCAPED BY '"' LIN...

MySQL - Fazendo Insert com Subquery

Imagem
Muitas pessoas utilizam scripts PHP para ler dados de uma tabela do DB e jogar em outra porém isso pode ser feito diretamente através do MySQL de maneira muito fácil e muito mais rapidamente. Vamos a um exemplo em que lemos os nomes femininos de uma tabela 'nome' e os referenciamos em uma tabela chamada 'empresarias'. Tabela 'nome' id | nome | genero 1 Pedro m 2 Souza m 3 Santiago m 4 Ana f 5 Rosa f 6 Tom m 7 Tobias m 8 Otavio m 9 Hugo m Tabela 'empresarias' com o campo 'id' AUTO INCREMENT id | id_nome Se fizermos um Select simples da tabela 'nome': SELECT * FROM nome WHERE genero = 'f' Teremos como resultado id | nome | genero 4 Ana f 5 Rosa f Ok, são estes dados que queremos referenciar na tabela 'empresarias'. Como proceder agora? Podemos inserir diretamente os dados de uma tabela em outra u...

MySQL - Filtrando CEP com a ajuda do REGEXP

Vamos a uma dica rápida de REGEXP, utilizando como base a seleção de linhas em uma tabela que possuem CEP preenchido. Nossa tabela possui a seguinte estrutura: ID Endereço CEP 1 Rua peruibe 459 05698426 2 Rua martim 67 - 3 Av Rebouças 1000 08968547 Para selecionar apenas as linhas que possuem CEP utilizamos a seguinte Query: SELECT ID,ENDERECO,CEP FROM tabela WHERE CEP REGEXP '^0[0-9]{7}$'  O que nossa REGEXP faz? ^0  : faz com que o MySQL olhe a partir do primeiro caractere e pegue apenas os valores com zero; [0-9]{7}  : após o primeiro caractere, que deve ser zero, pega os campos cujos próximos 7 valores sejam numéricos $  : finaliza o REGEXP, ignorando tudo mais que venha depois dos oito caracteres numéricos indicados anteriormente. O resultado da Query seria: ID Endereço CEP 1 Rua peruibe 459 05698426 3 Av Rebouças 1000 08968547 Abraço!

SQL JOINS - Um infográfico muito bacana que ajuda a entender melhor os JOINS

Imagem
JOINS de SQL geralmente são chatinhos de visualizar mas, apesar disso, são extremamente úteis, principalmente em bancos de dados cuja estrutura está normalizada. Para melhorar este cenário e facilitar a compreensão segue abaixo um infográfico que explica de maneira visual o que cada tipo de JOIN faz. Obs: infelizmente no MySQL não existe FULL OUTER JOINs. Para fazer isso são necessários alguns truques utilizando UNION de duas ou mais seleções utilizando LEFT e RIGHT JOINs.

PHP - Pulando linhas do resultado de uma Query com mysql_data_seek()

mysql_data_seek() move o ponteiro interno do resultado de uma Query MySQL para o número da linha especificada. A próxima chamada de uma função, por exemplo mysql_fetch_assoc (), irá retornar esta linha. mysql_data_seek()  é muito útil quando se quer trabalhar com paginações, por exemplo. Vamos a um exemplo simples, sem o uso do  mysql_data_seek() , onde uma tabela simples com ID e nome é consultada. <?php include "db.php"; $result = mysql_query("SELECT * FROM ident"); while ($row = mysql_fetch_array($result))  { echo "ID: {$row['id']}, Nome: {$row['nome']} <br/>"; } O Resultado é: ID: 1, Nome: Daniel ID: 2, Nome: Salete ID: 3, Nome: Veronica ID: 4, Nome: Mona ID: 5, Nome: Zilda ID: 6, Nome: Ofelia ID: 7, Nome: Patricia Agora vamos utilizar  mysql_data_seek() . Vamos pular o resultado da consulta da linha 0 para a linha 5 e repetir o loop: <?php include "db.php"; $result =...

Calculando distâncias com Geolocalização pelo MySQL

Imagem
Geolocalização está no topo das tecnologias atuais pois junto com os dispositivos móveis vieram também inúmeras oportunidades de aplicativos que utilizam a localização do usuário para uma infinidade de coisas, de dizer se um amigo está por perto a indicar restaurantes ou serviços próximos a onde o usuário está. Sendo assim é imprescindível aprendermos a trabalhar com geolocalização. A Geolocalização é fundamentalmente um serviço fornecido pelo "Front End" ou falando de modo mais geral do lado cliente, pois é o browser ou o aparelho móvel quem disponibiliza esta informação. Apesar disto existem  coisas relacionadas com Geolocalização que sim podem (e devem) ser feitas do lado servidor (Server Side). Se você está criando alguma aplicação relacionada a encontrar locais próximos, por exemplo, caso não esteja usando um web service de terceiros, no mínimo um banco de dados com as coordenadas geográficas de vários locais você provavelmente deverá possuir. Vamos supor que...

MySQL - Apagando functions, procedures e triggers com DROP

A dica de hoje é rápida e prática. Como apagar uma Função, uma Procedure ou Trigger no MySQL? Basta dar um DROP nelas. DROP FUNCTION minhafuncao DROP PROCEDURE minhaprocedure DROP TRIGGER minhatrigger

MySQL - Fazendo Update com Subquery

Updates às vezes são bem chatos, principalmente quando devemos atualizar uma determinada tabela baseado em outra. Mas nem tudo está perdido! Podemos utilizar as sempre úteis Subqueries ou Subselects para fazer este tipo de atualização. Vamos definir as nossas tabelas base: Tabela 'site' id nome url tipo acessos 1 Wikipedia Home http://www.wikipedia.org/ home 0 2 Wikipedia NASA http://en.wikipedia.org/wiki/NASA article 0 3 Wikipedia Planetas http://pt.wikipedia.org/wiki/Planeta article 0 Tabela 'tag' id id_site nome 1 2 Agência 2 2 Estados Unidos 3 2 Pesquisa 4 3 Espaço 5 1 Wiki 6 3 Espaço 7 1 Wiki 8 2 Espaço Vamos atualizar na tabela 'site' os campos 'acessos' baseado na tabela 'tag' Primeiro vamos selecionar todas as tags cujo 'nome' seja igual a 'Espaço' SELECT       id_site  FROM       ...

MySQL - Função LOAD INFILE não funciona? Uma dica rápida

Dependendo das configurações de instalação do MySQL podemos ter problemas na hora de carregar arquivos com dados (.csv por exemplo) para dentro de uma tabela. Exemplo: LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table; Caso ocorram erros ao efetuar este tipo de operação, abra o terminal do DOS ou Linux e tente acessar o banco de dados através do comando abaixo: DOS: c:\caminho_para_o_mysql\mysql -uusuario -psenha --local-infile Linux: $ mysql -uusuario -psenha --local-infile onde 'usuario' é o seu usuário e 'senha' sua senha. Após acessar o banco por meio desta operação tente efetuar novamente o procedimento de LOAD INFILE.

MySQL - Trabalhando com IFs e CASEs

Não, não é só nas linguagens de programação que temos IF's e CASE's, no SQL também os temos e este artigo é justamente para falarmos um pouco sobre eles e algumas utilizações. Vamos iniciar exibindo a nossa tabela teste id nome idade estado 1 Pedro 50 SP 2 Antonio 30 RJ 3 Amélia 20 SP 4 Marta 15 SP 5 Maria 80 SP 6 NULL NULL RJ Trabalhando com IF A sintaxe básica é a que segue abaixo SELECT *,IF(estado = 'SP', 'São Paulo','Rio de Janeiro') AS nome_do_estado FROM teste id nome idade estado nome_do_estado 1 Pedro 50 SP São Paulo 2 Antonio 30 RJ Rio de Janeiro 3 Amélia 20 SP São Paulo 4 Marta 15 SP São Paulo 5 Maria 80 SP São Paulo 6  NULL NULL RJ Rio de Janeiro Ou seja, IF(campo = 'valor1', 'resposta 1','resposta 2') onde 'resposta 1' ocorre se o valor de um determinado regisro de "campo" for igual a ...

MySQL - Utilizando variáveis do MySQL com subqueries

Um assunto que acredito ser pouco discutido, ou que pelo menos eu vejo muito pouco, são as variáveis em SQL. Estas funcionam de maneira semelhante a variáveis das linguagens de programação, ou seja guardam um determinado valor, apenas a implementação delas é ligeiramente diferente. Uma utilização interessante das variáveis é o incremento de linha, ou seja, criar uma lista ordenada numerada 'artificialmente'. Talvez eu tenha sido pouco claro na explicação acima, mas os exemplos dirão por si próprios. Para começarmos vamos adotar a nossa tabela de teste id nome idade estado 1 Pedro 50 SP 2 Antonio 30 RJ 3 Amélia 20 SP 4 Marta 15 SP 5 Maria 80 SP Vamos ordenar a tabela por nome, por exemplo. SELECT * FROM teste ORDER BY nome Temos a tabela ordenada da seguinte forma id nome idade estado 3 Amélia 20 SP 2 Antonio 30 RJ 5 Maria 80 SP 4 Marta 15 SP 1 Pedro 50 SP O problema, se é que podemos dize...

MySQL - Listando e matando processos do banco de dados

A dica de hoje é rápida mas muito útil. Tem momentos em que aquela sua query fica empacada e você precisa ver o que está acontecendo e, caso necessário, 'matar' o processo. Para listar o processo de um banco basta acessar o mesmo e fazer a query abaixo. SHOW PROCESSLIST Será exibida a lista dos processos ativos. Para matar um processo basta verificar o ID do mesmo e digitar: KILL numero_do_processo É isso ai.

MySQL - Tabelas virtuais - Fazendo Subselects e agrupamentos com GROUP BY

Hoje vamos ver uma query bem simples mas extremamente útil. Ela envolve o princípio de subselects que nada mais é do que a possibilidade que o SQL nos dá de criar uma espécie de tabela virtual através de uma query e, posteriormente, utilizar esta mesta para fazer uma nova query. É como aplicar um "filtro" duas vezes para tornar mais "pura" uma mistura. Outro modo de fazer isto seria criando uma VIEW, porém, muitas vezes, é completamente desnecessário como no caso de um select simples. VIEWS geralmente guardamos para selects muito complexos. Bem, vamos começar com nossa tabela base de testes. id  nome  idade  estado 1  Pedro  50   SP 2  Antonio  30   RJ 3  Amélia  20   SP 4  Marta  15   SP 5  Maria  80   SP Vamos supor que desejamos agrupar as informações por estado. Isto é bem simples através das linhas abaixo: SELECT estado,count(*) AS quantidade FROM `teste` GROUP BY estado A sa...

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...

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...