Elegir una API

PHP ofrece tres API diferentes para conectarse a MySQL. Abajo se muestran las API proporcionadas por las extensiones mysql, mysqli, y PDO. Cada trozo de código crea una conexión al servidor de MySQL que se está ejecutando en "ejemplo.com" con el nombre de usuario "usuario" y la contraseña "contraseña". También se ejecuta una consulta para saludar al usuario.

Ejemplo #1 Comparación de las tres API de MySQL

<?php
// mysqli
$mysqli = new mysqli("ejemplo.com""usuario""contraseña""basedatos");
$resultado $mysqli->query("SELECT '¡Hola, querido usuario de MySQL!' AS _message FROM DUAL");
$fila $resultado->fetch_assoc();
echo 
htmlentities($fila['_message']);

// PDO
$pdo = new PDO('mysql:host=ejemplo.com;dbname=basedatos''usuario''contraseña');
$sentencia $pdo->query("SELECT '¡Hola, querido usuario de MySQL!' AS _message FROM DUAL");
$fila $sentencia->fetch(PDO::FETCH_ASSOC);
echo 
htmlentities($fila['_message']);

// mysql
$c mysql_connect("ejemplo.com""usuario""contraseña");
mysql_select_db("basedatos");
$resultado mysql_query("SELECT '¡Hola, querido usuario de MySQL!' AS _message FROM DUAL");
$fila mysql_fetch_assoc($resultado);
echo 
htmlentities($fila['_message']);
?>

API recomendada

Se recomienda usar las extensiones mysqli o PDO_MySQL. No se recomienda usar la extensión mysql antigua para nuevos desarrollos, ya que ha sido declarada obsoleta en PHP 5.5.0 y eliminada en PHP 7. Se proporciona una matriz detallada de comparación de características más abajo. El rendimiento global de las tres extensiones se considera que sea aproximadamente el mismo. Aunque el rendimiento de la extensión aporta solamente una fracción del total del tiempo de ejecución de una consulta web de PHP. A menudo, el impacto es tan bajo como 0.1%.

Comparación de características

  ext/mysqli PDO_MySQL ext/mysql
Versión de PHP donde se introdujo 5.0 5.1 2.0
Incluida con PHP 5.x
Incluida con PHP 7.x No
Estado de desarrollo Activo Activo Mantenimiento solamente en 5.x; eliminada en 7.x
Ciclo de vida Activo Activo Obsoleto en 5.x; eliminado en 7.x
Recomendada para nuevos proyectos No
Interfaz de POO No
Interfaz procedimental No
La API admite la no espera, consultas asíncronas con mysqlnd No No
Conexiones persistentes
La API admite conjunto de caracteres
La API admite sentencias preparadas del lado del servidor No
La API admite sentencias preparadas del lado del cliente No No
La API admite procedimientos almacenados No
API admite sentencias múltiples La mayoría No
La API admite transacciones No
Las transacciones se pueden controlar con SQL
Admite toda la funcionalidad de MySQL 5.1+ La mayoría No
add a note add a note

User Contributed Notes 4 notes

up
40
alvaro at demogracia dot com
11 years ago
Apart from the feature list, I suggest you try out both MySQLi and PDO and find out what API design you like most. MySQLi is more powerful and probably more complex to learn. PDO is more elegant and has the advantage that you only need to learn one PHP API if you need to work with different DBMS in the future.
up
8
rellect at gmail dot com
5 years ago
Another point to consider and one of the advantages of PDO is that it's not limited to mysql and supports other database engines such as PostgreSQL, SQLite, etc.
up
-37
Anonymous
7 years ago
These are quite possibly the most paradoxical lines in this table:

API supports non-blocking, asynchronous queries with mysqlnd
     ext/mysqli: Yes     PDO_MySQL: No
API supports client-side Prepared Statements
     ext/mysqli: No     PDO_MySQL: Yes

Apparently it's either asynchronous I/O or the security of bound parameters.
up
-51
michaeln at associations plus dot see eh
11 years ago
Another useful consideration to keep in mind when choosing your library is how extensible it is. Chances are, in any sufficiently advanced development scenario, you're going to be extending your database access class to add a method (or multiple methods) for how to handle database errors and alert the development team of errors and whether to have the code fail immediately or fail gracefully serving the user a user-friendly failure notice.

For example, I have a class where I have added extra parameters to the query() function (and a few others), which accept the __FILE__ and __LINE__ constants to facilitate tracking issues. If this were not reasonably possible with PDO-mysql for example (not sure, never used it), it may make one option or the other much less likely to be viable for your usage case.
To Top