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: 49
Antigüedad: 3 años, 2 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: 219
Antigüedad: 2 años, 5 meses
Puntos: 81
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
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.886
Antigüedad: 4 años, 9 meses
Puntos: 349
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.



La zona horaria es GMT -6. Ahora son las 23:56.