<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <META NAME="GENERATOR" CONTENT="lfparser_2.41"> <META NAME="LFCATEGORY" CONTENT="SoftwareDevelopment"> <link rel="icon" href="../../common/images/lf-16.png" type="image/png"> <TITLE>lf304, SoftwareDevelopment: La Interfaz de Programación de Aplicaciones -API- de MySQL</TITLE> <style type="text/css"> <!-- td.top {font-family: Arial,Geneva,Verdana,Helvetica,sans-serif; font-size:12 } pre { font-family:monospace,Courier } pre.code { font-family:monospace,Courier;background-color:#aedbe8; } p.cl { color:#EE9500 } a.nodec { text-decoration:none } p.trans { font-size:8pt; text-align:right } p.clbox { width:50%; alignment:center; background-color:#FFD700; border-style:none; border-width:medium; border-color:#FFD700; padding:0.5cm; text-align:center } p.code { width:80%; alignment:center; background-color:#aedbe8; border-style:none; border-width:medium; border-color:#aedbe8; padding:0.1cm; text-align:left } p.foot { background-color:#AAAAAA; color:#FFFFFF; border-style:none; border-width:medium; border-color:#AAAAAA; padding:0.5cm ; margin-top:0.1cm; margin-right:1cm; margin-left:1cm; text-align:center } .mark { background-color:#e6e6ff } --> </style> </HEAD> <BODY bgcolor="#ffffff" text="#000000"> <!-- this is generated html code. NEVER use this file for your translation work. Instead get the file with the same article number and .meta.shtml in its name. Translate this meta file and then use lfparser program to generate the final article --> <!-- lfparser can be obtained from http://www.linuxfocus.org/~guido/dev/lfparser.html --> <!-- this is used by a number of tools: =LF=AUTHOR: Özcan Güngör =LF=CAT___: SoftwareDevelopment =LF=TITLE_: La Interfaz de Programación de Aplicaciones -API- de MySQL =LF=NUMBER: 304 =LF=ANAME_: article304.shtml --> <!-- 2pdaIgnoreStart --> <!-- start navegation bar, style=2 --> <!-- top navegation bar --> <TABLE summary="topbar_1" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#2e2292"> <TD class="top"><TABLE summary="topbar_1_logo" cellspacing="0" cellpadding="0" border="0" width= "100%"> <TR><TD width="319"><IMG src="../../common/images/logolftop_319x45.gif" alt="[LinuxFocus-icon]" width="319" height="45" align="left" border="0"></TD> <TD class="top"> <TABLE summary="topbar_1_links" width="100%"> <TR align="right"> <TD class="top"> <A class="nodec" href="index.shtml"><FONT color= "#DDDDDD" size="2"><--</FONT></A> | <A class="nodec" href="../index.shtml"><FONT color= "#DDDDDD" size="2">Hogar</FONT></A> | <A class="nodec" href="../map.html"><FONT color= "#DDDDDD" size="2">Mapa</FONT></A> | <A class="nodec" href="../indice.html"><FONT color= "#DDDDDD" size="2">Indice</FONT></A> | <A class="nodec" href="../Search/index.html"><FONT color= "#DDDDDD" size="2">Busqueda</FONT></A> </TD> </TR> <TR align="right"> <TD class="top"> <HR width="100%" noshade size="1"> </TD> </TR> </TABLE> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end top navegation bar --> <!-- blue bar --> <TABLE summary="topbar_2" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#00ffff"> <TD><IMG src="../../common/images/transpix.gif" width="1" height= "2" alt=""></TD> </TR> </TABLE> <!-- end blue bar --> <!-- bottom navegation bar --> <TABLE summary="topbar_3" cellspacing="0" cellpadding="0" border="0" align="center" width="94%"> <TR bgcolor="#000000"> <TD> <TABLE summary="topbar_3_links" cellspacing="0" cellpadding="1" border="0" width= "100%"> <TR align="center"> <TD WIDTH="20%"><A class="nodec" href="../News/index.shtml"><FONT color= "#FFFFFF">Noticias</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Archives/index.html"><FONT color= "#FFFFFF">Arca</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Links/index.html"><FONT color= "#FFFFFF">Enlaces</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../aboutus.html"><FONT color= "#FFFFFF">Sobre LF</FONT></A> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end bottom navegation bar --> <!-- stop navegation bar --> <!-- SSI_INFO --> <!-- tr_staticssi include virtual --> <!-- tr_staticssi exec cmd --> <!-- addedByLfdynahead ver 1.4 --><TABLE ALIGN="right" border=0><TR><TD ALIGN="right"><FONT SIZE="-1" FACE="Arial,Helvetica">Este documento está disponible en los siguientes idiomas: <A href="../../English/September2003/article304.shtml">English</a> <A href="../../Castellano/September2003/article304.shtml">Castellano</a> <A href="../../ChineseGB/September2003/article304.shtml">ChineseGB</a> <A href="../../Deutsch/September2003/article304.shtml">Deutsch</a> <A href="../../Francais/September2003/article304.shtml">Francais</a> <A href="../../Nederlands/September2003/article304.shtml">Nederlands</a> <A href="../../Portugues/September2003/article304.shtml">Portugues</a> <A href="../../Russian/September2003/article304.shtml">Russian</a> <A href="../../Turkce/September2003/article304.shtml">Turkce</a> <A href="../../Polish/September2003/article304.shtml">Polish</a> </FONT></TD></TR></TABLE><br> <!-- SSI_INFO STOP --> <!-- 2pdaIgnoreStop --> <!-- SHORT BIO ABOUT THE AUTHOR --> <TABLE ALIGN=LEFT BORDER=0 WIDTH="190" summary="about the author"> <TR> <TD> <img src="../../common/images/OzcanGungor.jpg" alt="Ozcan Gungor" width="114" height="147"> <BR>por Özcan Güngör <br> <small><ozcangungor(at)netscape.net></small> <BR><BR> <I>Sobre el autor:</I><BR> <!-- aboutauthor_start --> Uso Linux desde 1997. Libertad, flexibilidad y Código Abierto. Son las características que me gustan.<br> <!-- aboutauthor_stop --> <!-- TRANSLATED TO es --> <BR><BR><I>Traducido al español por:</I><BR> Carlos González Pérez <small><charly(en)galpon.org></small> <br> <!-- =LF=TRANSTO=es: Carlos González Pérez --> <!-- TRANSLATED TO STOP --> <BR><i>Contenidos</i>: <UL> <LI><A HREF="#304lfindex0">Introducción</A></LI> <LI><A HREF="#304lfindex1">Tipos de variables de MySQL C</A></LI> <LI><A HREF="#304lfindex2">Conectando a MySQL y haciendo una petición</A></LI> <LI><A HREF="#304lfindex3">Algunas Funciones Usuales</A></LI> <LI><A HREF="#304lfindex4">Lecturas recomendadas</A></LI> <LI><A HREF="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=304">Formulario de "talkback" para este artículo</A></LI> </UL> </TD></TR></TABLE> <!-- HEAD OF THE ARTICLE --> <br> <table border="0"><tr><td> <H2>La Interfaz de Programación de Aplicaciones -API- de MySQL</H2> <img src="../../common/images/illustartion304.gif" hspace="10" alt="mysql logo" width="348" height="150"> <!-- ABSTRACT OF THE ARTICLE --> <P><i>Resumen</i>: <P> <!-- articleabstract_start --> En este artículo, aprenderemos a usar el API (Interfaz de Programación de Aplicaciones) que viene con MySQL. Para poder entender este artículo, necesitas tener algunas nociones sobre: <br><ul><li>Variables en C.</li><li>Funciones en C.</li><li>Punteros en C.</li></ul> <!-- articleabstract_stop --> <br><!-- HR divider --><center><font color="#8282e0"><b>_________________ _________________ _________________</b></font></center><br> </td></tr></table> <!-- BODY OF THE ARTICLE --> <A NAME="304lfindex0"> </A> <H2>Introducción</H2> Las APIs de C son distribuidas con el código fuente de MySQL e incluídas en la biblioteca <span style="font-style: italic;">mysqlclient</span>. Se usan para conectar a una base de datos y ejecutar peticiones. Hay algunos ejemplos en el directorio de <span style="font-style: italic;">clientes</span> del código fuente de MySQL.<br> <A NAME="304lfindex1"> </A> <H2>Tipos de variables de MySQL C</H2> Los siguientes tipos de variables están definidos en la biblioteca de MySQL. Necesitamos estas variables para poder usar las funciones de MySQL. Las variables son explicadas detalladamente pero los detalles no son realmente importantes para escribir código.<br> <br> <p><b>MYSQL</b><br> La siguiente estructura es la del manejador de comunicaciones que se usa para conectarse a una base de datos.</p> <pre class="code">typedef struct st_mysql {<br> NET net; /* Communication parameters */<br> gptr connector_fd; /* ConnectorFd for SSL */<br> char *host,*user,*passwd,*unix_socket,<br> *server_version,*host_info,*info,*db;<br> unsigned int port,client_flag,server_capabilities;<br> unsigned int protocol_version;<br> unsigned int field_count;<br> unsigned int server_status;<br> unsigned long thread_id; /* Id for connection in server */<br> my_ulonglong affected_rows;<br> my_ulonglong insert_id; /* id if insert on table with NEXTNR */<br> my_ulonglong extra_info; /* Used by mysqlshow */<br> unsigned long packet_length;<br> enum mysql_status status;<br> MYSQL_FIELD *fields;<br> MEM_ROOT field_alloc;<br> my_bool free_me; /* If free in mysql_close */<br> my_bool reconnect; /* set to 1 if automatic reconnect */<br> struct st_mysql_options options;<br> char scramble_buff[9];<br> struct charset_info_st *charset;<br> unsigned int server_language;<br>} MYSQL;<br><br></pre> <br> <br> <p><b>MYSQL_RES</b><br> </p> <p>Esta estructura representa los resultados de una petición que devuelve columnas. Los datos devueltos se llaman conjunto de resultados.<br> </p> <pre class="code">typedef struct st_mysql_res {<br> my_ulonglong row_count;<br> unsigned int field_count, current_field;<br> MYSQL_FIELD *fields;<br> MYSQL_DATA *data;<br> MYSQL_ROWS *data_cursor;<br> MEM_ROOT field_alloc;<br> MYSQL_ROW row; /* If unbuffered read */<br> MYSQL_ROW current_row; /* buffer to current row */<br> unsigned long *lengths; /* column lengths of current row */<br> MYSQL *handle; /* for unbuffered reads */<br> my_bool eof; /* Used my mysql_fetch_row */<br>} MYSQL_RES;<br><br></pre> <br> <br> <p><b>MYSQL_ROW</b><br> </p> <p>Esta estructura es un tipo libre de representación de datos en una columna. No puedes usarla como una cadena que finaliza con un caracter nulo, porque los datos de esta cadena pueden ser binarios y pueden incluir caracteres nulos.</p> <pre class="code">typedef struct st_mysql_field {<br> char *name; /* Name of column */<br> char *table; /* Table of column if column was a field */<br> char *def; /* Default value (set by mysql_list_fields) */<br> enum enum_field_types type; /* Type of field. Se mysql_com.h for types */<br> unsigned int length; /* Width of column */<br> unsigned int max_length; /* Max width of selected set */<br> unsigned int flags; /* Div flags */<br> unsigned int decimals; /* Number of decimals in field */<br>} MYSQL_FIELD;<br><br></pre> <br> <br> <p><b>my_ulonglong</b><br> </p> <p>El tipo usado para el número de columnas y para mysql_affected_rows(), mysql_num_rows(), y mysql_insert_id().<br> Este tipo provee un rango de 0 a 1.84e19. En algunos sistemas, al intentar escribir un valor del tipo my_ulonglong no funcionará. Para imprimir cada uno de estos valores, conviértelo a unsigned long y usa el formato %lu de printf. Ejemplo: printf(Number of rows: %lu\n", (unsigned long) mysql_num_rows(result));</p> <p class="code">typedef unsigned long my_ulonglong;</p> <A NAME="304lfindex2"> </A> <H2>Conectando a MySQL y haciendo una petición</H2> Ahora, asumiré que está instalado MySQL, y que has creado un usuario y una tabla en la base de datos. En caso de que haya algún problema, por favor consulta la página de <a href="http://www.mysql.com">MySQL</a>. <p>Como he dicho antes las bibliotecas de MySQL están en la biblioteca mysqlclient. Así que cuando compilemos un programa MySQL es necesario añadir la opción <i>-lmysqlclient</i> al compilador. Las cabeceras (headers) de MySQL están en /usr/include/mysql (aunque esto depende de tu distribución Linux). La cabecera de tu programa tendrá algo parecido a esto:<br> </p> <p class="code">#include <mysql/mysql.h></p> <p>Los tipos de variables y funciones de MySQL están incluidos en esta cabecera (header).<br> </p> Ahora necesitamos crear la varibale que se usa para conectar a la base de datos. Se hace simplemente con:<br> <p></p> <p class="code">MYSQL *mysql;</p> <p>Antes de conectar a una base de datos, debemos llamar a la siguiente función para inicializar la variable mysql:<br> </p> <p class="code">mysql_init(MYSQL *mysql)</p> <p>Entonces la</p> <pre class="code">MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, <br> const char *host, <br> const char *user,<br> const char *passwd,<br> const char *db,<br> unsigned int port,<br> const char *unix_socket,<br> unsigned int clientflag);<br></pre> <p>función es llamada para conectar a la base de datos host es el hostname (nombre del sistema) del servidor MySQL. user es el usuario con el cual queremos conectarnos. passwd es la contraseña. db es la base de datos a la que queremos conectarnos, port es el número de puerto TCP/IP del servidor MySQL. unix_socket es el tipo de conexión. clientflag es el flag que hace que MySQL corra como ODBC. En este artículo será 0. Esta función devuelve 0 cuando la conexión se establece.</p> <p>Ahora podemos conectarnos a una base de datos y hacer una petición:<br> </p> <pre class="code">char *query;<br></pre> <p>Usando esta cadena podemos construir cualquier sentencia SQL y hacer la petición. La función que ejecuta la petición es:<br> </p> <pre class="code">int STDCALL mysql_real_query(MYSQL *mysql, <br> const char *q,<br> unsigned int length);<br></pre> mysql es la variable que hemos usado. q es la cadena de petición SQL. length es la longitud de la cadena. Si la petición se produce sin errores, la función devuelve 0. <p>Después de hacer una petición, necesitamos una variable en MYSQL_RES para poder disponer de los resultados de la petición. La siguiente línea crea esa variable:</p> <pre class="code">MYSQL_RES *res;<br></pre> Entonces<br> <pre class="code">mysql_use_result(MYSQL *query)<br></pre> La función se usa para leer los resultados.<br> <p>Aunque podemos hacer peticiones fácilmente, necesitamos otras funciones para usar los resultados. La primera es:<br> </p> <pre class="code">MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);<br></pre> Esta función transforma los resultados en columnas. Como te habrás dado cuenta, la función devuelve una variable del tipo de MYSQL_ROW. La siguiente línea crea dicha variable: <pre class="code">MYSQL_ROW row;<br></pre> Como ya se ha explicado la variable row es un arreglo de cadenas. Esto quiere decir que row[0] es la primera columna de la primera fila y row[1] es la segunda columna de la primera fila. Cuando usamos mysql_fetch_row, la variable toma los datos de la siguiente fila del resultado. Cuando alcanzamos el final del resultado la función devuleve un valor negativo. Al final necesitamos cerrar la conexión:<br> <br> <pre class="code">mysql_close(MYSQL *mysql)<br></pre> <A NAME="304lfindex3"> </A> <H2>Algunas Funciones Usuales</H2> Veamos cómo obtener el número de campos de una tabla. La siguiente función hace eso:<br> <pre class="code">unsigned int STDCALL mysql_num_fields(MYSQL *mysql);<br></pre> Esta función devuelve el número de campos de la tabla.<br> <p>Para obtener el número de columnas del resultado de una petición usa:<br> </p> <p class="code">my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);</p> <p class="code">my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql);</p> Esta función se usa para conocer el número de columnas que son afectadas por peticiones de INSERT, DELETE o UPDATE. Nótese que la función devuelve el tipo my_ulonglong. <p>Finalmente algún código de ejemplo:<br> </p> <pre class="code">#include <mysql/mysql.h><br>#include <stdio.h><br><br>void main(){<br> MYSQL *mysql;<br> MYSQL_RES *res;<br> MYSQL_ROW row;<br> char *query;<br> int t,r;<br><br> mysql_init(mysql);<br> if (!mysql_real_connect(mysql,"localhost","mysql",<br> "mysql","deneme",0,NULL,0))<br> {<br> printf( "Error connectin ot database: %s\n",mysql_error(mysql));<br> }<br> else printf("Connected...\n");<br><br> query="select * from Deneme";<br><br> t=mysql_real_query(mysql,query,(unsigned int) strlen(query));<br> if (t)<br> {<br> printf("Error making query: %s\n",<br> mysql_error(mysql));<br> }<br> else printf("Query made...\n");<br> res=mysql_use_result(mysql);<br> for(r=0;r<=mysql_field_count(mysql);r++){<br> row=mysql_fetch_row(res);<br> if(row<0) break;<br> for(t=0;t<mysql_num_fields(res);t++){<br> printf("%s ",row[t]);<br> }<br> printf("\n");<br> }<br> mysql_close(mysql);<br>}<br></pre> <A NAME="304lfindex4"> </A> <H2>Lecturas recomendadas</H2> <ul> <li>La página de MySQL: <a href="http://www.mysql.com">www.mysql.com</a></li> <li>Documentos que vienen con el código fuente de MySQL. (Probablemente bajo el directorio /usr/doc)</li> </ul> <!-- 2pdaIgnoreStart --> <A NAME="talkback"> </a> <h2>Formulario de "talkback" para este artículo</h2> Cada artículo tiene su propia página de "talkback". A través de esa página puedes enviar un comentario o consultar los comentarios de otros lectores <center> <table border="0" CELLSPACING="2" CELLPADDING="1" summary="tb-button-outerpart"> <tr BGCOLOR="#C2C2C2"><td align=center> <table border="3" CELLSPACING="2" CELLPADDING="1" summary="tb-button"> <tr BGCOLOR="#C2C2C2"><td align=center> <A href="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=304"><b> Ir a la página de "talkback" </b></a> </td></tr></table> </td></tr></table> </center> <HR size="2" noshade> <a style="background-color:#bdc6d5" href="index.shtml"><--, regresar al índice de este número </a><br><HR size="2" noshade> <!-- ARTICLE FOOT --> <CENTER><TABLE WIDTH="98%" summary="footer"> <TR><TD ALIGN=CENTER BGCOLOR="#bdc6d5" WIDTH="50%"> <A HREF="../../common/lfteam.html">Contactar con el equipo de LinuFocus</A> <BR><FONT COLOR="#FFFFFF">© Özcan Güngör, <a href="../../common/copy.html">FDL</a> <BR><a href="http://www.linuxfocus.org">LinuxFocus.org</a></FONT> </TD> <TD BGCOLOR="#bdc6d5"> <!-- TRANSLATION INFO --> <font size=2>Información sobre la traducción:</font> <TABLE summary="translators"> <tr><td><font size="2">tr --> -- : Özcan Güngör <small><ozcangungor(at)netscape.net></small></font></td></tr> <tr><td><font size="2">en --> es: Carlos González Pérez <charly(en)galpon.org></font></td></tr> </TABLE> </TD> </TR></TABLE></CENTER> <p><font size=1>2003-12-03, generated by lfparser version 2.41</font></p> <!-- 2pdaIgnoreStop --> </BODY> </HTML>