Usando MySQL na linguagem C

Este é um artigo que visa demostrar como podemos usar a linguagem C para realizar as ações básicas em um banco de dados MySQL. As ações básicas num banco de dados são: inserção, remoção, alteração e consulta de dados.

[ Hits: 270.392 ]

Por: Ricardo Rodrigues Lucca em 07/08/2003 | Blog: http://aventurasdeumdevop.blogspot.com.br/


Iniciando na programação



Vamos começar pelo começo. Para isso precisamos ensinar como inicializar a variável de conexão e depois como conectar. No header mysql.h temos algumas funções interessantes:
  • MYSQL * mysql_init(MYSQL *mysql);
  • MYSQL * mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd);
  • MYSQL * mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int clientflag);
  • void mysql_close(MYSQL *sock);
Agora, vamos analisar o que elas fazem. Na primeira função (mysql_init) temos um tipo chamado MYSQL, esse tipo traz muitos dados referentes ao que se está fazendo e seria muito baixo nível se tivéssemos que setar eles manualmente, para isso temos funções que fazem esse serviço por nós e fazem com que não nos preocupamos com esses detalhes.

A função mysql_init inicializa uma variável do tipo MYSQL para ser usada.
Exemplo de uso:

mysql_init(&conexao);

Agora, as outras duas (*connect) tem funções parecidas, ambas servem para conectar num banco de dados, mas a mysql_real_connect serve para conectar num banco de dados e já escolher qual banco de dados queremos usar. Isto é, o uso da função mysql_select_db virá desnecessário, por isso usarei essa função nos exemplos. Um exemplo de uso seria:

mysql_real_connect(&conexao, "localhost", "guest", "guest", "teste", 0, NULL, 0);

NOTA: Repare nos três últimos parâmetros, vendo os dados da função um pouco mais pra cima vamos descobrir que eles são referentes à porta usada, socket e flags do client. O uso desses parâmetros faz com que seja "automático", ou seja, o sistema operacional escolhe a melhor porta e o soquete que melhor se adapter.,

NOTA2: Quanto ao host, informamos "localhost" apenas para deixar mais claro que estamos falando com a máquina em que estamos. Se quiséssemos usar NULL daria no mesmo.

A última função é o que faz o fechamento de uma conexão. O MySQL sabe qual conexão fechar, pois nós passamos como parâmetro e a variável que guarda esses dados.

Programa exemplo:

#include <stdio.h>
#include <mysql/mysql.h>

void main(void)
{
   MYSQL conexao;

   mysql_init(&conexao);
   mysql_real_connect(&conexao, "localhost", "guest", "guest", "teste", 0, NULL, 0);
   printf("conectado com sucesso!\n");
   mysql_close(&conexao);
}

Um exemplo agora realizando testes para ver se realmente conectou!

#include <stdio.h>
#include <mysql/mysql.h>

void main(void)
{
      MYSQL conexao;

      mysql_init(&conexao);
      if ( mysql_real_connect(&conexao, "localhost", "guest", "guest", "teste", 0, NULL, 0) )
      {
            printf("conectado com sucesso!\n");
            mysql_close(&conexao);
       }
       else
       {
            printf("Falha de conexao\n");
            printf("Erro %d : %s\n", mysql_errno(&conexao), mysql_error(&conexao));
       }
}

Vamos falar sobre as duas funções novas:
  • unsigned int mysql_errno(MYSQL *mysql);
  • char * mysql_error(MYSQL *mysql);
A primeira retorna um número inteiro não sinalizado, isto é, retorna o código do erro que aconteceu.

Já a segunda retorna o erro por "extenso". Altere a senha do usuário para uma não válida para ter uma idéia do que ocorre.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Iniciando na programação
   3. Inserção
   4. Consulta
   5. Remoção e alteração
   6. Erro de compilação
Outros artigos deste autor

Linux no Rio Grande do Sul

Introdução à linguagem C - Parte III

Uma pequena análise do Gentoo Linux

Introdução as Bibliotecas do C/C++

Conceitos sobre o X-Window

Leitura recomendada

Ensaio acerca de bibliotecas de código aberto para abstração de acesso a banco de dados em linguagem C++

Embutindo um banco de dados SQLite em sua aplicação C++

