PDO Bindvalue - Array Where

Asked

Viewed 113 times

-1

Good afternoon.

I am creating a form where the user selects some fields to formulate a query and thus generate an sql to be executed and returned.

After validating the fields, I create a $array_whare array and insert all the selected fields into the form, as an example:

client.id_client='7' and tecnico.id_tecnico = '11' and chamado.data_encerramento between '2019-01-01 00:00:00' and '2019-01-31 23:59:00'' (length=139)

So, I send to the function that inserts into a $sql variable via bindValue the $array_where variable:

$sql = 'select
                    chamado.num_chamado,
                    cliente.nome_fantasia,
                    equipamento.num_serie ,
                    tecnico.nome_tecnico,
                    tipo_servico.tipo_servico ,
                    chamado.cont_inicial,
                    chamado.cont_final ,
                    chamado.data_abertura ,
                    chamado.data_encerramento ,
                    chamado.solicitante ,
                    chamado.servico_solicitado ,
                    status_chamado.tipo_status,
                    atividade_chamado.data_inicio ,
                    atividade_chamado.data_final_atend ,
                    atividade_chamado.relatorio_tecnico 
                from
                    chamado
                    inner join equipamento on equipamento.id_equipamento = chamado.equipamento_id_equipamento
                    inner join tipo_servico on tipo_servico.id_tipo_servico = chamado.tipo_servico_id_tipo_servico
                    inner join atividade_chamado on atividade_chamado.chamado_id_chamado = chamado.id_chamado
                    inner join tecnico_has_atividade_chamado on tecnico_has_atividade_chamado.atividade_chamado_id_atividade = atividade_chamado.id_atividade
                    inner join tecnico on tecnico.id_tecnico = tecnico_has_atividade_chamado.tecnico_id_tecnico
                    inner join contrato on contrato.id_contrato = equipamento.contrato_id_contrato
                    inner join cliente on cliente.id_cliente = contrato.cliente_id_cliente
                    inner join status_chamado on status_chamado.id_status_chamado = chamado.status_chamado_id_status_chamado
                    inner join usuario on usuario.id_usuario = chamado.usuario_id_usuario
                where
                :Array_where;';
        $stmt = Conexaodb::getInstance()->prepare($sql);
        $stmt->bindValue(':Array_where', $array_where, PDO::PARAM_LOB);
        $stmt->execute();

After running $stmt select returns no result and also no error. To verify, I created the whole SQL before sending to the function, concatenating in an array the beginning of SQL, up to Where, and later the Where clauses that the user chose and sent to the function run. in function changed from prepare($sql) to query($sql) and the seleect returned the result normally.

In short, I wanted to know if there is a PDO lock that does not accept I replace value with something in the SQL standard, like table.column= value? I tested with baindParam, Bindvalue, changed the PARAM_STR, PARAM_STR_CHAR and etc and still can’t use.

Could you help me?

  • That way it’s not possible, you’d have to do one by one.

1 answer

0


It is not possible to use bindValue to create whole rules, as the query is sent to the server to prepare it and then the values are sent separately. Your array_where is not being "concatenated" with the query, but sent as a value.

I recommend looking at how they work.

For what you are trying to do, I suggest concatenating the conditions directly in the query string (it is not a good practice, because it makes space for sql attacks Injection), or better still, separating the conditions and making a bind for each value.

$sql = "select
                    chamado.num_chamado,
                    cliente.nome_fantasia,
                    equipamento.num_serie ,
                    tecnico.nome_tecnico,
                    tipo_servico.tipo_servico ,
                    chamado.cont_inicial,
                    chamado.cont_final ,
                    chamado.data_abertura ,
                    chamado.data_encerramento ,
                    chamado.solicitante ,
                    chamado.servico_solicitado ,
                    status_chamado.tipo_status,
                    atividade_chamado.data_inicio ,
                    atividade_chamado.data_final_atend ,
                    atividade_chamado.relatorio_tecnico 
                from
                    chamado
                    inner join equipamento on equipamento.id_equipamento = chamado.equipamento_id_equipamento
                    inner join tipo_servico on tipo_servico.id_tipo_servico = chamado.tipo_servico_id_tipo_servico
                    inner join atividade_chamado on atividade_chamado.chamado_id_chamado = chamado.id_chamado
                    inner join tecnico_has_atividade_chamado on tecnico_has_atividade_chamado.atividade_chamado_id_atividade = atividade_chamado.id_atividade
                    inner join tecnico on tecnico.id_tecnico = tecnico_has_atividade_chamado.tecnico_id_tecnico
                    inner join contrato on contrato.id_contrato = equipamento.contrato_id_contrato
                    inner join cliente on cliente.id_cliente = contrato.cliente_id_cliente
                    inner join status_chamado on status_chamado.id_status_chamado = chamado.status_chamado_id_status_chamado
                    inner join usuario on usuario.id_usuario = chamado.usuario_id_usuario
                where
                {$array_where}";
        $stmt = Conexaodb::getInstance()->prepare($sql);
        $stmt->execute();
  • That’s what I figured. I think I will create an array with inputs and their values and send to the bind and create a foreach to insert the field and then the value. Thanks for the return.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.