php - usar - que es pdo en informatica




Desventajas de PDO(objetos de datos PHP) (4)

Todo lo que he leído hasta ahora sobre PDO (PHP Data Objects) es casi demasiado bueno para ser verdad.

Quiero decir:

  • Es más rápido que mysql o mysqli.
  • Tiene la misma sintaxis para múltiples controladores de bases de datos.
  • con declaraciones preparadas es seguro para inyección SQL.
  • puede obtener datos directamente en un objeto.

Pero, ¿cuáles son las desventajas de PDO?


Todo lo que he leído hasta ahora sobre PDO (PHP Data Objects) es casi demasiado bueno para ser verdad.

Uso PDO todos los días, y eso por una razón. Sí escribí un contenedor, porque la instancia predeterminada de PDO hace cosas que no me gustan (por ejemplo, fallar silenciosamente), y la API podría haber sido mucho mejor. La configuración con constantes simplemente no es mi enfoque predeterminado. Además, he creado algunos métodos de conveniencia.

Es más rápido que mysql o mysqli.

¿Lo es? No sé de dónde sacó esto, y podría ser cierto, pero no he oído que PDO sea más rápido que las bibliotecas nativas de MySQL.

Tiene la misma sintaxis para múltiples controladores de bases de datos.

Más o menos Uso PostgreSQL mucho, y el código es diferente de cuando estás trabajando con MySQL. Sin embargo, esto tiene sentido, ya que PostgreSQL funciona con secuencias con nombre, mientras que MySQL funciona con "incremento automático", que es una secuencia por tabla. Existen diferencias entre las bases de datos que PDO no puede abstraer, incluso si solo es para el acceso a la base de datos.

con declaraciones preparadas, es seguro para la inyección sql.

También puede preparar declaraciones con mysqli , por lo que no veo esto como una ventaja definitiva. Sin embargo, en general uso declaraciones preparadas, y me gusta la sintaxis de campo que proporciona PDO.

Pero, ¿dónde están las desventajas de PDO, algo que tiene tantos profesionales también debe tener una contra.

La API es menos que intuitiva para mí, creo que la API de mysqli tiene más sentido. Sin embargo, si escribes un envoltorio para ti, es una biblioteca muy decente. Aquí está la envoltura que escribí para hacer que el uso de PDO sea un poco más sensato, aunque hay muchos más ejemplos a la deriva en Internet.

EDITAR : Ah, y James Anderson tiene razón; tiene poca compatibilidad con Oracle. No uso Oracle, así que no lo veo como un gran inconveniente.


Dos desventajas que conozco:

¡Sin o con poco soporte de Oracle!

Algunos resultados de rendimiento en grandes conjuntos de resultados.

En lo que a mí respecta, el primer "inconveniente" es una razón más para evitar a Oracle. El segundo rara vez importa.


Es más rápido que mysql o mysqli.

incorrecto. en la vida real es más lento en general.

Tiene la misma sintaxis para múltiples controladores de bases de datos.

para las funciones de API, sí, por supuesto. pero no te ayudará con diferentes dialectos SQL.

con declaraciones preparadas, es seguro para la inyección sql.

para asegurarse contra las inyecciones de sql, cuatro asuntos deben ser escapados adecuadamente:

  • instrumentos de cuerda
  • números
  • identificadores
  • operadores

mientras que PDO cubre solo los dos primeros.


El mecanismo de vinculación no funciona con nombres de columnas o tablas.

Ejemplos simples:

CREATE TABLE :bar (rowId int)

SELECT :foo FROM :bar

Por el lado positivo, esto no es algo que a menudo necesite o desee hacer.

Pero cuando lo haces ... PDO te deja colgando. La solución consiste en concatar manualmente las cadenas de consulta mientras se realiza el escapado manual:

$foo = some_escape_logic( $dirtyFoo );
$bar = some_escape_logic( $dirtyBar );

$db->query( "SELECT {$foo} FROM {$bar}" );

Los resultados de SQL siempre se devuelven como cadenas

fetch () devuelve una matriz de valores de cadena, incluso si los tipos de tabla SQL son numéricos. Por ejemplo, una tabla con columnas bigint / string / bigint devuelve:

array( 'rowId' => '1', 'name' => 'Fred', 'age' => '12' );

en lugar de:

array( 'rowId' => 1, 'name' => 'Fred', 'age' => 12 );

Como algo positivo, nunca perderá precisión debido a una falta de coincidencia entre los tipos de PHP y SQL. El tipo de malabarismo en PHP también asegura que rara vez se dará cuenta de que los datos fueron originalmente codificados como cadenas.

Como negativo, esto puede ser un dolor al pasar los resultados de DB a algo así como json_encode (), ya que terminará con los valores numéricos citados:

{ "rowId": "1", "name": "Fred", "age": "12" }

en lugar de

{ "rowId": 1, "name": "Fred", "age": 12 }

En un mundo ideal, los tipos de salida de autoenvío de fetch () serían controlables mediante un argumento opcional.





pdo