Acessando PostgreSQL com C

Acessando PostgreSQL com C - Cursores

PostgreSQL - Embutindo comandos SQL no seu código C

  
Comentários
[1] Comentário enviado por repolho em 08/08/2003 - 16:16h

SHOW de bola esse tutorial era exatamente isto que estava procurando para a minha NetAgenda ;) aUHauHAU
valeus

[2] Comentário enviado por jllucca em 09/08/2003 - 02:39h

blz... vou postar os scripts em separado...

[3] Comentário enviado por ic3hawk em 29/10/2003 - 17:24h

Cara, eu não achei o mysql.h!!!!!!

[4] Comentário enviado por jllucca em 30/10/2003 - 00:05h

Tipo, talvez você precise instalar algum pacote pra ter a biblioteca.

Mas, tenho nem ideia de qual possa ser. Se outra pessoa souber e quiser ajudar... fico grato!

[5] Comentário enviado por zorro em 25/11/2003 - 21:02h

E so voce instalar o mysql-devel

apt-get install MySQL-devel

[6] Comentário enviado por jllucca em 26/11/2003 - 11:20h

Valeu pela contribuição, zorro! :)

Eu realmente não sabia o nome do pacote...

[7] Comentário enviado por jllucca em 30/08/2004 - 13:43h

Apenas pra completar, ao invés de utilizar um falor predefinido ali e sempre constante nas querys podemos criar um ponteiro para char e usar ele para montar uma query usando variaveis do proprio programa.

Ex.:
char* query;
char* tabela = "aprender";
char *nome = "Ricardo Lucca";

sprintf(query, "SELECT * from %s where nome = '%s';", tabela, nome);

É isso, ai!

Qualquer duvidas podem mandar email ainda!

[]'s

[8] Comentário enviado por androle em 23/09/2004 - 18:34h

Cara, muito bom!
Faz muito tempo que procuro algo como esse seu artigo. Meus parabéns!

Só para colaborar, no debian precisei instalar o libmysqlclient-dev para ter o mysql.h

Valeu!

[9] Comentário enviado por pbetos em 16/11/2004 - 21:53h

Muito bom.

[10] Comentário enviado por danilolobato em 05/01/2005 - 09:51h

Valeu cara, faz tempo que eu procurava um tutorial assim, ALGUÉM PODERIA DE INDICAR UM SITE MAIS ESPECÍFICO SOBRE O ASSUNTO?

[11] Comentário enviado por jllucca em 05/01/2005 - 19:44h

Site que explique conheço um que explica a mesma coisa so q em ingles. Livro tem um chamado Linux Professional muito bom, não só pra esse assunto como para outros...

[12] Comentário enviado por Biudi em 10/01/2005 - 11:51h

Muito bom esse seu artigo! Me ajudou bastante...estou iniciando com Linux(Conectiva 10) e tô com problemas no MySQL, encontro o seguinte erro:"checking for mysql_init in -lmysqlclient...no", tô sem saber onde encontrar esse pacote,alguém poderia por favor me ajudar?

[13] Comentário enviado por fabiocosta em 25/01/2005 - 12:16h

ae galera, achei muito interessante este artigo, mas fiquei com uma dúvida que ao longo do texto não consegui tirar. Como executar um código-fonte desses de conexão com mysql se eu ao menos vi uma biblioteca para isso, que no caso seria "<stdio.h>" e "<mysql/mysql.h>", enfim, gostaria de saber como faria pra acessar o mysql, como faria para possuir as bibliotecas.

[14] Comentário enviado por hartax em 18/04/2006 - 22:18h

Outra duvida, estou comecando agora a programar em C, pra adicionar os dados oriundos de uma variavel? como eh que faz?

[15] Comentário enviado por removido em 20/06/2006 - 12:08h

eu baixei o MySQL e tentei instalar no meu laptop, mas não consegui por causa de um bloqueio da Fontes de dados (ODBC). Como faço prá resolver isso ? E caso eu use o SQL Professional Edition, dá prá criar o mesmo programa nele? Qual modificação eu preciso fazer?
Valeu!!

Álvaro- Eng. de Redes de Celular

[16] Comentário enviado por marrento em 26/07/2006 - 22:13h

