<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.mysqli.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'mysqli.overview.php',
    1 => 'Introducci&oacute;n',
    2 => 'Introducci&oacute;n',
  ),
  'up' => 
  array (
    0 => 'book.mysqli.php',
    1 => 'MySQLi',
  ),
  'prev' => 
  array (
    0 => 'book.mysqli.php',
    1 => 'MySQLi',
  ),
  'next' => 
  array (
    0 => 'mysqli.quickstart.php',
    1 => 'Gu&iacute;a de inicio r&aacute;pido',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'reference/mysqli/overview.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mysqli.overview" class="chapter">
  <h1 class="title">Introducción</h1>


  <p class="para">
    Esta sección proporciona información sobre las soluciones disponibles
    al desarrollar una aplicación PHP que necesita interactuar con una base de datos MySQL.
  </p>

  <p class="para">
    <strong>¿Qué es una API?</strong>
  </p>

  <p class="para">
    Una Interfaz de Programación de Aplicaciones, o <code class="literal">Application Programming Interface</code> (API),
    define las clases, métodos, funciones y variables que su aplicación utilizará para ejecutar diferentes tareas. En el caso
    de las aplicaciones PHP, las comunicaciones con una base de datos se realizan generalmente a través de una API que está expuesta en una extensión PHP.
  </p>

  <p class="para">
    Las API pueden ser procedimentales u orientadas a objetos. Con una API procedimental,
    se pueden llamar funciones para ejecutar comandos; con una API orientada a objetos,
    es necesario crear objetos y llamar a los métodos de estos objetos. De las dos, esta última es generalmente preferida,
    ya que es más moderna y conduce a un código más organizado.
  </p>

  <p class="para">
    Al escribir aplicaciones PHP que deben conectarse a MySQL, hay varias API disponibles. Este documento presenta estas API y
    proporciona la información necesaria para elegir la mejor solución para su aplicación.
  </p>

  <p class="para">
    <strong>¿Qué es un conector?</strong>
  </p>

  <p class="para">
    En la documentación de MySQL, el término <em>conector</em>
    se refiere a un software que permite a una aplicación conectarse
    a una base de datos MySQL. MySQL proporciona conectores para una amplia
    colección de lenguajes, incluyendo PHP.
  </p>

  <p class="para">
    Si su aplicación PHP necesita comunicarse con un servidor de
    base de datos, es necesario escribir código para poder conectarse,
    enviar consultas al servidor, etc. Se requiere un software para
    proporcionar la interfaz que PHP utilizará y gestionar las comunicaciones
    entre su aplicación y el servidor de base de datos: eventualmente,
    se necesitan bibliotecas intermedias. Estos programas se denominan
    genéricamente conectores, ya que permiten <em>conectarse</em> a un servidor de base de datos.
  </p>

  <p class="para">
    <strong>¿Qué es un controlador?</strong>
  </p>

  <p class="para">
    Un controlador es un software diseñado para comunicarse con
    un tipo particular de base de datos. Un controlador también puede
    llamarse biblioteca, como la <code class="literal">MySQL Client Library</code> o el
    MySQL Native Driver. Estas bibliotecas implementan el protocolo
    de bajo nivel para comunicarse con un servidor MySQL.
  </p>

  <p class="para">
    Por ejemplo, la capa de abstracción de base de datos
    <a href="mysqli.overview.php#mysqli.overview.pdo" class="link">PHP Data Objects (PDO)</a> utiliza
    uno o más controladores de base de datos. Uno de estos controladores es el
    controlador PDO MYSQL, que permite interactuar con MySQL.
  </p>

  <p class="para">
    A veces, los desarrolladores utilizan los términos conector y controlador
    de manera intercambiable, lo que puede resultar confuso. En la
    documentación de MySQL, el término <q class="quote">controlador</q> está reservado
    para los programas que son la interfaz específica con la base de datos del paquete.
  </p>

  <p class="para">
    <strong>¿Qué es una extensión?</strong>
  </p>

  <p class="para">
    En la documentación de PHP, se encontrará con otro término:
    <em>extensión</em>. El código PHP está compuesto por un núcleo,
    con extensiones opcionales. Las extensiones relacionadas con MySQL de PHP,
    como la extensión <code class="literal">mysqli</code> y la extensión de controlador
    PDO MySQL, están implementadas utilizando el framework de extensión de PHP.
  </p>

  <p class="para">
    Una extensión expone típicamente una API a un desarrollador PHP,
    para facilitar la programación. Sin embargo,
    algunas extensiones que utilizan el framework de PHP no exponen
    ninguna API al desarrollador PHP.
  </p>

  <p class="para">
    La extensión de controlador PDO MySQL, por ejemplo, no expone ninguna API al
    desarrollador PHP, pero proporciona una interfaz a la capa PDO.
  </p>

  <p class="para">
    Los términos API y extensión no deberían significar lo mismo,
    ya que una extensión PHP no proporciona necesariamente una API particular al desarrollador PHP.
  </p>

  <p class="para">
    <strong>¿Cuáles son las API de PHP para MySQL?</strong>
  </p>

  <p class="para">
    Hay dos API principales para conectarse a MySQL:
  </p>

  <ul class="itemizedlist">
    <li class="listitem">
      <p class="para">
        La extensión mysqli
      </p>
    </li>
    <li class="listitem">
      <p class="para">
        PHP Data Objects (PDO)
      </p>
    </li>
  </ul>

  <p class="para">
    Cada una tiene sus ventajas e inconvenientes. Las siguientes secciones
    ofrecen una presentación rápida de cada API.
  </p>

  <p class="para">
    <strong>¿Qué es la extensión mysqli de PHP?</strong>
  </p>

  <p class="para">
    La extensión <code class="literal">mysqli</code>, o como a veces se la denomina,
    la extensión MySQL <em>mejorada</em> (i para <code class="literal">improved</code>
    en inglés), fue desarrollada para aprovechar las nuevas características
    de los sistemas MySQL versión 4.1.3 y posteriores. La extensión
    <code class="literal">mysqli</code> está incluida en PHP desde la versión 5.
  </p>

  <p class="para">
    La extensión <code class="literal">mysqli</code> tiene una gran cantidad de ventajas
    y mejoras con respecto a la extensión <code class="literal">mysql</code>:
    <ul class="itemizedlist">
      <li class="listitem">
        <p class="para">
          Interfaz orientada a objetos
        </p>
      </li>
      <li class="listitem">
        <p class="para">
          Soporte para sentencias preparadas
        </p>
      </li>
      <li class="listitem">
        <p class="para">
          Soporte para múltiples sentencias
        </p>
      </li>
      <li class="listitem">
        <p class="para">
          Soporte para transacciones
        </p>
      </li>
      <li class="listitem">
        <p class="para">
          Capacidades avanzadas de depuración
        </p>
      </li>
    </ul>
  </p>

  <p class="para">
    Además de una interfaz orientada a objetos, la extensión también ofrece
    una interfaz procedimental.
  </p>

  <p class="para">
    La extensión <code class="literal">mysqli</code> está compilada con el framework
    de PHP, y su código fuente se encuentra en el directorio <var class="filename">ext/mysqli</var>.
  </p>

  <p class="para">
    Para más información sobre la extensión <code class="literal">mysqli</code>,
    consulte <a href="book.mysqli.php" class="xref">MySQLi</a>.
  </p>

  <p class="para" id="mysqli.overview.pdo">
    <strong>¿Qué es la extensión PDO de PHP?</strong>
  </p>

  <p class="para">
    <code class="literal">PHP Data Objects</code>, o PDO, es una capa de abstracción
    de base de datos específica para PHP. PDO ofrece una API coherente para sus
    aplicaciones PHP, independientemente del tipo de base de datos con la que
    se trabaje. En teoría, si se utiliza PDO, se puede cambiar de base de datos,
    por ejemplo de Firebird a MySQL, y solo realizar cambios menores en el código PHP.
  </p>

  <p class="para">
    Otros ejemplos de capas de abstracción de base de datos incluyen
    JDBC para Java y DBI para Perl.
  </p>

  <p class="para">
    Si PDO tiene sus ventajas, como una API limpia, simple y portable,
    sus principales inconvenientes son que no permite utilizar
    todas las características avanzadas de las últimas versiones de MySQL.
    Por ejemplo, PDO no permite realizar consultas múltiples.
  </p>

  <p class="para">
    PDO está implementado utilizando el framework de PHP, y su código fuente
    se encuentra en el directorio <var class="filename">ext/pdo</var>.
  </p>

  <p class="para">
    Para más información sobre PDO, consulte <a href="book.pdo.php" class="xref">PDO</a>.
  </p>

  <p class="para">
    <strong>¿Qué es el controlador MySQL para PDO?</strong>
  </p>

  <p class="para">
    El controlador PDO MYSQL no es una API en sí mismo, al menos desde el
    punto de vista del desarrollador PHP. De hecho, el controlador PDO MYSQL forma parte
    de PDO, y proporciona las funcionalidades específicas de MySQL. El
    desarrollador llama a la API PDO, pero PDO utiliza el controlador PDO MYSQL
    para gestionar las comunicaciones con MySQL.
  </p>

  <p class="para">
    El controlador PDO MYSQL forma parte de la gran familia de controladores PDO.
    Otros controladores disponibles gestionan las comunicaciones con
    Firebird y PostgreSQL, entre otros.
  </p>

  <p class="para">
    El controlador PDO MYSQL está implementado con el framework de extensión de PHP.
    Su código fuente se encuentra en el directorio <var class="filename">ext/pdo_mysql</var>.
    No expone ninguna API al desarrollador PHP.
  </p>

  <p class="para">
    Para más detalles sobre el controlador PDO de MySQL, consulte
    <a href="ref.pdo-mysql.php" class="xref">Controlador PDO MySQL</a>.
  </p>

  <p class="para" id="mysqli.overview.mysqlnd">
    <strong>¿Qué es el controlador nativo MySQL de PHP?</strong>
  </p>

  <p class="para">
    Para comunicarse con el servidor MySQL, la extensión
    <code class="literal">mysqli</code> y el controlador
    PDO MYSQL utilizan una biblioteca de bajo nivel que implementa
    el protocolo MySQL. En el pasado, la única biblioteca disponible
    era la <code class="literal">MySQL Client Library</code>,
    también llamada <code class="literal">libmysqlclient</code>.
  </p>

  <p class="para">
    Sin embargo, la interfaz presentada por <code class="literal">libmysqlclient</code> no estaba
    optimizada para las comunicaciones con PHP, y
    <code class="literal">libmysqlclient</code> estaba diseñada originalmente en C, para aplicaciones
    de tipo similar. Por esta razón, el controlador MySQL nativo
    <code class="literal">mysqlnd</code> fue desarrollado como una alternativa a
    <code class="literal">libmysqlclient</code> para aplicaciones PHP.
  </p>

  <p class="para">
    La extensión <code class="literal">mysqli</code> y el controlador MySQL nativo pueden
    configurarse individualmente para utilizar <code class="literal">libmysqlclient</code> o <code class="literal">mysqlnd</code>. Como
    <code class="literal">mysqlnd</code> fue diseñado específicamente para el sistema
    PHP, ofrece numerosas ventajas y mejoras con respecto a
    <code class="literal">libmysqlclient</code>. Se recomienda encarecidamente su uso.
  </p>

  <p class="para">
    El MySQL Native Driver está implementado sobre la base del framework
    de extensión de PHP. El código fuente se encuentra en
    <var class="filename">ext/mysqlnd</var>. No expone ninguna nueva API
    al desarrollador PHP.
  </p>

  <p class="para">
    <strong>Comparación de características</strong>
  </p>

  <p class="para">
    La siguiente tabla compara las características de los métodos
    principales para conectarse a MySQL desde PHP:
  </p>

  <table id="mysqli.overview.option.comparison" class="doctable table">
    <caption><strong>Comparación de las opciones de API MySQL para PHP</strong></caption>
    
      <col width="34*" />
      <col width="33*" />
      <col width="33*" />
      <thead>
        <tr>
          <th class="empty">&nbsp;</th>
          <th>Extensión mysqli</th>
          <th>PDO (con el controlador PDO MySQL Driver y MySQL Native Driver)</th>
        </tr>

      </thead>

      <tbody class="tbody">
        <tr>
          <td>Versión de introducción en PHP</td>
          <td>5.0</td>
          <td>5.0</td>
        </tr>

        <tr>
          <td>Estado de desarrollo de MySQL</td>
          <td>Desarrollo activo</td>
          <td>Desarrollo activo</td>
        </tr>

        <tr>
          <td>La API soporta juegos de caracteres</td>
          <td>Sí</td>
          <td>Sí</td>
        </tr>

        <tr>
          <td>La API soporta sentencias preparadas</td>
          <td>Sí</td>
          <td>Sí</td>
        </tr>

        <tr>
          <td>La API soporta sentencias preparadas del lado del cliente</td>
          <td>No</td>
          <td>Sí</td>
        </tr>

        <tr>
          <td>La API soporta procedimientos almacenados</td>
          <td>Sí</td>
          <td>Sí</td>
        </tr>

        <tr>
          <td>La API soporta múltiples sentencias</td>
          <td>Sí</td>
          <td>La mayoría</td>
        </tr>

        <tr>
          <td>Todas las características de MySQL 4.1 y posteriores</td>
          <td>Sí</td>
          <td>La mayoría</td>
        </tr>

      </tbody>
    
  </table>

</div>
<?php manual_footer($setup); ?>