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: 271.384 ]

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


Consulta



Para desenvolver um programa de consulta num banco de dados MySQL iremos introduzir mais quatro funções:
  • unsigned int mysql_num_fields(MYSQL_RES *res);
  • MYSQL_FIELD * mysql_fetch_fields(MYSQL_RES *res);
  • MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
  • void mysql_free_result(MYSQL_RES *result);
Vamos começar falando da primeira função, ela serve para sabermos quantos campos existem na tabela em que foi feita a "query". A estrutura que ela recebe como parâmetro é a retornada por mysql_store_result.

A função seguinte (mysql_fetch_fields) tem como retorno uma estrutura que é um array. Essa estrutura possui alguns dados muito úteis, como o nome da coluna.

A mysql_fetch_row retorna os registros encontrados e como cada registro tem várias colunas o valor char que é retornado é um vetor sendo que cada "posição" corresponde a uma coluna da tabela.

Por fim, a que resta ser explicada (mysql_free_result) serve para limpar a variável de resultado retornado por mysql_store_result.

Vejamos, um exemplo para consultar com as funções citadas.

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

#define HOST "localhost"
#define USER "guest"
#define PASS "guest"
#define DB "teste"

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

   mysql_init(&conexao);
   if (mysql_real_connect(&conexao,HOST,USER,PASS,DB,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));
   }

   return 0;
}

Nesse programa podemos ver um exemplo que considero básico de consulta. Nele também temos macros para facilitar mudar, por exemplo, o servidor de conexão do MySQL. Execute o programa e você deverá ver algo como:

$ ./a.out
Conectado com Sucesso!
ID      nome    sexo
1       Ricardo Rodrigues Lucca M

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

VIM avançado (parte 2)

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

Apreendendo a utilizar o GNU Debugger (parte 2)

Como recuperar a senha o root

Utilizando a função QSort em C

Leitura recomendada

Acessando PostgreSQL com C

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

PostgreSQL - Embutindo comandos SQL no seu código C

Acessando PostgreSQL com C - Cursores

Embutindo um banco de dados SQLite em sua aplicação 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