Archive for the ‘www’ category

Copiar dados de um tabela para outra em MySQL

fevereiro 11th, 2010

Hoje precisei copiar dados de uma tabela para outra. Mas como fazer isso facilmente atraves de linha de comando? … vou dizer, mas antes vamos as premissas:

* Não quero registros repetidos, neste caso o e-mail

* Não quero todos os dados da tabela Servidor (onde vou pegar os dados).

* So quero os e-mails começados com a letra “a”.

Então, vamos a dica:

1
INSERT INTO tabela2  (nome, email) SELECT nome, email FROM tabela1 WHERE (email LIKE 'a%') GROUP BY email

Logico que os dados acima são fictícios, mas funciona. A explicação basica é:

1- O comando INSERT como outro qualquer na tabela2 (a que vai receber os dados)

2- Em seguida vem um SELECT normal tambem, com os campos que desejo importar na mesma ordem que eu coloquei para inserir.

3- O WHERE para a condição dos e-mails começando com a letra “a”.

4- O GROUP BY para não repetir os e-mails. Poderia usar tambem o DISTINCT ou similar, fica a critério do fregues.

Se tiver alguma duvida sobre MySQL pode perguntar, se eu souber irei responder com certeza.

Retorno Automático PagSeguro em PHP/MySQL funcionando

outubro 14th, 2009

Que o PagSeguro é realmente um dos melhores meios de pagamento da web, isso ninguem dúvida. Mas como integra-lo ao seu sistema de e-commerce? O site de ajuda do PagSeguro tenta ser claro e explicativo, mas o fato é, o script disponível no site simplismente não funciona.

Vamos aos erros…

No script PHP do PagSeguro eles usam uma função que se chama, tep_not_null() que não é uma função nativa do PHP, ou seja, o seu script não irá funcionar. Esta função pode ser encontrada no OsCommerce (que não recomendo) ou em outros scripts pela internet. Bola fora, porque este exemplo dado por eles serve justamente para implantar em outros sistemas, ja que os modulos para esses scripts prontos estão disponíveis no proprio site.

Erro apresentado: Fatal error: Call to undefined function tep_not_null() in /teste/pagseguro.php on line 53

… existem outras melhorias que podem ser feitas no script PHP oferecido pelo PagSeguro, não irei comentar, irei implementar mais abaixo, ok?

No script de criação de tabelas MySQL do PagSeguro existe alguns erros básicos e curiosidades tambem. O primeiro é o seguinte, para que existe a tabela PagSeguroTransacoesProdutos sendo que em nenhum dos scripts de linguagem oferecidos por ele existe a inclusão de dados nesta tabela? Com certeza fail. Na outra tabela PagSeguroTransacoes, esta sim é utilizada, mesmo assim com erros gritantes. Como por exemplo, o campo TransacaoID como chave primaria. Porque erro? Porque o PagSeguro faz um post cada vez que é atualizado a transação, desta maneira que esta apenas a primeira inclusão será feita no MySQL, as confirmações de pagamento, cancelamento ou outro status diferente da transação que será postado posteriormente serão ignoradas pelo MySQL pois so pode existir um registro com cada chave primária. Trocando em miudos, você não sabe quem pagou ou não, pois a transanção não será atualizada.

Erro apresentado: #1062 – Duplicate entry ‘TransacaoID’ for key 1

Ta bom ou quer mais? Mais? tem muita coisa, como falta de um campo data para saber quando aconteceu a confirmação, um campo de flag para saber o que você ja atualizou no sistema ou não, etc. Essas implementações eu irei fazer a seguir.

Coloquei o dedo na ferida, e agora? E agora vamos a…

Implementação

Tentei comentar o código de forma simples e sucinta, então qualquer explicação seria chuver no molhado, vamos lá.

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<?
##############################################################
#                         CONFIGURAÇÕES
##############################################################

$retorno_site = 'http://www.exemplo.com.br/compra_efedutada.html';  // Site para onde o usuário vai ser redirecionado
$retorno_token = '000000000000000000000000000'; // Token gerado pelo PagSeguro

$retorno_host = 'localhost'; // Local da base de dados MySql
$retorno_database = 'basededados'; // Nome da base de dados MySql
$retorno_usuario = 'usuario'; // Usuario com acesso a base de dados MySql
$retorno_senha = 'senha';  // Senha de acesso a base de dados MySql


###############################################################
#              NÃO ALTERE DESTA LINHA PARA BAIXO
################################################################

