Jump to content


Photo

PDO Statement Vs Transacciones


  • Please log in to reply
3 replies to this topic

#1 dbarreno

dbarreno

    Newbie

  • Miembros
  • Pip
  • 2 posts

Posted 16 October 2012 - 01:59 AM

En primer lugar un saludo a todos,
Hace tiempo que estoy dando vueltas a un tema, en primer lugar me es complicado comprender cómo se empieza a aprender PHP con los accesos tradicionales a las bases de datos, existiendo desde la version 5.1 de PHP la clase PDO y sobre todo su extension PDOStatement y la seguridad que nos proporciona en las consultas protegiendonos de la inyeccion de codigo. Y no es necesario saber programar en clases para usarla, solo hay que aprender cómo se usa igual que una conexion estandar. Me indigna esto porque hace un año que empecé en este mundo y me pagué un curso presencial de varios meses que todavía estoy pagando y ni siquiera me mencionaron que existía esta librería  :angry:
Pero esto es otro tema, voy al grano a plantear mi duda a ver si alguien me puede ayudar.
En un principio PDOStatement nos protege de la inyeccion de codigo SQL (hablo de SQL, porque yo trabajo con MySQL), digamos que "reservando" un hueco en la query  para las variables susceptibles de ser atacadas por GET, POST, COOKIES etc... ese hueco se rellena luego con el método bindValue() antes de ejecutar la consulta, lo he probado y funciona a la perfección. Cuando lo empecé a usar decidí que ya siempre iba a usar PDOStatement para todo, hasta que llegué a las necesidad de realizar Transacciones para proteger insercciones o modificaciones de varios datos encadenados y dependientes unos de otros.
Para quien no sepa, (y si me equivoco ruego que los expertos me corrijan para no liar a nadie) una transaccion se utiliza cuando tenemos que insertar, modificar o borrar un bloque de datos, por ejemplo, en diferentes tablas, pero que obligatoriamente se tienen que realizar con exito todas y en el caso de que una de ella de un error tenemos la posibilidad de deshacer todas las demas, digamos que viene a ser como el "CONTROL-Z" de una operacion con bases de datos. Con esto evitamos muchos posibles problemas de insertar datos mal.
El problema me surge porque necesito hacer las dos cosas y no lo he conseguido, hay que elegir entre PDOStatement o Transaccion, que es un metodo de la clase PDO y que no funciona con PDOStatement.
Si alguien sabe cómo hacer las dos cosas a la vez lo agradecería mucho, porque hay situaciones dificiles de decidir cual de los dos elegir.
Esta claro que las transacciones son mas importantes en muchas ocasiones, porque los datos se pueden validar y proteger de otra forma y la transaccion no, pero por mucha funcion que me pueda inventar siempre el prepared statement será mas seguro y rápido.

Saludos!!

  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 16 October 2012 - 07:30 AM

Saludos amigo mio...

Antes que nada bienvenido a esta tu casa dónde espero encuentres no solo apoyo ténico sino además amigos nuevos...

Ahora, respecto la cuestión de este hilo te comento que incrustar sentencias sql en tu código php o en tus bloques html es una de las peores prácticas que se puedan tener por lo siguiente:

  • El código sql incrustado en nuestras aplicaciones php abre la posibilidad de sufrir ataques por sql injection
  • Al incrustar código sql en php desperdicias una de las grandes características de nuestros motores de bases de datos: El plan de ejecución
  • Gestionar la transaccionalidad desde el script siempre exige trabajo adicional que al final es tiempo perdido por algo que ya está hecho
  • El control de transaccionalidad siempre dependerá del script que invoca el bloque de sentencias lo que aumenta el riesgo de bloqueos en nuestra base de datos



Ok ok, dirás y entonces que debe hacerse, bueno, la respuesta es muy sencilla.... Usa Procedimientos almanceados. Mysql en su versión actual soporta procedimientos almaceanados tanto para su Engine InnoDb como para el Engine MyIsam por lo  que no deberás tener problema en su implementación. Además, al usar procedimientos almacenados permites que el motor de base de datos optimice tus operaciones de lectura y escritorua de datos y además gestione las transacciones de una manera tan sencilla como colocar star Transaction y commit...

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;


máss info de la transaccionalidad de mysql aquí

http://dev.mysql.com.../es/commit.html


Espero con esto haber sido de ayuda para tu problema...


Saludos cordiales
  • 0

#3 dbarreno

dbarreno

    Newbie

  • Miembros
  • Pip
  • 2 posts

Posted 19 October 2012 - 01:45 AM

Muchas gracias por la informacion,
Lo voy a mirar, al ver tu respuesta me dio una idea y en lugar de usar el metodo beginTransaction... de PDO, para usarlo con PDO Statement directamente ejecuté las Querys "START TRANSACTION" , "COMMIT" o "ROLLBACK" y funcionó. Para salir del paso ahora me viene bien.

Pero tienes razón, no dejan de ser sentencias SQL incrustadas en el PHP y me he puesto a estudiar en serio los procedimientos almacenados para poder aplicarlos cuanto antes a mis aplicaciones.

Un saludo
  • 0

#4 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 19 October 2012 - 07:14 AM

Me alegra que te haya sido útil y te agradezco por compartirnos tu solución. Saludos
  • 0




IP.Board spam blocked by CleanTalk.