Acceder a MySQL mediante la extensión MySQL Improved (MySQLI)

A partir de PHP 5 se incluyó una nueva biblioteca/extensión para conectar a MySQL denominada MySQLI (MySQL Improved). El objetivo era potenciar el uso de la programación orientada a objetos y explotar las nuevas posibilidades que nos proporcionaba las nuevas versiones de MySQL como la gestión de transacciones, integridad referencial, etc. Además se mejoró considerablemente el protocolo de conexión haciéndolo mucho más rápido que la librería php_mysql.dll anterior.

La extensión mysqli está activada por defecto, ya que , la activa la instalación WAMP.
Está en la carpeta ext, libreria PECL php_mysqli.dll y activada dentro del fichero php.ini en la sección de extensiones:
extension=php_mysqli.dll

Además en el fichero **php.ini** de PHP 5 se incluirán las siguientes opciones de configuración, que dejaremos tal y como vienen por defecto:

  • mysqli.max_links(integer): El número máximo de conexiones MySQL por proceso.

  • mysqli.default_port(string):El puerto TCP por defecto a usar cuando se conecte al servidor de base de datos si no se ha especificado otro puerto. Si no se define ninguno, el puerto será tomado de la variable de ambiente MYSQL_TCP_PORT, la entrada mysql-tcp en el archivo /etc/services o la constante en tiempo de ejecución MYSQL_PORT en ese orden. Win32 usará solo la constante MYSQL_PORT.

  • mysqli.default_socket(string): El nombre de socket por defecto a usar cuando se conecte a un servidor de base de datos local si no se ha especificado otro nombre.

  • mysqli.default_host(string):El servidor huésped por defecto a usar cuando se conecta al servidor de base de datos si no se ha especificado otro. No se aplicará si PHP está configurado en modo seguro.

  • mysqli.default_user(string):El nombre de usuario por defecto a usar cuando se conecta al servidor de base de datos si no se específica otro nombre. No se aplicará si PHP está configurado en modo seguro.

  • mysqli.default_pw(string):La contraseña a usar cuando se conecta al servidor de base de datos si no se específica otra contraseña. No se aplicará si PHP está configurado en modo seguro.

Esta librería nos va a permitir trabajar con funciones de forma similar a como lo hicimos con la librería de MySQL anterior y también nos va a permitir trabajar utilizando una metodología orientada a objetos.

Por tanto, a lo largo de este apartado cuando veamos alguna funcionalidad sobre MySQL, se tratarán ambas formas de hacerlo. Destacar que debemos tener en cuenta que los métodos orientados a objetos nos devolverán objetos y la funciones nos devolverán identificadores de recursos como la librería vista anteriormente.

Para obtener más información sobre esta extensión podemos consultar la siguiente URL del manual oficial http://docs.php.net/manual/es/book.mysqli.php

Vamos a coger el mismo ejemplo que usamos como base para explicar las funciones o métodos de la extensión MySQLI.

Ejemplo anterior usando la metodología orientada a procedimientos:

<?php
// Función encargada de eliminar caracteres de escape de una fila.
function LimpiaResultados(&$fila)
{
   foreach ($fila as $campo => $valor)
      if(is_string($valor) === true)
   $fila[$campo] = stripslashes($fila[$campo]);
}
// Función que comprueba errores de conexión devueltos por MySQL
function CompruebaErrorConexionMySQL($mensaje)
{
   if (mysqli_connect_errno() != 0)
   {
      echo $mensaje.' :'.mysqli_connect_error();
      exit();
   }
}
// Función que comprueba errores devueltos por MySQL
function CompruebaErrorMySQL($mensaje, $conexion)
{
   if (mysqli_errno($conexion) != 0)
   {
      echo $mensaje.' :'.mysqli_error($conexion);
      mysqli_close($conexion);
      exit();
   }
}
// Establecemos la conexión y seleccionamos la base de datos.
$db = mysqli_connect('localhost', 'comprador', 'proweb2013');

CompruebaErrorConexionMySQL('Error conectando con la Base de Datos');

// Seleccionamos la base de datos.
mysqli_select_db($db, 'uazon');

