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.
Elegir una API
PHP ofrece tres APIs diferenctes para conectarse a MySQL. Abajo se muestran las APIs proporcionadas por las extensciones mysql, mysqli, y PDO. Cada trozo de código crea una conexión al servidor de MySQL que se está ejecutando en "ejemplo.com" usando el nombre de usuario "usuario" y la contraseña "contraseña". Y se ejecuta una consulta para saludar al usuario.
Ejemplo #1 Comparación de las tres APIs 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 remendada
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 a partir de PHP 5.5.0 y será eliminada en el futuro. Se proporciona una matriz detallada de comparación de características más abajo. El rendimiento global de las tres extensiones se considera 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 | Sí | Sí | Sí |
| Estado de desarrollo | Activo | Activo | Sólo mantenimiento |
| Ciclo de vida | Activo | Activo | Obsoleto |
| Recomendada para nuevos proyectos | Sí | Sí | No |
| Interfaz POO | Sí | Sí | No |
| Interfaz procedimental | Sí | No | Sí |
| La API soporta el no bloqueo, consultas asíncronas con mysqlnd | Sí | No | No |
| Conexiones persistentes | Sí | Sí | Sí |
| La API soporta conjunto de caracteres | Sí | Sí | Sí |
| La API soporta sentencias preparadas del lado del servidor | Sí | Sí | No |
| La API soporta sentencias preparadas del lado del cliente | No | Sí | No |
| La API soporta procedimientos almacenados | Sí | Sí | No |
| API soporta sentencias múltiples | Sí | La mayoría | No |
| La API soporta transacciones | Sí | Sí | No |
| Las transacciones se pueden controlar con SQL | Sí | Sí | Sí |
| Soporta toda la funcionalidad de MySQL 5.1+ | Sí | La mayoría | No |
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.
To solve PDO limitations as described by michaeln at associations plus dot see eh, you may try to overwrite PDO methods:
<?php
class MyPdo extends PDO {
// What ever parameters PDO wants + prepend some own:
public function query($caller, $line, $foo, $bar, $bazz) {
// Do your stuff here with $caller, $line (e.g. logging for debug purposes)
// Then call the extended method
return parent::QUERY($foo, $bar, $bazz) or $this->myErrorHandler($caller, $line, $someSqlToLog);
}
}
?>
This is only a very basic example. You may otherwise choose to "wrap" the PDO class and save an instance of the "underlaying" PDO class inside the wrapper class. This is maybe a little more complex approach but allows you to have on interfaces in class signature + way better flexibility.