@hartax:
"pra adicionar os dados oriundos de uma variavel? como eh que faz?"

vc vai montar a string de sua query, assim:

char nome[ 80 ];
char sexo;
char sql[ 1000 ];

sprintf( sql, "insert into tabela (nome, sexo) values ('%s', '%c')", nome, sexo );

e por aí vai...

[17] Comentário enviado por hartax em 02/08/2006 - 00:55h

um amigo meu resolveu o meu prob com as variaveis hj ai entro aqui pra ver se alguem tinha respondido e o marrento me manda o que esse meu amigo me mandou hahaha valeuz marrento!

[18] Comentário enviado por thiagou319 em 19/09/2006 - 15:32h

compila certo!!!

fiquei maior tempo para descubrir!!!


gcc -o test progrma.c -lmysqlclient

./test

e pronto

[19] Comentário enviado por lufagovi em 02/12/2006 - 03:48h

eu tentei compilar varias vezes, mas só me da os seguintes erros...
C:\MinGW\include\mysql\mysql_com.h:175: error: `SOCKET' does not name a type
C:\MinGW\include\mysql\mysql_com.h:339: error: `SOCKET' was not declared in this scope
C:\MinGW\include\mysql\mysql_com.h:339: error: expected primary-expression before "const"
C:\MinGW\include\mysql\mysql_com.h:339: error: expected primary-expression before "unsigned"
C:\MinGW\include\mysql\mysql_com.h:340: error: expected primary-expression before "unsigned"
C:\MinGW\include\mysql\mysql_com.h:340: error: initializer expression list treated as compound expression
:: === Build finished: 6 errors, 0 warnings ===
Será que alguem pode me ajudar?

[20] Comentário enviado por lufagovi em 02/12/2006 - 04:57h

ops já achei... tinha que declara a windows.h ¬ ¬' antes que tudo

[21] Comentário enviado por laurosalmito em 21/12/2006 - 11:07h

Como faço para guardar os dados do mysql em um vetor no C?

Por exemplo:
Existindo a variavel idades[n] com todas as idades que tem no banco?

[22] Comentário enviado por clarkmili em 09/07/2007 - 15:36h

Excelente, este post foi mesmo muuuuuuuuito útil... estava a procura na net, mas os exemplos não são tão bem explicados como esse. Thanks

[23] Comentário enviado por cold_feelings em 21/08/2007 - 17:20h

Vlwwwwwwwwwwwwww, muuuuito bom esse tutorial, isso vai para minha monografia com as devidas referências ... vlw

[24] Comentário enviado por f_Candido em 12/09/2007 - 17:28h

Muito Bom este tutorial.
Parabéns
Abraços

[25] Comentário enviado por netmorais em 18/06/2008 - 13:48h

Ricardo

Sou novato em MySql. Li o seu artigo achei muito bom. Testei nu Linux e correu tudo bem. Resolvi fazer um teste análogo no Windows utilizando um de seus exemplos e estou encontrando problemas. Veja a seguir:

LINUX

$ cat teste.c
#include <stdio.h>
#include <mysql/mysql.h>

main(void)
{
MYSQL conexao;

mysql_init(&conexao);
mysql_real_connect(&conexao, "localhost", "guest", "guest", "teste", 0, NULL, 0);
printf("conectado com sucesso!\n");
mysql_close(&conexao);
}

$ gcc teste.c -l mysqlclient ; mv a.out teste.exe

$ teste.exe
conectado com sucesso!


WINDOWS

