<!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&oacute;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: &Ouml;zcan G&uuml;ng&ouml;r
 =LF=CAT___: SoftwareDevelopment
 =LF=TITLE_: La Interfaz de Programaci&oacute;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">&lt;--</FONT></A> &nbsp;| 
                 <A class="nodec" href="../index.shtml"><FONT color=
                 "#DDDDDD" size="2">Hogar</FONT></A> &nbsp;| 
                 <A class="nodec" href="../map.html"><FONT color=
                 "#DDDDDD" size="2">Mapa</FONT></A> &nbsp;| 
                 <A class="nodec" href="../indice.html"><FONT color=
                 "#DDDDDD" size="2">Indice</FONT></A> &nbsp;| 
                 <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&aacute; disponible en los siguientes idiomas: <A href="../../English/September2003/article304.shtml">English</a> &nbsp;<A href="../../Castellano/September2003/article304.shtml">Castellano</a> &nbsp;<A href="../../ChineseGB/September2003/article304.shtml">ChineseGB</a> &nbsp;<A href="../../Deutsch/September2003/article304.shtml">Deutsch</a> &nbsp;<A href="../../Francais/September2003/article304.shtml">Francais</a> &nbsp;<A href="../../Nederlands/September2003/article304.shtml">Nederlands</a> &nbsp;<A href="../../Portugues/September2003/article304.shtml">Portugues</a> &nbsp;<A href="../../Russian/September2003/article304.shtml">Russian</a> &nbsp;<A href="../../Turkce/September2003/article304.shtml">Turkce</a> &nbsp;<A href="../../Polish/September2003/article304.shtml">Polish</a> &nbsp;</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  &Ouml;zcan G&uuml;ng&ouml;r <br> <small>&lt;ozcangungor(at)netscape.net&gt;</small>
<BR><BR>
<I>Sobre el autor:</I><BR>
<!-- aboutauthor_start -->

Uso Linux desde 1997. Libertad, flexibilidad y C&oacute;digo Abierto. Son las caracter&iacute;sticas que me gustan.<br>
<!-- aboutauthor_stop -->
<!-- TRANSLATED TO es -->
<BR><BR><I>Traducido al espa&ntilde;ol por:</I><BR>
Carlos Gonz&aacute;lez P&eacute;rez <small>&lt;charly(en)galpon.org&gt;</small>
<br>
<!--
 =LF=TRANSTO=es: Carlos Gonz&aacute;lez P&eacute;rez
-->
<!-- TRANSLATED TO STOP -->
<BR><i>Contenidos</i>:
<UL>
  <LI><A HREF="#304lfindex0">Introducci&oacute;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&oacute;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&iacute;culo</A></LI>
</UL>

</TD></TR></TABLE>
<!-- HEAD OF THE ARTICLE -->
<br>&nbsp;
<table border="0"><tr><td>
<H2>La Interfaz de Programaci&oacute;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&iacute;culo, aprenderemos a usar el API (Interfaz de
Programaci&oacute;n de Aplicaciones) que viene con MySQL. Para
poder entender este art&iacute;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">&nbsp;</A>
<H2>Introducci&oacute;n</H2>


Las APIs de C son distribuidas con el c&oacute;digo fuente de MySQL e inclu&iacute;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&oacute;digo fuente de MySQL.<br>

<A NAME="304lfindex1">&nbsp;</A>
<H2>Tipos de variables de MySQL C</H2>

Los siguientes tipos de variables est&aacute;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&oacute;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&oacute;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&oacute;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&uacute;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&aacute;.
Para imprimir cada uno de estos valores, convi&eacute;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">&nbsp;</A>
<H2>Conectando a MySQL y haciendo una petici&oacute;n</H2>

Ahora, asumir&eacute; que est&aacute; instalado MySQL, y que has creado
un usuario y una tabla en la base de datos. En caso de que haya
alg&uacute;n problema, por favor consulta la p&aacute;gina de <a
 href="http://www.mysql.com">MySQL</a>.

