elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Base de Datos con MySQL desde C !Excelente!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Base de Datos con MySQL desde C !Excelente!  (Leído 9,351 veces)
Fire544

Desconectado Desconectado

Mensajes: 85


"Escucha el sonido del 0, 1"


Ver Perfil WWW
Base de Datos con MySQL desde C !Excelente!
« en: 10 Julio 2012, 20:56 »

Hola a todos !!!  :xD Expongo el thread para algunos que se preguntan si existiria alguna API para el trabajo de BD en C del estandar ANSI.

Comento todo el codigo para una mejor comprension del lector. El compilador utilizado es Dev-c++.

Con la inclusion de la lib windows.h ya pierde portablidad, pero la incluyo porque MySQL.h hace llamadas a sockets o sea winSock.h para poder establecer conexiones externas (ambiente Inet Global) y locales, la ventaja es que MySQL.h tambien esta para sistemas codigo abierto como Linux y Unix, pero en vez de windows.h habria que incluir otras librerias.

Nota: Algunas funciones no las comento, porque casi hacen las mismas llamadas y creo que entenderian el por que, pero si tienen alguna duda no olviden postear y claro cirtiquen el codigo falta optimizacion, aa se me olvido hacer la estrcutura de mi codigo con retornos para mayor optimizacion pero bueno algo es algo xD.

Salvedad: Doy por savido que los que lean este post es porque tienen conocimientos basicos de C y conocen bien los punteros a punteros y han trabajado con MySQL.