CompruebaErrorMySQL('Seleccionando la base de datos uazon', $db);
// Realizamos la consulta.
$consulta = " SELECT L.isbn, L.titulo, L.precio, A.nombre as autor" .
   " FROM libros as L, autores as A, libros_autores as LA " .
   " WHERE L.id = LA.fk_libros AND " .
   " A.id = LA.fk_autores " .
   " ORDER BY L.titulo";
$result = mysqli_query($db, $consulta);

CompruebaErrorMySQL('Error realizando la consulta: ' . $consulta, $db);
// Miramos si hemos obtenido alguna fila en el resultado.
if (mysqli_num_rows($result) > 0)
{
   echo '<h2>Listado de libros</h2>';
   echo '<table width="50%" border="1" cellspacing="1" >';
   echo'<tr>';
   echo'<th  >ISBN</th>';
   echo'<th >TITULO</th>';
   echo'<th >AUTOR</th>';
   echo'<th >PRECIO</th>';
   echo'';
   // Obtenemos la fila actual en un array asociativo y
   // desplazamos el cursor a la siguiente fila
   while ($fila = mysqli_fetch_assoc($result))
   {
      LimpiaResultados($fila);
      echo '<tr>';
      echo '<td >'. $fila['isbn'] . '</td>';
      echo '<td > '. $fila['titulo'] . '</td>';
      echo '<td >'. $fila['autor'] . '</td>';
      echo '<td >'. number_format($fila['precio'],2) . '&euro;</td>';
      echo'';
   }
}
else
   echo '<p>No hay libros dados de alta.</p>';

// Liberamos el resultado de la consulta.
mysqli_free_result($result);
// Cerramos la conexión a la base de datos.
mysqli_close($db);
?>

Ejemplo anterior usando excepciones y la metodología orientada a objetos (como vemos es más compacto):

<?php
// Función encargada de eliminar caracteres de escape de una fila-objeto.
function LimpiaResultados($objeto)
{
   foreach ($objeto as $atributo => $valor)
      if(is_string($objeto->$atributo) === true)
         $objeto->$atributo = stripslashes($objeto->$atributo);
}
try
{
   // Establecemos la conexión y seleccionamos la base de datos.
   $db = new mysqli('localhost', 'comprador', 'proweb2013', 'uazon');
   if (mysqli_connect_errno() != 0) {
      throw new Exception('Error conectando:' .
         mysqli_connect_error(), mysqli_connect_errno());
   }
   // Realizamos la consulta.
   $consulta =
      " SELECT L.isbn, L.titulo, L.precio, A.nombre as autor" .
      " FROM libros as L, autores as A, libros_autores as LA " .
      " WHERE L.id = LA.fk_libros AND " .
      " A.id = LA.fk_autores " .
      " ORDER BY L.titulo";
   $result = $db->query($consulta);

   if ($db->errno != 0)
      throw new Exception('Error realizando consulta:'.$consulta. ' ' . $db->error, $db->errno);

   if ($result->num_rows > 0)
   {
      echo '<h2>Listado de libros</h2>';
      echo '<table width="50%" border="1" cellspacing="1" >';
      echo '<tr>';
      echo '<th >ISBN</th>';
      echo '<th >TITULO</th>';
      echo '<th >AUTOR</th>';
      echo '<th >PRECIO</th>';
      echo '';
      // Obtenemos la fila actual en un objeto y
      // desplazamos el cursor a la siguiente fila
      while ($obj = $result->fetch_object())
      {
         LimpiaResultados($obj);
         echo '<tr>';
         echo '<td >'. $obj->isbn . '</td>';
         echo '<td > '. $obj->titulo . '</td>';
         echo '<td >'. $obj->autor . '</td>';
         echo '<td >'. number_format($obj->precio,2) . '&euro;</td>';
         echo '';
      }
      echo'';
   }
   else
      echo '<p>No hay libros dados de alta.</p>';
   $result->free(); // Liberamos el resultado.
}
catch (Exception $e)
{
   echo $e->getMessage();
}
$db->close(); // Cerramos la conexión a la base de datos.
?>

results matching ""

    No results matching ""