Ver Mensaje Individual
  #12 (permalink)  
Antiguo 19/03/2018, 13:26
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: ejecutar una funcion dentro de otra

Cita:
Iniciado por stevens82 Ver Mensaje
Gracias por tus respuestas, modifique el codigo asi:

Controller:

Código PHP:
$fecha_enc date('Y-m-d'strtotime($_POST['fecha_enc']));
            
$candidato $_POST['candidato'];

            
$this->_encuestas->registrarEncuesta(
            
$this->getPostParam('titulo'),
            
$this->getPostParam('cargo'),
            
$this->getPostParam('departamento'),
            
$this->getPostParam('provincia'),
            
$this->getPostParam('distrito'),
            
$fecha_enc,
            
$candidato); 
y en el model:

Código PHP:
public function registrarEncuesta($titulo$cargo$departamento$provincia$distrito$fecha_enc, array $id_candidato)
    {
        try {
            
$this->_db->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
            
$this->_db->beginTransaction(); // iniciar transacción
            
$a $this->_db->prepare("INSERT INTO encuestas (id, titulo, id_cargo, id_pais, id_departamento, id_provincia, id_distrito, fecha_encuesta, fecha_registro, usuario_registrador) VALUES (null, :titulo, :cargo, 1, :departamento, :provincia, :distrito, :fecha_enc, now(), '" Session::get('id_usuario') . "')"
                
)->execute(array(
                    
':titulo'           => $titulo,
                    
':cargo'            => $cargo,
                    
':departamento'     => $departamento,
                    
':provincia'        => $provincia,
                    
':distrito'         => $distrito,
                    
':fecha_enc'        => $fecha_enc)
                );
            
$lastReciboId $this->_db->lastInsertId();
            if (!
$a) {
                throw new 
Exception("ERROR AL INGRESAR LOS DATOS");
            } else {
                for (
$i=0$i<count($id_candidato); $i++) {
                    
$sql "INSERT INTO opciones (id, id_encuesta, id_candidato) VALUES (null, :id_encuesta, :id_candidato)";
                    
$b $statement $this->_db->prepare($sql);
                    
$statement->execute(array(
                    
':id_candidato'  => $id_candidato[$i],
                    
':id_encuesta'   => $lastReciboId
                
));
                }
                if(
$a && $b) {
                    
$this->_db->commit();
                } else {
                    
$this->_db->rollBack();
                }
            }
            
// echo 'Datos insertados correctamente';
        
} catch (PDOException $e) {
            
// si ocurre un error hacemos rollback para anular todos los insert
            
$this->_db->rollBack();
            throw 
$e;
            
// echo $e->getMessage();
        
}
    } 
Ahra hare el editar, gracias
No era necesario complicar tu códifgo como lo hiciste para capturar excepciones.
Tu código original estaba bien, solo tienes que capturar una excepción mas general porque solo esperas que falle los insert y pueden suceder otras cosas.
agrega un catch adicional para que captures un Exception y debe de funcionar sin necesidad de usar condiciones
Código PHP:
Ver original
  1. public function registrarEncuesta($titulo, $cargo, $departamento, $provincia, $distrito, $fecha_enc, $id_candidato)
  2. {
  3.         try {
  4.             $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  5.             $this->_db->beginTransaction();
  6.            
  7.             $this->_db->prepare("INSERT INTO encuestas (id, titulo, id_cargo, id_pais, id_departamento, id_provincia, id_distrito, fecha_encuesta, fecha_registro, usuario_registrador) VALUES (null, :titulo, :cargo, 1, :departamento, :provincia, :distrito, :fecha_enc, now(), '" . Session::get('id_usuario') . "')"
  8.                 )->execute(array(
  9.                     ':titulo'           => $titulo,
  10.                     ':cargo'            => $cargo,
  11.                     ':departamento'     => $departamento,
  12.                     ':provincia'        => $provincia,
  13.                     ':distrito'         => $distrito,
  14.                     ':fecha_enc'        => $fecha_enc)
  15.                 );
  16.                
  17.             $lastReciboId = $this->_db->lastInsertId();
  18.             for ($i=0; $i<count($id_candidato); $i++) {
  19.                 $sql = "INSERT INTO opciones (id, id_encuesta, id_candidato) VALUES (null, :id_encuesta, :id_candidato)";
  20.                 $statement = $this->_db->prepare($sql);
  21.                 $statement->execute(array(
  22.                     ':id_candidato'  => $id_candidato[$i],
  23.                     ':id_encuesta'   => $lastReciboId
  24.                 ));
  25.                 }
  26.  
  27.             $this->_db->commit();
  28.             echo 'Datos insertados';
  29.            
  30.         } catch (PDOException $e) {
  31.             // si ocurre un error hacemos rollback para anular todos los insert
  32.             $this->_db->rollBack();
  33.             echo $e->getMessage();
  34.         } catch (Exception $e) {
  35.             //si sucede otra cosa inesperada
  36.             $this->_db_rollbak()
  37.             //aqui puedes mandar a un log el mensaje de error $e->getMessage()
  38.         }
  39. }
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.