Perl e MySQL
Nesse artigo, eu explico como podemos integrar Perl com MySQL, um dos SGBDs mais populares do mundo.
Parte 3: Executando querys / Exibindo o resultado de uma query
Executando querys
Agora, vou ensinar como executar queries (consultas) no MySQL.Talvez, você esteja lendo isso e não saiba o que é uma query (haha), pior ainda, talvez nem saiba o que é MySQL.
Hoje em dia, é comum as pessoas tentarem aprender coisas avançadas, como por exemplo, explorar buffer overflow, tentam aprender isso mas não sabem nem o que é um bit.
Se esse é seu caso, estude um pouco mais antes de continuar lendo o tutorial, se não, vamos continuar. :D
Para executar uma query, primeiramente, iremos fazer a preparação, depois vem a execução, exemplo:
my $cmd = 'create database `mmxm`'; # Query que será executada
my $query = $con->prepare($cmd); # No preparo da query é que você manda o comando SQL!
$query->execute; # Executando a query!
if(not($DBI::errstr)){ # $query->errstr é equivalente a $DBI::errstr. Checando se erros aconteceram
print "Query '$cmd', executada com sucesso !\n";
} else {
print "ERRO: ".$query->errstr;
}
my $query = $con->prepare($cmd); # No preparo da query é que você manda o comando SQL!
$query->execute; # Executando a query!
if(not($DBI::errstr)){ # $query->errstr é equivalente a $DBI::errstr. Checando se erros aconteceram
print "Query '$cmd', executada com sucesso !\n";
} else {
print "ERRO: ".$query->errstr;
}
Execução:
perl query.pl
Query 'create database `mmxm`', executada com sucesso !
Verificando se o dabatase mmxm foi realmente criado:
mysql -u root -ptoor -e 'show databases;'
+--------------------+ | Database | +--------------------+ | information_schema | | mmxm | | mysql | | perl | +--------------------+Obs.: erros podem ocorrer, caso o usuário não tenha permissões necessárias para criar Databases.
Exibindo o resultado de uma query
Já aprendemos como conectar-se ao banco de dados, verificar e identificar erros. Executar queries, a única coisa que falta, para ficarmos "leetados" em Perl e MySQL usando o modulo DBI, é exibir o resultado das queries.Na interface de linha de comando do MySQL, toda consulta que é feita retorna alguma informação, seja select, insert, update, show, create, etc.
Em Perl, para obtermos valores de uma query do tipo select, podemos usar a função "fetchrow_array", exemplo:
#!/usr/bin/perl -w
use strict;
use DBI;
use DBD::mysql;
my $host = 'localhost';
my $user = 'root';
my $password = 'toor';
my $db = 'mmxm';
my $info = "dbi:mysql:$db:$host:3306";
my $con = DBI->connect($info,$user,$password,{ PrintError => 0, RaiseError => 0 }) or die($DBI::errstr);
my $table = qq{ create table if not exists `tutorial` (
`id` int(10) unsigned not null auto_increment,
`mensagem` text COLLATE latin1_general_ci NOT NULL,
PRIMARY KEY (`id`)
);
};
my $query = $con->prepare($table);
$query->execute || die($DBI::errstr);
print "Tabela 'tutorial' criada !\n";
print "Inserindo valores dentro da tabela\n";
print "Digite alguma coisa: ";
chomp(my $value = <>);
my $insert = qq{ insert into `tutorial` values(NULL,"$value"); };
$query = $con->prepare($insert);
$query->execute || die($DBI::errstr);
print "Valor $value inserido na tabela 'tutorial' com sucesso !\n";
print "Obtendo valores inseridos na tabela ...\n\n";
sleep(1.3);
my @row;
my $select = "select * from tutorial";
$query = $con->prepare($select);
$query->execute || die($DBI::errstr);
while (@row = $query->fetchrow_array){
print "@row\n";
}
use strict;
use DBI;
use DBD::mysql;
my $host = 'localhost';
my $user = 'root';
my $password = 'toor';
my $db = 'mmxm';
my $info = "dbi:mysql:$db:$host:3306";
my $con = DBI->connect($info,$user,$password,{ PrintError => 0, RaiseError => 0 }) or die($DBI::errstr);
my $table = qq{ create table if not exists `tutorial` (
`id` int(10) unsigned not null auto_increment,
`mensagem` text COLLATE latin1_general_ci NOT NULL,
PRIMARY KEY (`id`)
);
};
my $query = $con->prepare($table);
$query->execute || die($DBI::errstr);
print "Tabela 'tutorial' criada !\n";
print "Inserindo valores dentro da tabela\n";
print "Digite alguma coisa: ";
chomp(my $value = <>);
my $insert = qq{ insert into `tutorial` values(NULL,"$value"); };
$query = $con->prepare($insert);
$query->execute || die($DBI::errstr);
print "Valor $value inserido na tabela 'tutorial' com sucesso !\n";
print "Obtendo valores inseridos na tabela ...\n\n";
sleep(1.3);
my @row;
my $select = "select * from tutorial";
$query = $con->prepare($select);
$query->execute || die($DBI::errstr);
while (@row = $query->fetchrow_array){
print "@row\n";
}
Executando:
perl mysql.pl
Tabela 'tutorial' criada ! Inserindo valores dentro da tabela Digite alguma coisa: Perl is awesome valor Perl is awesome inserido na tabela 'tutorial' com sucesso ! Obtendo valores inseridos na tabela ... 1 Perl is awesomeO valor "Perl is awesome", foi inserido com sucesso na coluna mensagem, o número 1 é o ID da mensagem. Outra forma de obter dados usando select, é com a função "bind_columns", essa função vincula (bind) colunas da tabela para variáveis. No caso, você precisa conhecer bem a estrutura da tabela, para poder retirar da consulta os valores que você quer.
Para saber a estrutura de uma coluna, você pode usar a query:
mysql> show columns from <tabela>
Aí, é só você usar a criatividade, pegar os nomes das colunas e cria um array que irá receber os valores, ou então, um hash (por exemplo).
Exemplo usando variáveis:
#!/usr/bin/perl -w
use strict;
use DBI;
use DBD::mysql;
my $host = 'localhost';
my $user = 'root';
my $password = 'toor';
my $db = 'mmxm';
my $info = "dbi:mysql:$db:$host:3306";
my $con = DBI->connect($info,$user,$password,{ PrintError => 0, RaiseError => 0 }) or die($DBI::errstr);
my $cmd = 'select * from tutorial';
my $query = $con->prepare($cmd);
$query->execute || die($DBI::errstr);
my($id,$mensagem);
$query->bind_columns(\$id, \$mensagem);
while($query->fetch()) {
print "ID: $id, Mensagem: $mensagem\n";
}
use strict;
use DBI;
use DBD::mysql;
my $host = 'localhost';
my $user = 'root';
my $password = 'toor';
my $db = 'mmxm';
my $info = "dbi:mysql:$db:$host:3306";
my $con = DBI->connect($info,$user,$password,{ PrintError => 0, RaiseError => 0 }) or die($DBI::errstr);
my $cmd = 'select * from tutorial';
my $query = $con->prepare($cmd);
$query->execute || die($DBI::errstr);
my($id,$mensagem);
$query->bind_columns(\$id, \$mensagem);
while($query->fetch()) {
print "ID: $id, Mensagem: $mensagem\n";
}
Execução:
perl select.pl
- ID: 1, Mensagem: Perl is awesome
- ID: 2, Mensagem: mmxm was here
Você tem alguma dica de material para quem está começando em perl ? Eu so meio fraquinho em programação mas tenho como base shell script que foi aonde me aprofundei mais :/