Foros del Web » Programando para Internet » PHP »

algún consejo ? o mejora para mi función de transacción

Estas en el tema de algún consejo ? o mejora para mi función de transacción en el foro de PHP en Foros del Web. Buen amigo del foro quiero compartir con una función para ver qué me dicen que puedo mejorar o como la aria más eficiente o detalles, ...
  #1 (permalink)  
Antiguo 08/04/2018, 23:41
 
Fecha de Ingreso: febrero-2015
Ubicación: venezuela
Mensajes: 50
Antigüedad: 3 años, 5 meses
Puntos: 0
algún consejo ? o mejora para mi función de transacción

Buen amigo del foro quiero compartir con una función para ver qué me dicen que puedo mejorar o como la aria más eficiente o detalles,
El asunto es que estoy haciendo unas aplicaciones pagos con mis clientes los cuales son los principales interesados por nuestra forma de negocios claro está el método de pago es por transferencia bancarias ellos usaría mi aplicación para pagar ciertos servicios que ofrezco pero también yo les transferiría a ellos dinero como ellos a mi
Entonces estoy haciendo las consultas necesarias para crear una solicitud de retiro que se guardara en mi tabla solicitudes como a su vez se le descuenta del saldo disponible el monto a retirar y se actualiza la el campo que guarda el saldo claro está en caso de que se cánsele la solicitud el dinero de monto de retiro se les volverá a sumar en su saldo disponible
No sabía nada de consultas para tablas con motores transaccionales ni de commit ni rollBack asi que quiero dejar mi código para que Ud. me den consejos o mejoras ya que esta face debe se súper segura a prueba de fallas para evitar la redundancia de datos o que me llegue un cliente molesto porque x algún problema de conexión no le devolvió su dinero cosa que según entiendo con autocommit(false); aria de varias consulta una sola y se efectuaría los cambios siempre y cuando todas las consultas se llevaron acabo



Código PHP:
Ver original
  1. // transacion de retiro
  2.     public function retiro_fondos($cajero, $cliente, $monto)
  3.     {
  4.         //escapamos variables de entrada
  5.         $cajero  = $this->con->real_escape_string($cajero);
  6.         $cliente = $this->con->real_escape_string($cliente);
  7.         $monto   = $this->con->real_escape_string($monto);
  8.  
  9.         //sacamos el monto disponible del usuario y id
  10.         $saldos     = $this->sal_user_id();
  11.         $saldo      = $this->saldo_user['saldo'];
  12.         $id_cliente = $this->saldo_user['id'];
  13.  
  14.         //Armamos $movi movimiento que se guarda en la tabla de movimientos de usuarios
  15.         $movi = "S/RETIRO - " . number_format($monto) . ' ' . MONEDA;
  16.  
  17.         //restamos de saldo el monto de retiro
  18.         $disponible = $saldo - $monto;
  19.  
  20.         //verificamos que el monto a retirar no sea mayor a monto disponible
  21.         if ($disponible >= "0") {
  22.  
  23.             //extraemos los datos del banco del cliente
  24.             $bancos = $this->banco_user();
  25.  
  26.             //datos del banco del cliente gradado con arreglo en tabla solicitudes
  27.             $datos = $this->saldo_user['non'] . '|' . $this->banco['nombre'] . '|' . $this->banco['cuenta'] . '|' . $this->banco['cedula'] . '|' . $this->banco['tipo'];
  28.  
  29.             //definimos la hora y fecha
  30.             $fecha = date('Y-m-d H:m:s');
  31.  
  32.             //Guardamos valores en tabla transicional
  33.             try {
  34.                 $this->con->autocommit(false);
  35.  
  36.                 //guarda la solicitud al cajero
  37.                 $solicitud = $this->con->prepare("INSERT INTO cajeros_solicitud(id_cajero,id_user,transaccion,monto,datos,proceso,fecha) VALUES (AES_ENCRYPT( ? ,'$this->code'), AES_ENCRYPT( ? ,'$this->code'), AES_ENCRYPT( '1' ,'$this->code'), AES_ENCRYPT( ? ,'$this->code'),AES_ENCRYPT( ? ,'$this->code'), AES_ENCRYPT( '0' ,'$this->code'),? )");
  38.                 $solicitud->bind_param("iisss", $cajero, $id_cliente, $monto, $datos, $fecha);
  39.                 $solicitud->execute();
  40.  
  41.                 //actualiza el saldo disponible del cajero
  42.                 $saldo_update = $this->con->prepare("UPDATE user_segure SET token=AES_ENCRYPT( ? ,'$this->code') WHERE AES_DECRYPT(id_user,'$this->code') = ?");
  43.                 $saldo_update->bind_param("is", $disponible, $id_cliente);
  44.                 $saldo_update->execute();
  45.  
  46.                 //guarda registro del movimiento solicirud de retiro
  47.                 $movimientos = $this->Movimientos_insert('0', $movi, $id_cliente);
  48.                 echo "correcto";
  49.                 $this->con->commit();
  50.             } catch (Exception $e) {
  51.                 echo ERROR_DIE;
  52.                 $this->con->rollBack();
  53.             }
  54.  
  55.             //else muestra mensaje si el monto a retirar es mayor al saldo disponible
  56.         } else {
  57.             echo DIV_OPEN_WAR . '' . STRONG_ATENCION . ' Monto A Retirar: ' . number_format($monto) . ' ' . MONEDA . ' Supera Su Saldo Disponible: ' . number_format($saldo) . ' ' . MONEDA . '' . DIV_CLOSE2;
  58.         }
  59.  
  60.     }
  #2 (permalink)  
