[php] mysqli o PDO: ¿cuáles son los pros y los contras?


5 Answers

Mover una aplicación de una base de datos a otra no es muy común, pero tarde o temprano puede encontrarse trabajando en otro proyecto usando un RDBMS diferente. Si está en casa con PDO, al menos habrá una cosa menos que aprender en ese momento.

Aparte de eso, encuentro que la API PDO es un poco más intuitiva y se siente más orientada a objetos. mysqli siente que es solo una API de procedimiento que ha sido objetivada, si sabes a lo que me refiero. En resumen, creo que es más fácil trabajar con PDO, pero eso es, por supuesto, subjetivo.

Question

En nuestro lugar, estamos divididos entre usar mysqli y PDO para cosas como declaraciones preparadas y soporte de transacciones. Algunos proyectos usan uno, algunos el otro. Hay pocas posibilidades realistas de que nos mudemos a otro SGBDR.

Prefiero PDO por la única razón de que permite parámetros con nombre para las declaraciones preparadas, y hasta donde yo sé mysqli no lo hace.

¿Hay otros pros y contras para elegir uno sobre el otro como estándar, ya que consolidamos nuestros proyectos para utilizar un solo enfoque?




PDO es el estándar, es lo que la mayoría de los desarrolladores esperarán usar. mysqli fue esencialmente una solución a medida para un problema en particular, pero tiene todos los problemas de las otras bibliotecas específicas de DBMS. PDO es donde todo el trabajo arduo y el pensamiento inteligente irán.




Otra diferencia (buena) notable sobre PDO es que su método PDO::quote() agrega automáticamente las citas mysqli::real_escape_string() , mientras que mysqli::real_escape_string() (y similares) no:

PDO :: quote () coloca comillas alrededor de la cadena de entrada (si es necesario) y escapa caracteres especiales dentro de la cadena de entrada, utilizando un estilo de cita apropiado para el controlador subyacente.




Una cosa que PDO tiene que MySQLi no es que realmente me gusta es la capacidad de PDO para devolver un resultado como un objeto de un tipo de clase específico (por ejemplo, $pdo->fetchObject('MyClass') ). MySQLi's fetch_object() solo devolverá un objeto stdClass .




Respuesta editada

Después de tener algo de experiencia con estas dos API, diría que hay 2 características de nivel de bloqueo que hacen que mysqli no se pueda usar con las declaraciones preparadas nativas.
Ya fueron mencionados en 2 respuestas excelentes (aunque subestimadas):

  1. Valores de enlace a una cantidad arbitraria de marcadores de posición
  2. Devolver datos como una mera matriz

(Ambos también se mencionan en esta respuesta )

Por alguna razón, mysqli falló con ambos.
Hoy en día obtuvo algunas mejoras para el segundo ( get_result ), pero solo funciona en instalaciones mysqlnd, lo que significa que no puede confiar en esta función en sus scripts.

Sin embargo, no tiene enlace por valor, incluso hasta el día de hoy.

Entonces, solo hay una opción: PDO

Todas las otras razones, como

  • marcadores de posición nombrados (esta sintaxis azúcar está sobrevalorada)
  • soporte de bases de datos diferentes (en realidad nadie lo usó nunca)
  • buscar en el objeto (solo azúcar sintaxis inútil)
  • diferencia de velocidad (no hay ninguna)

no tienen ninguna importancia significativa.

Al mismo tiempo, estas dos API carecen de algunas características realmente importantes , como

  • identificador de marcador de posición
  • marcador de posición para los tipos de datos complejos para hacer que el enlace dinámico sea menos laborioso
  • código de aplicación más corto.

Entonces, para cubrir las necesidades de la vida real , uno tiene que crear su propia biblioteca de abstracción, basada en una de estas API, implementando marcadores de posición analizados manualmente. En este caso, preferiría mysqli, ya que tiene un menor nivel de abstracción.




En el sentido de la velocidad de ejecución, MySQLi gana, pero a menos que tenga una buena envoltura usando MySQLi, sus funciones relacionadas con las declaraciones preparadas son terribles.

Todavía hay errores en el mío, pero si alguien lo quiere, aquí está .

En resumen, si está buscando un aumento de velocidad, entonces MySQLi; si quieres facilidad de uso, entonces PDO.




Related