com Gcc do MinGW, MySQL 5.0 e a pasta .../mysql/* em /mingw/include/mysql ocorrem os seguintes erros durante a complilação:

$ gcc teste.c -l mysqlclient

In file included from /mingw/include/mysql/mysql.h:72, from teste.c:2:
/mingw/include/mysql/mysql_com.h:183: parse error before "SOCKET"
/mingw/include/mysql/mysql_com.h:222: parse error before '}' token
/mingw/include/mysql/mysql_com.h:335: parse error before '*' token
/mingw/include/mysql/mysql_com.h:336: parse error before '*' token
/mingw/include/mysql/mysql_com.h:337: parse error before '*' token
/mingw/include/mysql/mysql_com.h:338: parse error before '*' token
/mingw/include/mysql/mysql_com.h:339: parse error before '*' token
/mingw/include/mysql/mysql_com.h:340: parse error before '*' token
.....

Você tem alguma dica para o problema?

Grato.
Sérgio.
netmorais@ig.com.br

[26] Comentário enviado por netmorais em 18/06/2008 - 16:26h

Ricardo
Já diminuiu os erros. Usei o include sugerido "windows.h" mas continua aparecendo:
\mingw\lib\gcc-lib\mingw32\3.2.3\..\..\..\..\mingw32\bin\ld.exe: cannot find -lmysqlclient
Usei a opção -L .../MySQL/.../lib/opt, copiei o .../MySQL/.../lib/opt para mas não funciona.
Sérgio.
netmorais@ig.com.br

[27] Comentário enviado por wgaprendiz em 12/10/2008 - 23:12h

Ola Ricardo
Muito bom seu artigo.

Bom estou com alguns problemas para executar os exemplos.

Utilizo a versão 4.9.9.2 do Dev c/c++ no win XP Pro.
Ja baixei a bilbioteca mysql.h

Ao tentar compilar os exemplos , aparecem as seguintes mensagens de erro no dev:

[Linker error] undefined reference to 'WinMain@16'
Id returned 1 exit status
C:\Dev-Cpp\Makefile.win [Build Error] [project2.exe] Error 1

Como sou novato em C não sei decifrar esses erros , mas acho que o problema possa estar na biblioteca mysql.h, pois eu baixei a primeira que encontrei e nao sei se é a mais adequada.


Alguem pode me ajudar a solucionar o problema.!?

Desde ja agradeço pela atenção.

walaceg@gmail.com

[28] Comentário enviado por abekawa em 01/04/2009 - 21:43h

Olá Pessoal,

No linux a biblioteca libmysql pode ser instalada baixando o pacote libmysql++-dev .
Distribuições baseadas em debiam podem usar o seguinte comando.
#sudo apt-get install libmysql++-dev

Tambem deverá ser feito algumas alterações no código:

declarem a main como int, como nosso amigo lá em cima já citou.

#include <stdio.h>
#include <mysql/mysql.h>

int main(void)
{
MYSQL conexao;

mysql_init(&conexao);
if ( mysql_real_connect(&conexao, "localhost", "root", "123mudar", "agenda", 0, NULL, 0) )
{
printf("conectado com sucesso!\n");
mysql_close(&conexao);
}
else
{
printf("Falha de conexao\n");
printf("Erro %d : %s\n", mysql_errno(&conexao), mysql_error(&conexao));
}
}

[29] Comentário enviado por abekawa em 02/04/2009 - 00:00h

PERGUNTA, como inserir o valor de uma variavel qualquer no insert into.... mais ou menos isso

#include <stdio.h>
#include <mysql/mysql.h>

int main(void)
{
MYSQL conexao;
int res;
char nome[50], telefone[10];

scanf("%s", &nome);
scanf("%s", &telefone);



mysql_init(&conexao);
if ( mysql_real_connect(&conexao, "localhost", "root", "123mudar", "agenda", 0, NULL, 0) )
{
printf("conectado com sucesso!\n");


res = mysql_query(&conexao,"INSERT INTO cadastro(nome, telefone) values (" + nome + "," + telefone + ");");


if (!res) printf("Registros inseridos %d\n", mysql_affected_rows(&conexao));
else printf("Erro na inserção %d : %s\n", mysql_errno(&conexao), mysql_error(&conexao));

mysql_close(&conexao);
}
else
{
printf("Falha de conexao\n");
printf("Erro %d : %s\n", mysql_errno(&conexao), mysql_error(&conexao));
}
}

[30] Comentário enviado por netmorais em 17/06/2009 - 10:47h

Ricardo
Usei o modelo do seu artigo para construir um executavel tanto no Linux, como no Windows (.exe, infelizmente preciso) para estabelecer a conexão a baixo custo de outras linguagens com o Mysql e funciona muito bem. A biblioteca que uso na compilação com o gcc é a libmysqlclient.a que vem junto com a distribuição do Mysql.
Atualmente, no caso do Windows, estou tentando melhorar a performance da interface criando uma Dll. Para isso transformei o programa em C em um conjunto de "funções" para conexão, execução de sqls e desconexão com banco. Aplicação que "chama" as funções é pre-compilada em um .obj, assim como as "funções" que acessam o banco com "gcc -c funcoes.c -o funcoes.obj". (não posso "linkar" o Mysql nesse momento). Após isso executo o Link (da MS) "link ... -d aplicacao.obj funcoes.obj libmysqlclient.a" que cria a Dll e naõ aponta nenhum erro. Porém na execução aborta logo no "mysql_init".
A biblioteca "libmysqlcliente.a" utilizada não é apropriada para este caso? Existe "mysqlclient.obj"?
Grato
Sérgio.

[31] Comentário enviado por fmj1988 em 31/10/2009 - 18:43h


Felipe
estou tentando inserir aki mas estou com duvidas.

como eu faço pra inserir dinamicamente.
ex
int i=0;
char b[][]={"rebeca","precila","barbara"};
for (i=0;i<3;i++){

mysql_query(&con,"insert into aprendendo(nome) values ('%s');",b[][i]);
}

como eu faria isso???

agradeço desde já

[32] Comentário enviado por walquiriosaraiva em 20/11/2009 - 06:54h

Bom dia pessoal!!

Estou com um problema em C, não consigo encontrar a biblioteca para conexão com banco de dados. Não sei onde baixar, já tentei encontrar mais as que achei não funciona quando eu tento compilar o programa ele dá um erro e pelo que percebi deve ser na biblioteca.

#include <stdio.h>
#include <mysql/mysql.h>
#include <conio.h>

void main(void)
{
MYSQL conexao;

mysql_init(&conexao);
mysql_real_connect(&conexao, "localhost", "root", "root", "teste", 0, NULL, 0);
printf("conectado com sucesso!\n");
mysql_close(&conexao);
}

Se puder me enviar um email é melhor...
walquiriosaraiva@gmail.com

Att,
Walquirio Saraiva Rocha

[33] Comentário enviado por Raios em 16/04/2010 - 15:56h

Olá pessoal bem a conexão foi realizada com sucesso só que na hora de eu transformar isso tudo para DLL, gera um erro na conexão, bem esse é meu código porém não consigo criar uma DLL com banco. Gostaria que me ajudasse.


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <mysql/mysql.h>
#include <string.h>

int main(void)
{
MYSQL conexao;
MYSQL_RES *resp;
MYSQL_ROW linhas;
MYSQL_FIELD *campos;
char query[]="SELECT * FROM cliente;";
int conta; //Contador comum

mysql_init(&conexao);
if (mysql_real_connect(&conexao,"localhost","user","user","dados",0,NULL,0))
{
printf("Conectado com Sucesso!\n");
if (mysql_query(&conexao,query))
printf("Erro: %s\n",mysql_error(&conexao));
else
{
resp = mysql_store_result(&conexao);//recebe a consulta
if (resp) //se houver consulta
{
//passa os dados dos campos para a vari·vel campos
//escreve na tela os nomes dos campos dando
//um tab somente
campos = mysql_fetch_fields(resp);
for (conta=0;conta<mysql_num_fields(resp);conta++) {
printf("%s",(campos[conta]).name);
if (mysql_num_fields(resp)>1)
printf("\t");
}

printf("\n");

//enquanto retonrnar registros, conta atÈ o
//n˙mero de colunas que a tabela tem e escreve na
//tela com um tab, depois pula a linha e tenta
//pegar outro registro
while ((linhas=mysql_fetch_row(resp)) != NULL)
{
for (conta=0;conta<mysql_num_fields(resp);conta++)
printf("%s\t",linhas[conta]);
printf("\n");
}
}
mysql_free_result(resp);//limpa a vari·vel do resultado: resp
}
mysql_close(&conexao);
}
else
{
printf("Conexao Falhou\n");
if (mysql_errno(&conexao))
printf("Erro %d : %s\n", mysql_errno(&conexao), mysql_error(&conexao));
}
system("pause");
return 0;
}

[34] Comentário enviado por wcoutinho em 22/04/2010 - 01:56h

muito bom o post.

eu to com uma serie de problemas na compilacao.

gcc mysql-connect.c -lmysqlclient

mysql-connect.c:2:24: error: mysql/mysql.h: No such file or directory
mysql-connect.c: In function ‘main’:
mysql-connect.c:11: error: ‘MYSQL’ undeclared (first use in this function)
mysql-connect.c:11: error: (Each undeclared identifier is reported only once
mysql-connect.c:11: error: for each function it appears in.)
mysql-connect.c:11: error: expected ‘;’ before ‘conexao’
mysql-connect.c:12: error: ‘MYSQL_RES’ undeclared (first use in this function)
mysql-connect.c:12: error: ‘resp’ undeclared (first use in this function)
mysql-connect.c:13: error: ‘MYSQL_ROW’ undeclared (first use in this function)
mysql-connect.c:13: error: expected ‘;’ before ‘linhas’
mysql-connect.c:14: error: ‘MYSQL_FIELD’ undeclared (first use in this function)
mysql-connect.c:14: error: ‘campos’ undeclared (first use in this function)
mysql-connect.c:18: error: ‘conexao’ undeclared (first use in this function)
mysql-connect.c:23: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’
mysql-connect.c:45: error: ‘linhas’ undeclared (first use in this function)
mysql-connect.c:60: warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘int’


alguem pode me ajudar?


[35] Comentário enviado por icekill em 03/06/2010 - 01:42h

Seu problema na compilação é que faltam as bibliotecas ou o mysql-devel não encontra-se instalado.

Recomendo compilar usando a seguinte sintaxe:
gcc `mysql_config --cflags --include --libs` teste-mysql.c -o teste-mysql.c

[36] Comentário enviado por williandiniz em 03/07/2010 - 16:00h

resposta ao [7] Comentário enviado por jllucca em 30/08/2004 - 13:43h:
Complementado:
int res;
int data=999;
int lat=1000;
char* query[100];
sprintf(query,"INSERT INTO dados_teste (ID,lati) values ('%d','%d');",data,lat);
.
.
.
res = mysql_query(&conexao,query);

dados_teste = nome da tabela
ID e lati são os campos da tabela
data e lat são as variaveis.

[37] Comentário enviado por graantonucci em 18/10/2010 - 00:33h

Estou fazendo a conexao mysql em C++

como faço para o insert aceitar as variaveis char dt_dia_trabalhado e hr_entrada?

//sock
int res;
MYSQL *sock;
sock = mysql_init(0);

if (sock) cout << "sock handle ok!" << endl;
else {
cout << "sock handle failed!" << mysql_error(sock) << endl;
}

//connection
if (mysql_real_connect(sock, host, user, pass, db, 0, NULL, 0)) {
cout << "connection ok!" << endl;
res = mysql_query(sock,"INSERT INTO cadastro_horas(dt_dia_trabalhado, hr_entrada ) values (dt_dia_trabalhado, hr_entrada );");

Coloquei assim, mas insere como Null. oq eu faço?

[38] Comentário enviado por d4nd em 12/06/2012 - 19:00h

Muito bom o tutorial!
Recebi os erros por falta de inclusão do mysql na hora de compilar o projeto, mas olhei no fim do tutorial e consegui.
Grato.

[39] Comentário enviado por Kinzel em 21/08/2012 - 23:55h

Muito bom o tutorial. Parabéns.

[40] Comentário enviado por Dean_Winchester em 03/11/2013 - 01:28h

como instalar a biblioteca mysql?

[41] Comentário enviado por jairjunior em 29/08/2014 - 16:13h

Engraçado no debian para conseguir rodar algum aplicativo usando a mysql.h só consegui após ter configurado o conector tudo direitinho e tal estava tentando usar a linha de comando:

# gcc teste-mysql -lmysql -o testemysql.exe

e não estava funcionando troquei pela:
# gcc `mysql_config --cflags --include --libs` teste-mysql.c -o teste-mysql.exe
funcionou beleza.

Ja no Windows 7 é justamente o contrario só funciona com o comando:

# gcc teste-mysql -lmysql -o testemysql.exe


E outra coisa só funcionou após eu mudar o #include
que estava #include<mysql/mysql.h> como nos exemplos deste site troquei por
#include<mysql.h>


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts