PHP dispone de dos métodos de conexión a MySQL recomendados (mysqli y PDO). En esta guía aprenderás cómo y cuando debe ser utilizado cada uno de ellos.
Además de estos dos métodos de conexión a MySQL existe otro método creado originalmente con PHP y aunque se puede ver en códigos antiguos, este ha quedado obsoleto desde PHP 5.5 y eliminado con la llegada de PHP7.
Métodos de conexión recomendados
Existen 2 métodos de conexión a MySQL recomendados con PHP.
- mysqli (es una extensión de MySQL mejorada, que permite conexiones a MySQL 4.1.3>)
- PDO (PHP Data Objects) para poder conectar a MySQL y otras bases de datos.
mysqli
La extensión mysqli permite usar su interfaz (API) de dos formas diferentes:
- Procedimental (procedural): se invocan funciones para llevar a cabo las tareas.
- Haciendo uso de Objetos (Orientada a Objetos): se instancia una clase para luego poder invocar sus métodos.
Interfaz procedimental (mysqli)
La interfaz procedimental de mysqli es muy similar en cuanto a su forma de utilización con la antigua interfaz de PHP para conexiones de MySQL (obsoleta).
Es recomendable hacer uso de ella cuando necesitamos migrar las consultas de una aplicación antigua a su versión moderna mysqli.
Por lo que la función mysql_query($sql) se resolvería cambiándola a mysqli_query($sql), la función mysql_fetch_assoc($consulta) se resolvería cambiándola a mysqli_fetch_assoc($consulta), etc …
Veamos un ejemplo de como crear una conexión y una consulta procedimental:
1 2 3 4 5 6 7 8 9 |
// conexión $db = mysqli_connect(_HOST, _DB_USER, _DB_PASSWORD, _DB); // consulta $sql = "select * from empleados"; $consulta = mysqli_query($db, $sql); while ($fila = mysqli_fetch_array($consulta)) { echo $fila["nombre"]."<br />"; } |
Orientada a Objetos (mysqli)
La interfaz mysqli Orientada a objetos es sencilla y fácil de aprender. Todas sus clases (mysqli, mysqli_stmt, mysqli_result, etc …) tienen sus métodos agrupados y organizados según su uso.
Es recomendable usar mysqli orientado a objetos si estás creando una nueva aplicación; es modulable, fácil de mantener y de reutilizar.
Veamos un ejemplo sencillo de conexión y listado de registros de una tabla usando la API de mysqli orientada a objetos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* OBJECT mysqli PHP5> */ $db = new mysqli(_HOST, _DB_USER, _DB_PASSWORD, _DB); // Check connection if ($db->connect_errno) { die("error de conexión: ".mysqli_connect_error()); } // ejecutando una consulta simple $consulta = $db->query("select * from empleados"); while ($filas = $consulta->fetch_array()) { echo $filas["nombre"]."<br />"; } echo "Total: ".$consulta->num_rows; |
Otra de las ventajas que nos ofrece mysqli es que permite realizar consultas preparadas para así ejecutar sentencias SQL repetidamente.
Una sentencia preparada envía una plantilla con la consulta SQL para que el servidor compruebe que la sintaxis es correcta y a continuación realiza la ejecución de la consulta con los valores que le vayamos asignando.
1 2 3 4 5 6 7 8 9 |
// mysqli, consulta preparada $stmt = $db->prepare("select * FROM empleados WHERE cargo = ?"); $cargo = "Sistemas"; $stmt->bind_param('s', $cargo); $stmt->execute(); $consulta = $stmt->get_result(); while ($filas = $consulta->fetch_array()) { echo $filas["nombre"]."<br />"; } |
Los variables agregadas usando bind_param(), pueden ser de tipo s (cadena), i (entero), d (doble) y b (blob).
PDO (PHP Data Objects)
El driver PDO para MySQL está desarrollado en PHP y además de conectar con bases de datos MySQL, permite conectar a otras motores de Bases de Datos (odbc, firebird, sqlite, sqlsrv, oci, pgsql, etc …).
Para comprobar los controladores disponibles de tu servidor ejecuta:
1 |
print_r(PDO::getAvailableDrivers()); |
PDO está compuesta por 3 clases:
- PDO, es la clase encargada de la conexión con la Base de Datos, transacciones e instancias de la la clase PDOStatement.
- PDOStatement, es la clase que controla las sentencias preparadas de SQL y es la encargada de devolver los resultados.
- PDOException, es la clase que se encarga del control de errores.
Una conexión PDO se inicia creando una instancia de la clase PDO, la cual permanece activa hasta que es finalizada o destruida por el usuario.
Una de las ventajas de PDO es que puede crear conexiones persistentes que son almacenadas en cache. De esta manera se evita la carga de tener que realizar una nueva conexión a la Base de Datos.
Veamos un sencillo ejemplo de conexión a una base de datos MySQL haciendo uso de PDO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// configuraciónes define ('_DB_DRIVER', 'mysql'); define ('_DB_HOST', 'localhost'); define ('_DB_NAME', 'tuBd'); define ('_DB_USER', 'tuUsuario'); define ('_DB_PASSWORD', 'tuClave'); define ('_DB_CHARSET', 'utf8'); // conexión PDO try { $db = new \PDO('mysql:host='._DB_HOST.'; dbname='._DB_NAME, _DB_USER, _DB_PASSWORD); $db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $db->exec('SET CHARACTER SET '._DB_CHARSET); } catch (\PDOException $e) { print "Error!: " . $e->getMessage(); die(); } |
Para controlar los reportes de errores, configuraciones de columnas, tiempos de espera, etc … asignaremos atributos. Puedes consultar que atributos asignar siguiendo este enlace.
PDO también permite hacer uso de consultas sql preparadas, que serán ejecutadas por el método execute() a través de la clase PDOStatement. Las sentencias pueden contener tantos parámetros como deseemos y podemos hacer uso de ellos con dos sintaxis diferentes:
- mediante marcadores utilizando nombres (:name)
- con marcadores posicionales mediante el uso de signos de interrogación (?) al igual que con mysqli.
Siempre que una sentencia preparada se ejecuta con éxito, esta devolverá un objeto PDOStatement y en caso contrario devolverá una objeto PDOException.
Veamos un sencillo ejemplo de una consulta preparada con asignación de nombres:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// consulta preparada usando marcadores $cargo = "sistemas"; $stmt = $db->prepare("select * from empleados where cargo = :cargo "); $stmt->bindParam('cargo', $cargo); $stmt->execute(); foreach ($stmt->fetchAll() as $values) { echo $values["nombre"]. " <".$values["email"]."><br />"; } // consulta preparada usando marcadors posicionales (?) $cargo = "gerente"; $stmt = $db->prepare("select * from empleados where cargo = ? "); $stmt->bindParam(1, $cargo); $stmt->execute(); foreach ($stmt->fetchAll() as $values) { echo $values["nombre"]. " <".$values["email"]."><br />"; } |
No siempre necesitamos hacer uso de consultas preparadas, por lo que podemos usar la clase PDO directamente a través de sus métodos query() o exec(). El primero lo usaremos para realizar consultas (select) y el segundo para consultas (insert, update, delete) ya que nos proporciona información con el número de filas que han sido afectadas.
Aún así es mejor ver como funcionan cada uno de ellos con unos ejemplos:
1 2 3 4 5 |
// consulta usando query() $consulta = $db->query("select * from empleados"); foreach($consulta as $filas) { echo $filas["nombre"]. " <".$filas["email"]."><br />"; } |
1 2 3 |
// consulta usando exec() $consulta = $db->exec("delete from empleados where id = 3"); echo "se eliminaron: ".$consulta." registros"; |