$lnk = mysql_connect($retorno_host, $retorno_usuario, $retorno_senha) or die ('Nao foi possível conectar ao MySql: ' . mysql_error());
mysql_select_db($retorno_database, $lnk) or die ('Nao foi possível ao banco de dados selecionado no MySql: ' . mysql_error());

// Validando dados no PagSeguro

$PagSeguro = 'Comando=validar';
$PagSeguro .= '&Token=' . $retorno_token;
$Cabecalho = "Retorno PagSeguro";

foreach ($_POST as $key => $value)
{
 $value = urlencode(stripslashes($value));
 $PagSeguro .= "&$key=$value";
}

if (function_exists('curl_exec'))
{
 $curl = true;
}
elseif ( (PHP_VERSION >= 4.3) && ($fp = @fsockopen ('ssl://pagseguro.uol.com.br', 443, $errno, $errstr, 30)) )
{
 $fsocket = true;
}
elseif ($fp = @fsockopen('pagseguro.uol.com.br', 80, $errno, $errstr, 30))
{
 $fsocket = true;
}

if ($curl == true)
{
 $ch = curl_init();

 curl_setopt($ch, CURLOPT_URL, 'https://pagseguro.uol.com.br/Security/NPI/Default.aspx');
 curl_setopt($ch, CURLOPT_POST, true);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $PagSeguro);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_HEADER, false);
 curl_setopt($ch, CURLOPT_TIMEOUT, 30);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

  curl_setopt($ch, CURLOPT_URL, 'https://pagseguro.uol.com.br/Security/NPI/Default.aspx');
  $resp = curl_exec($ch);

 curl_close($ch);
 $confirma = (strcmp ($resp, "VERIFICADO") == 0);
}
elseif ($fsocket == true)
{
 $Cabecalho  = "POST /Security/NPI/Default.aspx HTTP/1.0\r\n";
 $Cabecalho .= "Content-Type: application/x-www-form-urlencoded\r\n";
 $Cabecalho .= "Content-Length: " . strlen($PagSeguro) . "\r\n\r\n";

 if ($fp || $errno>0)
 {
    fputs ($fp, $Cabecalho . $PagSeguro);
    $confirma = false;
    $resp = '';
    while (!feof($fp))
    {
       $res = @fgets ($fp, 1024);
       $resp .= $res;
       if (strcmp ($res, "VERIFICADO") == 0)
       {
          $confirma=true;
          break;
       }
    }
    fclose ($fp);
 }
 else
 {
    echo "$errstr ($errno)<br />\n";
 }
}


if ($confirma) {

 // Recebendo Dados
 $TransacaoID = $_POST['TransacaoID'];
 $VendedorEmail  = $_POST['VendedorEmail'];
 $Referencia = $_POST['Referencia'];
 $TipoFrete = $_POST['TipoFrete'];
 $ValorFrete = $_POST['ValorFrete'];
 $Extras = $_POST['Extras'];
 $Anotacao = $_POST['Anotacao'];
 $TipoPagamento = $_POST['TipoPagamento'];
 $StatusTransacao = $_POST['StatusTransacao'];
 $CliNome = $_POST['CliNome'];
 $CliEmail = $_POST['CliEmail'];
 $CliEndereco = $_POST['CliEndereco'];
 $CliNumero = $_POST['CliNumero'];
 $CliComplemento = $_POST['CliComplemento'];
 $CliBairro = $_POST['CliBairro'];
 $CliCidade = $_POST['CliCidade'];
 $CliEstado = $_POST['CliEstado'];
 $CliCEP = $_POST['CliCEP'];
 $CliTelefone = $_POST['CliTelefone'];
 $NumItens = $_POST['NumItens'];
 
 // Gravando Dados
mysql_query("INSERT into PagSeguroTransacoes SET
    TransacaoID='$TransacaoID',
    VendedorEmail='$VendedorEmail',
    Referencia='$Referencia',  
    TipoFrete='$TipoFrete',
    ValorFrete='$ValorFrete',  
    Extras='$Extras',  
    Anotacao='$Anotacao',  
    TipoPagamento='$TipoPagamento',
    StatusTransacao='$StatusTransacao',
    CliNome='$CliNome',
    CliEmail='$CliEmail',  
    CliEndereco='$CliEndereco',
    CliNumero='$CliNumero',
    CliComplemento='$CliComplemento',  
    CliBairro='$CliBairro',
    CliCidade='$CliCidade',
    CliEstado='$CliEstado',
    CliCEP='$CliCEP',  
    CliTelefone='$CliTelefone',
    NumItens='$NumItens',  
    Data=now();"
);

}

Header("Location: $retorno_site"); exit();
?>

