2010-03-24 7 views
7

Estoy considerando cambiar a mysqli para todos mis proyectos de php. La forma en que está escrito mi código (ejecuto sitios web muy simples y construí mi propio marco básico que uso en todos). No debería tener demasiados problemas para modificar las funciones y las clases.cambiar a mysqli una buena idea?

Sin embargo, solo he escuchado cosas positivas sobre las declaraciones preparadas, pero me quejo de algunas de las funciones de php disponibles, sobre todo la falta de un simple reemplazo para usar mysql_fetch_array en un momento.

Esto suena demasiado bueno para ser verdad, así que me pregunto si alguien podría resaltar algunos de los problemas con el uso de declaraciones preparadas, como la velocidad y el uso de recursos.

Respuesta

2

La programación de las declaraciones preparadas lleva un tiempo acostumbrarse si solo está anexando variables a las cadenas de consulta. MySQL usa parámetros posicionales (su consulta contendrá signos de interrogación donde pertenecen los vars de reemplazo). La mejor apuesta es poner esto en su abstracción de base de datos existente. Si esa abstracción se escribió correctamente, no deberías estar llamando a mysql_fetch_array fuera del contenedor de todos modos.

La solución a este problema es solo recopilar todas las filas por adelantado, pero por supuesto eso supone que no recuperas 1000 filas y solo solicitas la primera. Este es un cambio que debes hacer independientemente de mysqli.

Finalmente, algunas afirmaciones no se reemplazan fácilmente por parámetros, como las consultas que utilizan la sintaxis in('x', 'y', 'z') con números variables de argumentos. Se puede hacer, pero es probable que desee enriquecer la abstracción de su base de datos para permitirle crear consultas y ejecutarlas.

La compensación, sin embargo, definitivamente vale la pena, en términos de rendimiento y seguridad. El procesamiento adicional en el lado PHP generalmente es superado por los planes de ejecución en caché para consultas en el lado de MySQL, y usted es inmune a muchas de las vulnerabilidades de inyección SQL más comunes.

Espero que ayude, Joe

+0

Gracias, he dedicado un tiempo a buscar en mysqli y he construido una clase (no va directamente a mi código, lo estaba usando para experimentar, pero ciertamente puedo ajustarlo). Las inyecciones de SQL es prácticamente la única razón por la que quiero usarlo. Pero estoy preocupado por posibles éxitos de rendimiento. He leído algunas cosas sobre el almacenamiento en caché no es el mismo cuando se utilizan declaraciones preparadas en comparación con la forma original de hacerlo, etc. – Rob

2

declaraciones preparadas son tan buenas que una vez que se acostumbre a ellos es dolorosa de usar funciones de escape de nuevo. Período.

Sin embargo, todas las bibliotecas DB que he usado alguna vez (incluyendo oci8 y sqlsrv ...) introducen una peculiaridad u otra. Así que básicamente encapsular cualquier biblioteca que uso con un simple conjunto de clases personalizadas que proporcionan las características en la forma I gusta:

parámetros basados ​​
  • Nombre: WHERE foo = :foo
  • de parámetros pasados ​​por valor de matriz asociativa (en vez de la unión a las variables de PHP individuales): $params = array('foo' => 33)
  • Una ejecución de la línea: $res = $Db->query($sql, $params);
  • resultsets son objetos que implementan la interfaz deIterator, así que puedo bucle con foreach($res as $row)

La adopción de esta política hace que la sintaxis o función exacta sea menos importante.

Lo que sea, aunque esto se puede lograr con casi cualquier biblioteca, ayuda si proporciona un enlace de param nativo para que (por ejemplo) no tenga que adivinar el tipo de datos.Además, algunas funciones avanzadas como las transacciones no se pueden hacer simplemente con funciones simples de mysql.

PDO podría haber sido una buena alternativa, pero la mayoría de sus controladores son básicamente abandonados, por lo que realmente pierdes el beneficio de tener una capa de abstracción DB-DBn mientras disfrutas de sus peligros.

En mi humilde opinión, el simple hecho de que está preguntando sugiere que debe darle una oportunidad a mysqli.

Cuestiones relacionadas