<p>Como he dicho antes las bibliotecas de MySQL est&aacute;n en la
biblioteca mysqlclient. As&iacute; que cuando compilemos un
programa MySQL es necesario a&ntilde;adir la opci&oacute;n&nbsp; <i>-lmysqlclient</i>
al compilador. Las cabeceras (headers) de MySQL est&aacute;n en
/usr/include/mysql (aunque esto depende de tu distribuci&oacute;n
Linux). La cabecera de tu programa tendr&aacute; algo parecido a esto:<br>
</p>
<p class="code">#include &lt;mysql/mysql.h&gt;</p>
<p>Los tipos de variables y funciones de MySQL est&aacute;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&oacute;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&oacute;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&ntilde;a. db es la base de datos a la que queremos
conectarnos, port es el n&uacute;mero de puerto TCP/IP del
servidor MySQL. unix_socket es el tipo de conexi&oacute;n.
clientflag es el flag que hace que MySQL corra como ODBC. En este
art&iacute;culo ser&aacute; 0. Esta funci&oacute;n devuelve 0 cuando la
conexi&oacute;n se establece.</p>

<p>Ahora podemos conectarnos a una base de datos y hacer una
petici&oacute;n:<br>
</p>
<pre class="code">char *query;<br></pre>

<p>Usando esta cadena podemos construir cualquier sentencia SQL y hacer
la petici&oacute;n. La funci&oacute;n que ejecuta la petici&oacute;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&oacute;n
SQL. length es la longitud de la cadena. Si la petici&oacute;n se
produce sin errores, la funci&oacute;n devuelve 0.

<p>Despu&eacute;s de hacer una petici&oacute;n, necesitamos una
variable en MYSQL_RES para poder disponer de los resultados de la
petici&oacute;n. La siguiente l&iacute;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&oacute;n se usa para leer los resultados.<br>

<p>Aunque podemos hacer peticiones f&aacute;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&oacute;n transforma los resultados en columnas. Como te
habr&aacute;s dado cuenta, la funci&oacute;n devuelve una variable del
tipo de&nbsp; MYSQL_ROW. La siguiente l&iacute;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&oacute;n
devuleve un valor negativo. Al final necesitamos cerrar la
conexi&oacute;n:<br>
<br>
<pre class="code">mysql_close(MYSQL *mysql)<br></pre>

<A NAME="304lfindex3">&nbsp;</A>
<H2>Algunas Funciones Usuales</H2>

Veamos c&oacute;mo obtener el n&uacute;mero de campos de una tabla. La
siguiente funci&oacute;n hace eso:<br>
<pre class="code">unsigned int STDCALL mysql_num_fields(MYSQL *mysql);<br></pre>
Esta funci&oacute;n devuelve el n&uacute;mero de campos de la tabla.<br>
<p>Para obtener el n&uacute;mero de columnas del resultado de una
petici&oacute;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&oacute;n se usa para conocer el n&uacute;mero de columnas
que son afectadas por peticiones de INSERT, DELETE o UPDATE.
N&oacute;tese que la funci&oacute;n devuelve el tipo my_ulonglong.

<p>Finalmente alg&uacute;n c&oacute;digo de ejemplo:<br>
</p>
<pre class="code">#include &lt;mysql/mysql.h&gt;<br>#include &lt;stdio.h&gt;<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&lt;=mysql_field_count(mysql);r++){<br>           row=mysql_fetch_row(res);<br>           if(row&lt;0) break;<br>           for(t=0;t&lt;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">&nbsp;</A>
<H2>Lecturas recomendadas</H2>

<ul>
  <li>La p&aacute;gina de MySQL: <a href="http://www.mysql.com">www.mysql.com</a></li>
  <li>Documentos que vienen con el c&oacute;digo fuente de MySQL.
(Probablemente bajo el directorio /usr/doc)</li>
</ul>



<!-- 2pdaIgnoreStart -->
<A NAME="talkback">&nbsp;</a>
<h2>Formulario de "talkback" para este art&iacute;culo</h2>
Cada art&iacute;culo tiene su propia p&aacute;gina de "talkback". A trav&eacute;s de esa p&aacute;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>&nbsp;Ir a la p&aacute;gina de "talkback"&nbsp;</b></a>
   </td></tr></table>
</td></tr></table>
</center>

<HR size="2" noshade>
<a style="background-color:#bdc6d5" href="index.shtml">&lt;--, regresar al &iacute;ndice de este n&uacute;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">&copy; &Ouml;zcan G&uuml;ng&ouml;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&oacute;n sobre la traducci&oacute;n:</font>
<TABLE summary="translators">
  <tr><td><font size="2">tr --&gt; -- : &Ouml;zcan G&uuml;ng&ouml;r <small>&lt;ozcangungor(at)netscape.net&gt;</small></font></td></tr>
  <tr><td><font size="2">en --&gt; es: Carlos Gonz&aacute;lez P&eacute;rez &lt;charly(en)galpon.org&gt;</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>