Basicamente, ele se conecta no MySQL, depois checa através do CURL se foi realmente o PagSeguro que enviou a postagem, recebe os dados via post e grava os dados na tabela.

… mas que tabela? Ahh sim… vamos a criação da tabela do MySQL.

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
CREATE TABLE `PagSeguroTransacoes` (
  `TransacaoID` varchar(36) NOT NULL,
  `VendedorEmail` varchar(200) NOT NULL,
  `Referencia` varchar(200) default NULL,
  `TipoFrete` char(2) default NULL,
  `ValorFrete` decimal(10,2) default NULL,
  `Extras` decimal(10,2) default NULL,
  `Anotacao` text,
  `TipoPagamento` varchar(50) NOT NULL,
  `StatusTransacao` varchar(50) NOT NULL,
  `CliNome` varchar(200) NOT NULL,
  `CliEmail` varchar(200) NOT NULL,
  `CliEndereco` varchar(200) NOT NULL,
  `CliNumero` varchar(10) default NULL,
  `CliComplemento` varchar(100) default NULL,
  `CliBairro` varchar(100) NOT NULL,
  `CliCidade` varchar(100) NOT NULL,
  `CliEstado` char(2) NOT NULL,
  `CliCEP` varchar(9) NOT NULL,
  `CliTelefone` varchar(14) default NULL,
  `NumItens` int(11) NOT NULL,
  `Data` datetime NOT NULL,
  `status` tinyint(1) unsigned NOT NULL default '0',
  UNIQUE KEY `TransacaoID` (`TransacaoID`,`StatusTransacao`),
  KEY `Referencia` (`Referencia`),
  KEY `status` (`status`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Na tabela acima todos os campos são basicamente os dados recebidos do PagSeguro. Existem mais campos adicionais que vem em POST tambem que não quis colocar, se você tiver conhecimento basta ler o manual do PagSeguro e adicionar os campos.

Os indices que coloquei foram 3. O primeiro de tipo UNIQUE em TransacaoID e StatusTransacao para evitar que um registro seja enviado mais de uma vez, isso pode ocorrer em servidores com conexão lenta, é melhor remediar, pois estamos falando de transações financeiras. Os outros dois são indices de chave (KEY) apenas, para indexar e deixar sua busca pelos registros mais rapidas. O primeiro é na Referencia, campo que você envia ao PagSeguro na hora da compra para vincular o pagamento a ele, seria nossa chave. O segundo é um campo criado por mim, status que nada mais é que uma flag que uso no meu sistema, para saber quando ja usei aquele registro ou não, por padrão, todos os registros inseridos tem status zero.

Legal ter o código aberto no blog, mas eu gosto de facilidade quando busco em outros blogs, por isso a partir de hoje, qualquer código estará disponivel tambem para download.

download Faça download do código aqui.

… bem, acho que depois de um longo tempo sem atualizar o blog devido a uma cirurgia de redução de estomago (vou falar sobre isso depois), é uma postagem importante e relevante para os desenvolvedores da área. Espero que tenham gostado.

Have Fun!

Webinar sobre otimização de sites

julho 22nd, 2009

O Google disponibilizou o video no Youtube do seminário online (Webminar) sobre Otimização de sites. O seminário foi apresentado na última sexta-feira (17/07). Todos os associados do Adsense receberam o convite, mas acho que nem todos participaram.

Vale a pena, principalmente para quem não conhece o processo de preços aplicados no Adsense, funcionamento e melhores posicionamento dos anúncios. E lógico, que participou poderá rever e imprimir melhor o conhecimento. Vamos ao video:

Como fazer URLs amigaveis com .htaccess e php

junho 25th, 2009

Para quem não sabe o que é URL amigável vou explicar através de exemplo para evitar dúvidas.

URL Convencional: http://www.exemplodominio.com.br/noticia.php?id=1237
URL Amigável: http://www.exemplodominio.com.br/noticia/1237/

Viu a diferença? Além da vantagem de ficar mais elegante, facilita bastante a indexação dos mecanismos de buscas. Mas como fazer o controle de arquivos e identificadores? Então vamos aos códigos.

Primeiro você deve editar ou criar um arquivo .htaccess na raiz do seu site e inserir o código abaixo.

1
2
3
4
5
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(!.(\.gif|\.jpg|\.png|\.css|\.js|\.txt|\.php|\.htm|\.html)|.+[^/])$ /$1/ [L]
RewriteRule ^([^-]+)/$ /funcao.php?frase=$1&%{QUERY_STRING} [L]

A primeira linha linha é para ativar o módulo. A segunda e terceira linha é para ignorar arquivos e diretorios respectivamente. Na quarta linha ignora alguns tipos de arquivos. E finalmente na quinta linha, joga a string para um arquivo php qualquer, neste caso funcao.php.

1
2
3
4
5
$geturl = explode('/', $_SERVER['REQUEST_URI']);
if ($geturl[1] == 'noticia') {
    $id = $geturl[2];
    include noticia.php;
}

Interpretando rapidamente o código, a linha inicial captura a variavel gerada pela URL e usa a função explode para separar as palavras da URL.

Em seguida eu faço uma condicional IF para verificar se é noticia e setar o ID da mesma. Você pode incrementar como quiser o código e ter quantas palavras desejar na URL. Basta ter um pouco de criatividade.

Lembre-se, para funcionar o módulo apache Rewrite deve estar ativo no servidor Apache. Para maiores informações, procure a empresa de hospedagem do seu site.

Ganhe um iMac e tenha 7 dias grátis de aula de ingles sem sorteio

maio 28th, 2009

É simples! Convide seus amigos para o meuInglês, quem trouxer mais amigos, ganha um iMac.

Os três usuários que trouxerem o maior número de amigos para o meuInglês ganham prêmios:

  • 1º Lugar: iMac
  • 2º Lugar: iPod Touch
  • 3º Lugar: iPod Shuffle

Para participar você deve clicar no banner abaixo:

Quanto mais amigos clicarem no seu link, mais chance você tem de ganhar!

O twitter quase matou meu blog…

abril 30th, 2009

eu disse quase.. pois não vou deixar de atualizar meu blog.

Vamos fazer o seguinte, amanhã tem doisi novos posts aqui, com assuntos mais tecnicos, uma super dica de Mysql e outra de manipulação de imagens por CSS. Vou tentar iniciar tambem a mudança de layout do blog, para integração com o Twitter e com o FlogVIP. Agora vou aprovar os 35 comentários aqui do blog, porque o trem já esta é ficando feio.

Leitores e paraquedistas… não se vão… pois eu voltarei.. huhuhu..

PHP: Manipular variável com uma data entre formato brasileiro / internacional

março 23rd, 2009

Esta é uma função que converte a data no formato brasileiro (ex: 25/02/2009) para o formato internacional para banco de dados (ex: 2009-02-25) ou vice-versa. É possivel tambem escolher entre os separadores da data entre hifen ou barra.

Confira no código abaixo:

1
2
3
4
5
6
7
8
function formatadata($data, $tipo = 1) {
$data = str_replace('-', '/', $data);
$dividir = explode("/", $data);
$parte1 = $dividir[0]; $parte2 = $dividir[1]; $parte3 = $dividir[2];
$data = "$parte3-$parte2-$parte1";
if ($tipo == 1) $data = str_replace('-', '/', $data);
return $data;
}

bom… o uso é bem facil, vamos a um exemplo prático:

1
2
$data = '12/01/2008';
echo formatadata($data, 2);

o resultado seria:

1
2008-01-12

Bom, analisando a função é simples ver o que ela faz. Primeiramente ela pega a data e separa em três partes, e depois inverte a ordem das mesmas. O segundo paremetro da função define qual o separador da data, 1 para barra ou 2 para o hífen.

Este post foi especialmente para o bisonho do Hugo, meu colega noob da faculdade que desde que conheceu o PHP apaixonou e tenta domestica-lo desde então. Só tenta, ok?

Asnos digitais – Sim, eles existem

fevereiro 12th, 2009

A um tempo atrás escrevi um polemico post sobre a conversão de um video. Mas você deve estar se perguntando, aonde que um post sobre conversão de video pode ser polêmico? Sim meu caro, é verdade… eu utilizei uma expressão criada aleatóriamente pelo meu lado negro do cerebro, o asno digital.

Muitas pessoas que procuravam a solução daquele post ficaram enfurecidas e aborrecidas comigo, mas vou tentar me explicar (e não vou retirar o termo de lá).

Asno Digital seria como um ser preguiçoso, que não gosta de ler, aprender e somente gosta de soluções rápidas e corretas, sem saber o real funcionamento da questão. E sinceramente, tem muitos por ai. Encontrei um video que ilustra bem o que estou falando, let’s go:

Se você se sentiu ofendido, mude agora a sua postura, ainda a tempo de evoluir para burro, cavalo ou até mesmo um jegue digital, que pode ser um elogio dependendo do ponto de vista. ;)

Por outro lado, não tenha medo de perguntar. Se você pesquisou, não achou ou ainda tem dúvidas a respeito de algo, pergunte, pios quem não pergunta não tem resposta.

FlogVIP, onde a estrela é você

fevereiro 1st, 2009

Bom, este é a primeira de muitas postagens autopromocionais (sim, juntas, atendendo a nova gramatica), onde falarei basicamente dos meus projetos, atualizações e novidades que surgirão com o tempo. Vamos lá…

FlogVIP - Printscreen

FlogVIP - Tela Inicial

O que é o FlogVIP?

Bem, o FlogVIP é um fotolog, onde se pode postar ilimitadas fotos, comentários e favoritos. Fotolog para quem não sabe é um album de fotos virtuais. No FlogVIP você pode personalizar tudo, desde o seu fundo de tela, como cores, titulo, avatares, etc.

De onde surgiu a ideia de desenvolver?

Em outubro de 2005, estava meio entediado pelo que eu estava vendo em matéria de fotolog na internet, pois os que existiam eram demasiadamente engessados e não ofereciam a personalização que o brasileiro gosta. Sendo assim resolvi me dedicar dois meses nesse projeto. Cai de cabeça, foram varias horas pesquisando e programando, até que no dia 5 de dezembro coloquei a primeira versão no ar, somente com comandos basicos de postar fotos e receber comentários.

Então tem mais de 3 anos de existência, ele esta pronto?

Não, apesar de todo este tempo, eu tenho que me dedicar a projetos paralelos e a minha empresa. Apesar do FlogVIP já ser rentável eu me dedico menos tempo do que ele merecia. Hoje são inúmeros recursos, mas sempre precisamos otimizar (dor de cabeça) e desenvolver novas ferramentas e funções.

Qual é o servidor do FlogVIP?

Hoje ele esta rodando, em um servidor totalmente dedicado a ele, é um Xeon E5430 com quadro processadores de 2.66GHz e cache de 6 mega cada. Com 4 gb de ram e 4 disco rigido de 500 gb. O servidor é o apache com php e mysql, alem do lighttp para servidor de imagens. Mas não pense que este servidor é suficiente, sobrecargas são constantes e preciso sim de um outro, porem ainda não dá ($). Investidores, portais e provedores… estou a disposição para conversar.

Quais os números do FlogVIP?

Ao ler os números abaixo certamente já estarão defasados, mas vamos lá:

+ de 30.334.313 de comentários
+ de 6.716.425 fotos postadas
+ de 228.666 flogvip criados
+ de 85.000 usuários ativos
+ de 15.000 visitas únicas diárias

… ufa.. cansei.. heheheheh…

O que podemos fazer lá?

Além de postar fotos, pode tambem: Colocar músicas e animações em suas imagens, adicionar favoritos, comentar nos outros flogs, adicionar links, alterar as cores, alterar o titulo com imagem, alterar o papel de parede, colocar um cursor do mouse personalizado, participar dos ranking dos mais visitados, promoções e muitas.. mas muitas outros coisas!

Quem já esta por lá?

Veja alguns dos milhares de FlogVIPs:

http://www.flogvip.net/verluci/

http://www.flogvip.net/verluci/

[caption id="attachment_230" align="alignleft" width="274" caption="http://www.flogvip.net/rbd."]http://www.flogvip.net/rbd.[/caption]
http://www.flogvip.net/paulinnhap

http://www.flogvip.net/paulinnhap

[caption id="attachment_228" align="alignleft" width="274" caption="http://www.flogvip.net/ricardo_kaka"]http://www.flogvip.net/ricardo_kaka[/caption]
http://www.flogvip.net/jorgeanamoraisx3

http://www.flogvip.net/jorgeanamoraisx3

[caption id="attachment_226" align="alignleft" width="274" caption="http://www.flogvip.net/fadasepoesias"]http://www.flogvip.net/fadasepoesias[/caption]

Conclui-se que…

… o FlogVIP alem de um album virtual de fotos é um lugar para se divertir e fazer amigos! Venha conhecer, acesse agora www.flogvip.net.

Não existe crise…

janeiro 30th, 2009

… para quem tem sangue nos olhos!

Este é apenas um post rápido e quase que um desabafo. Estava assistindo uns videos da Campus Party e me senti um vitorioso, mesmo não estando presente la. Quanta gente, quanta inovação e quanta maquiagem.

Sim, ano que vem vou a Campus Party, com a blusa do FlogVIP, Zaroio, Brainatwork, Zixter e outros projetos que vão surgir ainda este ano. E para finalizar, um outro sim…

Sim, eu vou mudar o mundo.

Nota: Neste domingo, um super post sobre o FlogVIP, sua historia, trajetoria e destino, aguardem! ;)