Antiguo 10/04/2018, 09:16
 
Fecha de Ingreso: noviembre-2015
Mensajes: 228
Antigüedad: 2 años, 8 meses
Puntos: 84
Respuesta: algún consejo ? o mejora para mi función de transacción

Si usas consultas preparadas no es necesario usar real_escape_string

Por otro lado, no veo la necesidad de usar transacciones. Estas se usan para prevenir inconsistencias. Por ejemplo; haces una inserción a una tabla y actualizas otra basándose en el registro insertado, si falla la actualizacion creará una inconsistencia
  #3 (permalink)  
Antiguo 11/04/2018, 09:04
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.912
Antigüedad: 5 años
Puntos: 358
Respuesta: algún consejo ? o mejora para mi función de transacción

Creo que las transacciones estan bien sobre todo porque supongo que en algún momento haces comunicación con la pasarela del banco y si falla algo debes de tener la posibilidad de deshacer los cambios si sucede algo inesperado en cualquier punto. fuera de eso lo que te puedo aconsejar es que mejores la legibilidad de tu código y con eso vas a reducir el numero de comentarios y se va entender que sucede en tu código a simple vista.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #4 (permalink)  
Antiguo 24/04/2018, 09:12
 
Fecha de Ingreso: febrero-2015
Ubicación: venezuela
Mensajes: 50
Antigüedad: 3 años, 5 meses
Puntos: 0
Respuesta: algún consejo ? o mejora para mi función de transacción

Cita:
Iniciado por mpozo Ver Mensaje
Si usas consultas preparadas no es necesario usar real_escape_string

Por otro lado, no veo la necesidad de usar transacciones. Estas se usan para prevenir inconsistencias. Por ejemplo; haces una inserción a una tabla y actualizas otra basándose en el registro insertado, si falla la actualizacion creará una inconsistencia
bueno como ves uso la transacción porque estoy trabajando con dinero real y bien sabemos que la transacción hace una unificación de todas las consulta si alguien hace una solicitud de retiro de dinero automáticamente se le descuenta de su saldo el monto de la solicitud pero que pasa si por alguna razón algo falla en el servidor y se descuenta el saldo del usuario mas sin embargo no se logra guardar en la base de dato la solicitud de retiro, pues yo jamás sabría que el usuario realizo un retiro y me llegara a reclamar que porque no le he depositado la solicitud de retiro si ya de por si se la desconté de su saldo actual y yo estaría de inocente porque sencillamente no existe la solicitud de retiro

Por ello tengo una tabla que guarda todas las solicitudes de retiro y recarga
Otra que guarda el movimiento que hace el usuario con su dinero
Y otra donde está el total del saldo del usuario
Por tanto si en el procedo de consulta a esas tres tablas una falla, ya estamos creando una inconsistencia de datos
Tal vez con un usuario conectado no pase esos errores pero si llegan haber unas 2000 personas conectadas ???
No se alguien opine ??
  #5 (permalink)  
Antiguo 24/04/2018, 09:29
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 10 años, 2 meses
Puntos: 528
Respuesta: algún consejo ? o mejora para mi función de transacción

Cuando se hace una operación que involucre más de una tabla, se aconseja el uso de transacciones.

Quizá mpozo no notó que estás usando más de una tabla.

Lo que sí, es que si usas consultas preparadas no necesitas escapar los datos de entrada, sería redundante.

Mi único comentario es que no sé como estás obteniendo los saldos, ya que en tu código no se ve, y cuando se habla de transacciones seguras y que vas a actualizar, como en este caso el saldo, la obtención de datos mediante SELECT debe hacerse usando FOR UPDATE.

Es decir:
1. Inicias la transacción
2 Obtienes el saldo con SELECT saldo FROM tabla FOR UPDATE
3 Haces las operaciones necesarias.
4 Actualizas el saldo, sea restando o sumando.
5 Finalizas la transacción.

De lo contrario, podría darse el caso, aunque sea muy remoto, de que dos o más usuarios quieran hacer la misma transacción y se generen más que inconsistencias, pérdida de valores.



La zona horaria es GMT -6. Ahora son las 15:08.