Codeigniter - passing array to controler

0

Good afternoon everyone, I have a problem with my code and would like some help in solving it. It works like this: I get a form 3 variables (event_id, user_quality and user_id - the latter comes from a multiple select with the name = user_id []).

I tested the console and when selecting in the multiple select in the form, the information in the POST comes correct (user_id [] = 1 and userid [] = 2, when I select two users, for example).

The issue is that when I get this information in the controller and game in foreach so that each incoming user is inserted into the database, only 1 of them is added.

Function code in the controller that receives the form data:

public function gerarCertificado(){
    if(esta_logado()){
        $usuario = $this->session->userdata("usuario_logado");

        $id_evento = $this->input->post('id_evento');
        $evento = $this->EventosModel->buscarEvento($id_evento);
        $dadosEvento = array('evento' => $evento);
        $qualidade = $this->input->post('qualidade');

        $id_usuarios_selecionados = $this->input->post('id_usuario');

        foreach ($id_usuarios_selecionados as $id_user) {
            $existeCert = $this->UsuariosModel->verificarCertificado($id_user, $id_evento);
            // usuario selecionado já possui certificado
            if($existeCert){ 
                $this->session->set_flashdata("danger", "Algum dos usuários selecionados já possui certificado para este evento");
                redirect('/eventos/certificados/' . $id_evento);
            // usuario selecionado não possui certificado no evento escolhido --> inserir na tabela certificados
            }else{

                if($this->UsuariosModel->gerarCertificado($id_evento, $id_user, $qualidade)){
                    $this->session->set_flashdata("success", "Certificados gerados!");

                }else{
                    $this->session->set_flashdata("danger", "Erro ao gerar certificados!");
                }
                redirect('/eventos/certificados/' . $id_evento);
            }
        }
    }else{
        redirect('/');
    }
}

Function code in the model that inserts into the DB:

public function gerarCertificado($id_evento, $id_user, $qualidade){
    if($this->db->query("insert into certificados (id_evento, id_usuario, qualidade) values ('".$id_evento."','".$id_user."','".$qualidade."')")){
        return TRUE;
    }else{
        return FALSE;
    }
}

In short, when I select more than 1 user in the select, the function only runs 1 with 1 of the selected users.

Thank you!

    
asked by anonymous 13.11.2017 / 21:33

1 answer

0

In your explanation of a checkbox with the name "user_id []", but in your code you have:

$id_usuarios_selecionados = $this->input->post('id_usuario');

I think it should be:

$id_usuarios_selecionados = $this->input->post('usuário_id');

Well, anyway, I think the problem might be in the redirects you have in the foreach loop, because if a user has a certificate or not, there's a redirect to another page. Which implies that only one record is processed, no matter how many you have selected.

In my interpretation, you should pass the redirect to after the foreach loop, so (I also fixed the flash_messages):

foreach ($id_usuarios_selecionados as $id_user) {
    $existeCert = $this->UsuariosModel->verificarCertificado($id_user, $id_evento);
    // usuario selecionado já possui certificado
    if($existeCert){ 
        $this->session->set_flashdata("danger", "Algum dos usuários selecionados já possui certificado para este evento");
        // usuario selecionado não possui certificado no evento escolhido --> inserir na tabela certificados
    } elseif(!$this->UsuariosModel->gerarCertificado($id_evento, $id_user, $qualidade)){
        $this->session->set_flashdata("danger", "Erro ao gerar certificados!");

        // pela tua lógica, vamos parar o loop no primeiro erro que obtivermos, aquando a criação de um certificado novo
        break;
    }
}

$this->session->set_flashdata("success", "Certificados gerados!");

redirect('/eventos/certificados/' . $id_evento);
    
16.12.2017 / 03:47