DGmike

DGmike

Calma! não entre em pânico! Amanhã (talvez) tem novo post…

  • Alice Andrade
  • Rafael Zamana
Você está aqui: dgmike » Arquivos para banco de dados

  • Home
  • Guia Rápido jQuery
  • Códigos prontos
    • PHP: Função __auloload()
    • Classe sqlsimples e sql – PHP
    • Bancos, bancos e mais bancos…
  • PagSeguro
  • Artigos
    • JavaScript (parte 1)
  • Quem é dgmike?

CodeShow: cobras versionadas

Posted in Dia-a-dia by DGmike
May 26 2010
TrackBack Address.
Este post possui um microformato do tipo hCalendar Amanhã a humilde empresa onde trabalho irá realizar um evento… não “um evento”, mas “o evento”. O CodeShow é o evento mais esperado por amantes de desenvolvimento de websites – designers ou programadores. Eles verão as cobras do desenvolvimento criando uma aplicação web ao vivo. O evento acontecerá aqui no espaço Apas, R. Pio XI, 1200 São Paulo, SP BRA. Facinho de chegar.
Python, linguagem dos feras!

Sim, python é um tipo de cobra e também o nome de uma linguagem de programação muito poderosa.

Para quem não sabe, o CodeShow teve sua primeira versão em 2007, quando eu ainda não era funcionário da #visie. Lá, o Diego Eis e o Elcio Ferreira mostraram como fazer um aplicativo web2.0, uma biblioteca online.

Este ano, faremos o novo campus online (diga-se de passagem que o campus online foi o meu segundo projeto em python[bb]) com recursos de programação e desenvolvimento ágil. Falaremos como é a parceria entre designer e programador, como é trabalhar em equipe, o que fazer para não ter dores de cabeça. Tudo mostrando, ao vivo, como uma aplicação deve ser montada e publicada.

Funcionará assim: teremos o inicio do projeto, mostrando como a aplicação deve ficar, exibiremos as ferramentas que serão usadas: Git, HTML5, web2py e MongoDB entre outras. Depois faremos uma pausa e iremos para o coffe break – a melhor parte. Conselho: faça um bom networking. Eu entrei na empresa logo após o primeiro CodeShow. Se quiser, vamos bater um papo sobre PHP[bb], Padrões de codificação, python, html5, pagseguro ou é claro, sobre os episódios clássicos do chaves/chapolin. (“Pepe! Já tirei a vela!”).

Logo após o coffe, os programadores irão para uma sala e os designers para outra. Pergunta: Posso estar nas duas salas ao mesmo tempo? Acho que não, mas tente… talvez a força esteja com você. Lá teremos o desenvolvimento em si. Como teremos programadores em apenas uma sala, poderemos não nos importar com termos técnicos que normalmente designers não entenderiam, como “pedra, papel, tesoura, lagarto, spock“.

No final do dia, iremos juntar as duas “equipes” para finalizar o projeto. E então enviar por ftp para o servidor publicar o novo campus online. O evento é um apoio do PagSeguro e demonstraremos, na prática, como implementar essa ferramenta usando python.

No twitter

Para quem quiser, pode acompanhar a hashtag #codeshow para saber o que está acontecendo no evento. Se quiser, fique à vontade para me seguir.

    No Comments yet »
    Tagged as: banco de dados, codeshow, Design, evento, eventos, javascript, Programação, python, Tecnologia, trampo, twitter, visie, web

    Dados de teste

    Posted in Programação, Tecnologia, Trabalho, sql by DGmike
    Mar 18 2010
    TrackBack Address.

    Um projeto de verdade deve ser testado de várias formas possíveis. Já falei sobre teste unitários e como aumentar a produtividade com isso num evento de porte internacional. Agora, sabe quando você precisa criar vários registros no banco de dados[bb] só para mostrar ao cliente como o sistema vai ficar, ou quando você precisa de dados aleatórios dos mais variados tipos para saber se o sistema aguenta o tranco?

    Todas as máquinas enviam registros a apenas um servidor de banco de dados

    Gerar dados de forma simples como se fossem várias máquinas

    É muito chato quando precisamos inserir no banco de dados vários registros para teste, você passa horas e horas apenas inserindo informações que você deve gerar de sua própria cabeça. Para resolver esse problema, existe um bom aplicativo web chamado Generate Data, onde você define a tabela e os campos e o que cada campo irá possuir.

    Por exemplo, você está escrevendo um aplicativo de agenda pessoal com as seguintes tabelas:

    usuario:
        id: int auto_increment
        nome: varchar(50)
     
    telefone:
        id: int auto_increment
        id_usuario: int
        tipo: enum(celular,residencial,trabalho)
        numero: varchar(14)

    Então, você só precisa inserir 30 registros para usuário, dizendo que o campo nome é um “full name” e ele gera vários nomes aleatórios para você não ter problemas de repetir dados.

    Para a tabela telefone, coloque o “id_usuario” como um número inteiro entre 1 e 30. Para o campo tipo um valor string entre “celular”, “residencial” ou “trabalho”. E o campo numero ganhará um telefone no formato (XX) XXXX-XXXX. O legal é que o generate data dificilmente vai te deixar na mão, mas na maioria das vezes você consegue gerar registros de testes para seus projetos. Ele ainda consegue exportar os dados em vários – SQL, CSV, Excel, XML ou HTML[bb] e anda existe uma versão para download que você pode fazer rodar em sua máquina sem precisar estar online ou modificá-lo para alterar os dados que serão gerados como por exemplo, cidades e estados brasileiros. Fica a dica para aumentar sua produtividade[bb].

    1 Comment »
    Tagged as: banco de dados, dados, gerador, model, sql

    PDO e classe de resultados

    Posted in icephp, php, sql by DGmike
    Oct 22 2009
    TrackBack Address.

    Estava fazendo alguns testes com PDO e SQLite e descobri uma coisa muito interessante sobre o PDO: classe de resultados. O que isso quer dizer, que quando você faz um fetchObject você pode usar sua própria classe com seus próprios métodos.

    Atenção! Este post é totalmente NERD e destinado para programadores com algum conhecimento em PHP e banco de dados. Caso este não seja seu perfil aconselho a desistir enquanto é tempo.

    Caixa, guarde o que é seu

    O código começou mais ou menos assim, eu queria desenvolver um model específico para o ICEPHP, e com o advento do PDO decidi usá-lo como base. Então precisei de alguns definitions: diretório onde se encontra o arquivo (script) e o separador de pastas que em linux é barra e no windows é contra-barra. Também criei duas tabelas no banco de dados, post e categoria:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    define('DS', DIRECTORY_SEPARATOR);
    define('ICE_DIR', dirname(__FILE__));
     
    $bd = new PDO('sqlite:'.ICE_DIR.DS.'banco.db');
    # A conexão do PDO não é linda?!
    
    $bd->query("
        CREATE TABLE IF NOT EXISTS categoria (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            nome VARCHAR(40),
            slug VARCHAR(40)
        );
    ");
    $bd->query("
        CREATE TABLE IF NOT EXISTS post (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            titulo VARCHAR(40),
            slug VARCHAR(40),
            post TEXT,
            data TIMESTAMP
        );
    ");

    Após isso fiz um select no banco de dados e se não me retornasse resultados, inseri um dado no banco de dados:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    $c=$bd->query("SELECT COUNT(*) as c FROM post;");
     
    if (!$c->fetchObject()->c) {
        $bd->query("
            INSERT INTO post (titulo, slug, post, data) VALUES (
                'Apenas um teste',
                'apenas-um-teste',
                'Este post é apenas um teste do novo Framework: ICEPHP',
                CURRENT_DATE
            );
        ");
    }

    Com isso eu consigo usar o resultado de forma linda (orientado a objetos):

    1
    2
    3
    4
    5
    
    $c=$bd->query("SELECT * FROM post;");
    $r = $c->fetchObject();
    echo $r->titulo;
     
    // Isto retorna "Apenas um teste"

    Lendo a documentação sobre o fetchObject do PDO vi que é possivel passar como parâmetro uma string com o nome da Classe que você deseja que seja utilizado para o resultado, lembrando que (!), o padrão é o stdClass. Entao passei minha classe resultado como exemplo e o que descobri. Coisas lindas de se fazer. Eis a classe Resultado:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    
    class Resultado
    {
        var $_data = array();
        var $_updated = false;
     
        function __toString()
        {
            return "O resultado é: ".$this->titulo . ' ('.date('d-m-Y h:i:s', $this->data).")\n";
        }
     
        function __get($k)
        {
            return $this->_data[$k];
        }
     
        function __set($k, $v)
        {
            if (isset($this->_data[$k]) AND $this->_data[$k] != $v) {
                $this->_updated = true;
            }
            $this->_data[$k] = $v;
        }
     
        function salvaPost()
        {
            global $bd;
     
            $sql = "UPDATE post SET ";
            foreach ($this->_data as $k=>$v) {
                if ($k!='id' || $k != 'data') {
                  $sql .= "\n  $k = '$v',";
                }
            }
            $sql = substr($sql, 0, -1);
            $sql .= "\n WHERE id = ".$this->id;
     
            $bd->query($sql);
        }
     
        function __destruct()
        {
            if ($this->_updated) {
                $this->salvaPost();
            }
        }
    }

    Veja, apenas usei um método de verdade, todos os outros usei os métodos mágicos do PHP (__toString, __get, __set, __destruct). Recomendo que leia sobre estes métodos e use-os, eles podem salvar sua vida. Whatever, com essa classe Resultado é possivel fazer o que eu sempre quis fazer, um objeto de resultado de banco de dados que atualiza o banco sem usar o estilo seta parametros e depois salva. Veja como é feito na maioria dos ORMs por aí:

    1
    2
    3
    
    $r=$post->get(1);
    $r->titulo = 'Titulo Alterado';
    $r->save();

    Pense comigo, se você atribuiu um valor, você quer que ele seja salvo, correto? Então não ficaria mais fácil se forsse assim?

    1
    2
    
    $r=$post->get(1);
    $r->titulo = 'Titulo Alterado';

    Sim!!! Às vezes você atribui um valor que não deseja salvar, faz isso apenas para configurar os dados e etc, mas pense, quantas vezes você faz isso? Além disso, óbvio que é possivel fazer tudo o que deseja gastando um pouco mais de massa cinzenta, mas a proposta não é essa no momento.

    Usando a classe Resultado é possivel fazer o update quase que “on the fly”. Na verdade, para o programador parece que é instantâneo, mas não é. O update se dá no destruct do objeto, normalmente quando o script finaliza, mas pode ser quando damos um novo fetchObject nessa variável. Se ele não for alterado ele, obviamente, não salva as alterações no banco de dados. Veja como fica o exemplo do que estou falando.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    $c=$bd->query("SELECT * FROM post;");
    # Pegando o objeto e jogando-o na classe de resultados
    $r = $c->fetchObject('Resultado');
     
    # Imprimindo, devido ao método __toString aparece:
    # O resultado é: Apenas um teste (31-12-1969 09:33:29)
    print ($r);
     
    # Alterando o resultado
    $r->titulo = 'Teste';
     
    # Imprimindo mais uma vez, aparece
    # O resultado é: Teste (31-12-1969 09:33:29)
    # mas isto está em 'cache'
    print ($r);
     
    # Quando o objeto é destruído, ao finalizar o script
    # ele faz o update necessário

    Testei isso no foreach e também funcionou, então é fazer updates de objetos em escala, mas não exagere, o ideal é fazer isso no sql. Veja como fica com o foreach:

    1
    2
    3
    4
    5
    
    $c=$bd->query("SELECT * FROM post;");
     
    while ($x = $c->fetchObject('Resultado')) {
        $x->data = time();
    }

    Isso me deixa com várias ideias para criar o ORM do ICEPHP. Mas fica a dica para vocês desenvolverem seus códigos, experimente criar um método FORM que já cria um formulário html para você facilitar sua vida. :D

    1 Comment »
    Tagged as: banco de dados, classe, framework, icephp, pdo, php, sqlite

    Campo DataTransacao no retorno do PagSeguro

    Posted in Dia-a-dia, pagseguro by DGmike
    Apr 03 2009
    TrackBack Address.

    Algumas vezes algumas pessoas me perguntam sobre o campo DataTransacao quando trabalhamos com boletos? Qual data vem nesse campo? A data em que o boleto foi emitido? A data em que o status foi alterado? Ou a data em que o POST foi enviado para você. (se quiser uma explicação sobre o que é esse tal de POST ou como funciona o PagSeguro, aconselho a ler meu artigo escrito no forum do iMasters)

    No PagSeguro, o Boleto você pode gerar boletos para seus clientes de forma segura, mas atente para a data de compensação desse boleto. Nem você nem seu cliente querem erros nessas datas

    No PagSeguro, o Boleto você pode gerar boletos para seus clientes de forma segura, mas atente para a data de compensação desse boleto. Nem você nem seu cliente querem erros nessas datas

    Claro que isso é uma preocupação muito grande para quem trabalha com créditos que dependem da data em que a pessoa efetuou o pagamento. Cinco dias corridos de acesso a partir do pagamento por exemplo.

    Então fui procurar uma resposta em meu log de dados, eis que me deparo com dois casos e verifiquei a seguinte sequencia de pagamentos via boletos (os IDs das tranações foram alterados para segurança dos clientes):

    //-
    Thu Apr 2 21:04:17 2009

    ‘StatusTransacao’: ‘Aguardando Pagto’,
    ‘DataTransacao’: ‘02/04/2009 21:08:58‘,
    ‘TipoPagamento’: ‘Boleto’,
    ‘TransacaoID’: ‘XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXA’,

    Fri Apr 3 06:27:04 2009

    ‘StatusTransacao’: ‘Aprovado’,
    ‘DataTransacao’: ‘02/04/2009 21:08:58‘,
    ‘TipoPagamento’: ‘Boleto’,
    ‘TransacaoID’: ‘XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXA’,
    -//

    //-
    Thu Apr 2 11:04:38 2009

    ‘StatusTransacao’: ‘Aguardando Pagto’,
    ‘DataTransacao’: ‘02/04/2009 11:09:18‘,
    ‘TipoPagamento’: ‘Boleto’,
    ‘TransacaoID’: ‘XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXB’,

    Fri Apr 3 06:02:47 2009

    ‘StatusTransacao’: ‘Aprovado’,
    ‘DataTransacao’: ‘02/04/2009 11:09:18‘,
    ‘TipoPagamento’: ‘Boleto’,
    ‘TransacaoID’: ‘XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXB’,
    -//

    Como podemos perceber, o campo “DataTransacao” não é alterado e provavelmente se refere à data em que a compra foi efetuada, logo aconselho a alterar a data do seu banco de dados com a data atual do sistema. Em mysql você pode usar NOW() (faz um “SELECT NOW()” para ver o que estou falando).

    Abraços, espero que isso retire a dúvida de uma ou duas pessoas =D

    1 Comment »
    Tagged as: aplicar, banco de dados, boleto, data, dinheiro, e-commerce, loja, loja virtural, mysql, pagamento, pagseguro, php, postgree, retorno, retorno automático, simples

    Post Rápido: Unir dois resultados em um só SQL

    Posted in Tutorial, sql by DGmike
    Mar 30 2009
    TrackBack Address.

    Aqui onde estamos trabalhando (@rodrideme e @deninhu) precisamos fazer uma busca em dois bancos de dados e mostrar o resultado em um lugar só. Por que? Porque temos dois bancos de dados e em um ficarão os registros de quem já é registrado, e no outro quem ainda não é registrado, mas que pode vir a se registrar (mas isso é outra história).

    Banco de dados. Sempre que puder, use esta ferramenta para ajudar no seu dia a dia

    Banco de dados

    Aqui nós estamos trabalhando com db2[bb], mas o que irei mostrar é independente de banco.

    Tá, para de enrolar e fala logo!

    Você pode unir dois resultados (inclusive de drivers/bancos que estejam na mesma conexão) em um unico result, mesclando os dados. Para isso use a estrutura UNION.

    Tome as seguintes queries:

    1
    2
    3
    
    SELECT cod, nome, idade FROM pessoas
     
    SELECT codigo, nome_completo, idade FROM pessoas_nao_cadastradas

    Primeiro, você deve ter resultados iguais para cada select, para isso use alias para igualar os resultados.

    1
    2
    3
    
    SELECT cod, nome, idade FROM pessoas
     
    SELECT codigo AS cod, nome_completo AS nome, idade FROM pessoas_nao_cadastradas

    Agora, basta você usar o UNION entre os dois selects:

    1
    2
    3
    
    SELECT cod, nome, idade FROM pessoas
    UNION
    SELECT codigo AS cod, nome_completo AS nome, idade FROM pessoas_nao_cadastradas

    Pronto! Você tem o resultado de dois bancos de dados mesclados em um só.

    Legal, mas como faço WHERE nisso?

    Você deve fazer um where ou nos dois selects ou fazer um select que totaliza os dois (como eu gosto de fazer):

    1
    2
    3
    4
    5
    
    SELECT z.* FROM (
      SELECT cod, nome, idade FROM pessoas
      UNION
      SELECT codigo AS cod, nome_completo AS nome, idade FROM pessoas_nao_cadastradas
    ) z WHERE nome = 'Michael'
    • Dados de teste
    • Insert simples de SQL
    • IcePHP: O framework gelado como um picolé!
    • CodeShow: cobras versionadas
    • PDO e classe de resultados

    2 Comments »
    Tagged as: banco, banco de dados, dados, database, db2, dois bancos, mesclar, querie, query, select, sql, union
    Next page »

    Categorias

    • Amigos  (16)
    • cases  (4)
    • Cotidiano  (73)
    • CSS  (20)
    • Design  (2)
    • Dia-a-dia  (33)
    • Diversão  (18)
    • eventos  (10)
    • extensions  (11)
    • flash  (4)
    • Games  (1)
    • html  (7)
    • icephp  (4)
    • Ilustração  (6)
    • Imagem  (8)
    • Inspiração  (5)
    • javascript  (36)
      • jQuery  (7)
      • yui  (2)
    • Não categorizado  (26)
    • Navegadores  (19)
      • Chrome  (6)
      • Firefox  (18)
      • Internet Explorer  (6)
    • pagseguro  (12)
    • php  (43)
      • PHP Conference  (3)
    • plugin  (3)
    • Programação  (46)
    • python  (5)
    • Semântica  (16)
    • sql  (9)
    • tableless  (18)
    • Tecnologia  (48)
    • Trabalho  (28)
    • Tutorial  (25)
    • Vetorial  (5)
    • video  (8)
    • video-tutorial  (5)
    • Windows  (4)
    • wordpress  (2)
    • xHTML  (23)

    Tags

    ajax artigo banco de dados biblioteca blog browser classe CSS data Design Dia-a-dia dinheiro evento eventos Firefox framework google html icephp internet Internet Explorer javascript jQuery loja mysql online opera pagseguro palestra php plugin Programação python retorno automático simples site solução sql tableless Tecnologia Tutorial twitter visie web wordpress

    Arquivo

    SlideSare

    Últimos Posts

    • Vírgula em html5 e css3
    • Youtube e HTML5, agora ficou mais fácil
    • Novo emprego!
    • Até mais e obrigado pela salada
    • Api de teste do meadiciona.com

    Tags

    ajax artigo banco de dados biblioteca blog browser classe CSS data Design Dia-a-dia dinheiro evento eventos Firefox framework google html icephp internet Internet Explorer javascript jQuery loja mysql online opera pagseguro palestra php plugin Programação python retorno automático simples site solução sql tableless Tecnologia Tutorial twitter visie web wordpress

    Conteúdo

    • Artigos
      • JavaScript (parte 1)
    • Códigos prontos
      • Bancos, bancos e mais bancos…
      • Classe sqlsimples e sql – PHP
      • PHP: Função __auloload()
    • Guia Rápido jQuery
    • PagSeguro
    • Quem é dgmike?
    PagSeguro Powered by WordPress | “Blend” from Spectacu.la WP Themes Club