Antes de leer el codigo vean esto: (MYSQL_RES  *) es un identificador o variable que puede contener filas de un determinado campo en nuestra BD para poder luego consultar este. (MYSQL_ROW) es tipo puntero a puntero aunque no se haga uso de * pero si vemos como consultamos sus datos nos daremos cuenta, este acepta valores o elementos que se encuentran en "MYSQL_RES *" o sea lo que recojimos con "MYSQL_RES *" esta variable los puede manejar sin problemas. (MYSQL *) este acepta elementos o valores de un retorno a una variable del mismo tipo para luego enviar y recibir datos, o sea es quien nos envia, devuelve, conecta y desconecta del servidor MySQL.


Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <mysql/mysql.h>
  4.  
  5. //prototipos de funciones
  6.  
  7. void mostrar(MYSQL *con, MYSQL_ROW row, MYSQL_RES *resultado, char *consulta);
  8. void insertar(MYSQL *con, char *nombre, int id);
  9. void borrar(MYSQL *con, MYSQL_RES *res, MYSQL_ROW row, int id);
  10. void update(MYSQL *con);
  11. void buscar(MYSQL *con, MYSQL_RES *res, MYSQL_ROW row, int id);
  12.  
  13. //cuerpo de funciones
  14.  
  15. void mostrar(MYSQL *con, MYSQL_ROW row, MYSQL_RES *resultado, char *consulta)
  16. {
  17.    //concatena las constantes a la variable consulta
  18.    sprintf(consulta, "select * from amigo;");
  19.    //hacemos consulta y verificamos que se cumple
  20.    if((mysql_query(con, consulta)==0))
  21.    {
  22.                         //guardamos resultado en la variable resultado que es de tipo MYSQL_RES *
  23.                         resultado=mysql_use_result(con);
  24.  
  25.                         printf("Usuario    ID\n\n");
  26.                         //leemos los datos almacenados en resultadoy lo devolvemos a la variable row que es de tipo MYSQL_ROW
  27.                         while(row=mysql_fetch_row(resultado))
  28.                         {
  29.                                                              printf("%s---%s\n", row[0], row[1]);
  30.                                                              }
  31.                         }
  32.                         //preguntamos si se ha llegado al final de nuestra variable resultado
  33.                         if(!mysql_eof(resultado))
  34.                         {
  35.                                            printf("Error de lectura %s\n", mysql_error(con));
  36.                                            }
  37.                                            //cerramos conexion ya establecida
  38.                                            //mysql_close(con);
  39.  
  40.                                            fflush(stdin);
  41.                                            getchar();
  42.  
  43.                                            system("cls");
  44.  
  45.     }
  46.  
  47. void insertar(MYSQL *con, char *nombre, int id)
  48. {
  49.     char consulta[50];
  50.  
  51.     sprintf(consulta, "INSERT INTO amigo VALUES('%s', '%i');", nombre, id);
  52.  
  53.     if((mysql_query(con, consulta)==0))
  54.     {
  55.                          printf("Se agrego la nueva persona a la BD\n");
  56.                          fflush(stdin);
  57.                          getchar();
  58.                          }
  59.                          else
  60.                          {
  61.                              printf("Error no se pudo crear la nueva persona %s \n", mysql_error(con));
  62.                              }
  63.     system("cls");
  64.     }
  65.  
  66. void borrar(MYSQL *con, MYSQL_RES *resultado, MYSQL_ROW row, int id)
  67. {
  68.     char consulta[50];
  69.  
  70.     sprintf(consulta, "DELETE FROM amigo WHERE id='%i';", id);
  71.  
  72.     if(mysql_query(con, consulta)==0)
  73.     {
  74.  
  75.                      printf("Se elimino persona correctamente de la BD\n");
  76.                      fflush(stdin);
  77.                      getchar();
  78.                      }
  79.  
  80.     system("cls");
  81.     }
  82.  
  83. void update(MYSQL *con)
  84. {
  85.     char nombre[10], consulta[50];
  86.     int op, id;
  87.  
  88.     printf("Que deseas modificar\n\n1:Nombre\n2:id\nOpcion: ");
  89.     scanf("%i", &op);
  90.  
  91.     if(op==1)
  92.     {
  93.              printf("Inserta el ID de la persona a eliminar: ");
  94.              scanf("%i", &id);
  95.              printf("Inserte Nuevo Nombre: ");
  96.              fflush(stdin);
  97.              gets(nombre);
  98.              printf("\n");
  99.              sprintf(consulta, "UPDATE amigo SET nombre='%s' WHERE id='%d';", nombre, id);
  100.              }
  101.     else
  102.     {
  103.         printf("Inserte Nombre de la persona a elimininar: ");
  104.         fflush(stdin);
  105.         gets(nombre);
  106.         printf("Inserte nuevo ID ");
  107.         scanf("%i", &id);
  108.         sprintf(consulta, "UPDATE amigo SET id='%i' WHERE nombre='%s';", id, nombre);
  109.         }
  110.  
  111.     if(mysql_query(con, consulta)==0)
  112.     {
  113.                          printf("Se guardaron los datos correctamente");
  114.                          getchar();
  115.                          system("cls");
  116.                          }
  117.     }
  118.  
  119. void buscar(MYSQL *con, MYSQL_RES *res, MYSQL_ROW row, int id)
  120. {
  121.  
  122.     char consulta[50];
  123.  
  124.     sprintf(consulta, "SELECT nombre, id FROM amigo WHERE id='%i';", id);
  125.  
  126.     if(mysql_query(con, consulta)==0)
  127.     {
  128.                         printf("Los datos se buscaron correctamente\n\n");
  129.                         fflush(stdin);
  130.  
  131.                         res=mysql_use_result(con);
  132.  
  133.                         printf("Nombre      ID User\n\n");
  134.  
  135.                         while(row=mysql_fetch_row(res))
  136.                         {
  137.                                                        printf("%s      %s", row[0], row[1]);
  138.                                                        }
  139.                         }
  140.  
  141.                         getchar();
  142.                         system("cls");
  143.     }
  144.  
  145. int main()
  146. {
  147.    MYSQL *con;
  148.    MYSQL_RES *resultado;
  149.    MYSQL_ROW row;
  150.    char consulta[1024], nombre[25];
  151.    int id;
  152.    int op;
  153.    //inicializamos conexion SQL a algun atributo en este caso NULL.
  154.    con = mysql_init(NULL);
  155.    //establecemos conexion SQL y comprobamos que funciona
  156.    if(!mysql_real_connect(con, "localhost", "root", NULL, "prueba", 3306, NULL, 0))
  157.    {
  158.                                printf("Error conectando con BD Prueba %s\n", mysql_error(con));
  159.                                }
  160.  
  161.    printf("Que quieres hacer\n\n1:Leer BD\n2:Insertar Datos\n3:Eliminar Datos\n4:Actualizar Datos\n5:Buscar Datos\n\nEliga Opcion: ");
  162.  
  163.    scanf("%d", &op);
  164.  
  165.    switch(op)
  166.    {
  167.    case 1:
  168.    system("cls");
  169.    mostrar(con, row, resultado, consulta);
  170.    return main();
  171.    //break;
  172.  
  173.    case 2:
  174.         system("cls");
  175.         printf("Introduzca Nombre de persona: ");
  176.         fflush(stdin);
  177.         gets(nombre);
  178.         printf("\n");
  179.         printf("ID de persona: ");
  180.         scanf("%i", &id);
  181.         insertar(con, nombre, id);
  182.         return main();
  183.         //break;
  184.  
  185.   case 3:
  186.        system("cls");
  187.        printf("Inserte el ID de persona: ");
  188.        fflush(stdin);
  189.        scanf("%i", &id);
  190.        borrar(con, resultado, row, id);  
  191.        return main();    
  192.        //break;
  193.  
  194.    case 4:
  195.         system("cls");
  196.         update(con);
  197.         return main();
  198.         //break;
  199.  
  200.    case 5:
  201.         system("cls");
  202.         printf("Inserte ID de persona a Buscar: ");
  203.         scanf("%i", &id);
  204.         system("cls");
  205.         buscar(con, resultado, row, id);  
  206.         return main();
  207.  
  208.    default:
  209.            printf("Error no existe opcion\n\n");
  210.            getchar();
  211.            break;    
  212.    }
  213.    //cerramos conexion SQL
  214.    mysql_close(con);
  215.    getchar();
  216.    }
  217.  


« Última modificación: 11 Julio 2012, 19:33 por Fire544 » En línea

"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".
fabianjsm

Desconectado Desconectado

Mensajes: 26


Ver Perfil WWW
Re: Base de Datos con MySQL desde C !Excelente!
« Respuesta #1 en: 26 Agosto 2012, 23:16 »

Muy buen aporte!

Solo realizar esta aclaración: Dev-c++ no es un compilador, es un IDE, probablemente estes compilando con MinGW (podrías estar utilizando otro port como djgpp, o gcc sobre Linux, pero no lo creo en principio por el include <windows.h>... sin entrar en detalles, la explicación de porque la incluyes tampoco es correcta). Del sitio oficial: Bloodshed Dev-C++ is a full-featured Integrated Development Environment (IDE) for the C/C++ programming language.


En línea

Fire544

Desconectado Desconectado

Mensajes: 85


"Escucha el sonido del 0, 1"


Ver Perfil WWW
Re: Base de Datos con MySQL desde C !Excelente!
« Respuesta #2 en: 26 Agosto 2012, 23:27 »

Muy buen aporte!

Solo realizar esta aclaración: Dev-c++ no es un compilador, es un IDE, probablemente estes compilando con MinGW (podrías estar utilizando otro port como djgpp, o gcc sobre Linux, pero no lo creo en principio por el include <windows.h>... sin entrar en detalles, la explicación de porque la incluyes tampoco es correcta). Del sitio oficial: Bloodshed Dev-C++ is a full-featured Integrated Development Environment (IDE) for the C/C++ programming language.

La explicacion de porque la incluyo no es completa pero si correcta, entonces como ara las llamadas a winsock ? entiendo lo que quieres dejar dicho, pero Si claro Dev-c++ es un IDE Entorno de desarrollo eso esta claro, y claro que compila con GCC !!
En línea

"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".
fabianjsm

Desconectado Desconectado

Mensajes: 26


Ver Perfil WWW
Re: Base de Datos con MySQL desde C !Excelente!
« Respuesta #3 en: 27 Agosto 2012, 01:49 »

Para utilizar una librería, no debes incluir todos los archivos de cabecera de las funciones que esta requiere internamente. No estas incluyendo windows.h para abrir sockets porque no los estas utilizando, no porque haya leído todo tu código fuente, sino porque asumo que lo has compilado antes de subir, el código compila correctamente, sino no lo subirías. Lo compilaste en Windows, por eso el include <windows.h>. Si estuvieras utilizando sockets en Windows deberías haber incluido el archivo de cabeceras para trabajar con ellos: winsock.h.

Probablemente sin “windows.h” no puedas compilar, pero lo aconsejable para compilar un cliente MySQL en Windows es que incluyas my_global.h, no windows.h directamente. http://dev.mysql.com/doc/refman/5.0/es/windows-client-compiling.html
En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 3.128


I'Love...!¡.


Ver Perfil WWW
Re: Base de Datos con MySQL desde C !Excelente!
« Respuesta #4 en: 27 Agosto 2012, 04:50 »

mmm veo que usas fflush(stdin); no creo que sea stdin por el contexto del codigo, mas bien es stdout fflush(stdout);

Dulces Lunas!¡.
En línea




CScript (Actualizado 26/06/2013).

FileX <-- Re-modelando...
Web Principal-->[ Blog(VB6/C/C++) | Host File | Scan Port) ]

The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilit y el metal mi relig
flony


Desconectado Desconectado

Mensajes: 565



Ver Perfil
Re: Base de Datos con MySQL desde C !Excelente!
« Respuesta #5 en: 27 Agosto 2012, 13:48 »

hace rato estaba buscando algo que me sirva de base para mi base de dato...me gustaría hacerlo pero en c++
En línea

si un problema no tiene solucion entonces no es un problema...es algo inevitable
Fire544

Desconectado Desconectado

Mensajes: 85


"Escucha el sonido del 0, 1"


Ver Perfil WWW
Re: Base de Datos con MySQL desde C !Excelente!
« Respuesta #6 en: 27 Agosto 2012, 15:11 »

Para utilizar una librería, no debes incluir todos los archivos de cabecera de las funciones que esta requiere internamente. No estas incluyendo windows.h para abrir sockets porque no los estas utilizando, no porque haya leído todo tu código fuente, sino porque asumo que lo has compilado antes de subir, el código compila correctamente, sino no lo subirías. Lo compilaste en Windows, por eso el include <windows.h>. Si estuvieras utilizando sockets en Windows deberías haber incluido el archivo de cabeceras para trabajar con ellos: winsock.h.

Probablemente sin “windows.h” no puedas compilar, pero lo aconsejable para compilar un cliente MySQL en Windows es que incluyas my_global.h, no windows.h directamente. http://dev.mysql.com/doc/refman/5.0/es/windows-client-compiling.html

Hey BlackZeroX (Astaroth) tienes mucha razon, si claro utilizo la libreria windows.h por el hecho de compilar en windows, lo que pasa es que windows.h hace llamadas a my_global.h muy buena la aclaracion, gracias BlackZeroX (Astaroth) !!  ;-)
En línea

"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines