Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

oci_bind_by_name com float

Olá, pessoal! Bom dia!

Estou fazendo algumas modificações em um código para que os parâmetros sejam recebidos fora da query, buscando evitar SQL INJECTION... Todos os tipos de dados inseridos dessa forma funcionaram normalmente até agora, porém uma das minhas variáveis retornar um float, e nesse caso eu recebo um warning nesse oci_bind_by_name e consequentemente no oci_execute. Como posso fazer para receber dados do tipo float por meio do oci_bind_by_name?

*OBS: quando esses dados são passados diretamente dentro da query, ela continua rodando normal. Só retorna erro quando os valores são passados por parâmetro.

function x (...) {
    vlCredito = 0.00;
    vlLimite = 0.00;

     if ($modalidade == "X" || $modalidade == "Y") {
        $vlCredito = $grupopedido["vl_credito"];  
    } else {
        $vlLimite = $grupopedido["vl_credito"];
    }

    $strsql = "INSERT INTO tabelaX
            ((...)
            VL_CREDITO,
            VL_LIMITE,
            (...))
            VALUES ( (...), :vlCredito, vlLimite, (...) )";

    $sql = oci_parse($co, $strsql);
    oci_bind_by_name = (...)  //Todos os parâmetros passados antes e depois dos campos que estão com problema foram individualmente testado e estão funcionando.
    oci_bind_by_name($value , "VL_CREDITO" , $vlCredito, -1, SQLT_INT);
    oci_bind_by_name($value , "VL_LIMITE" , $vlLimite, -1, SQLT_INT);
    oci_bind_by_name = (...)
    oci_execute($sql, OCI_DEFAULT);
4 respostas

Oi Carolina tudo bom?

Já tentou transformar seu número em texto?

Pra isso, podemos usar o casting. Algo como:

    oci_bind_by_name($value , "VL_CREDITO" , (string) $vlCredito);

Uma otura abordagem é usar o SQLT_NUM ao invés do SQLT_INT:

    oci_bind_by_name($value , "VL_CREDITO" , $vlCredito, -1, SQLT_NUM);

Qualquer problema é só falar =)

Abraço

Oi André, boa tarde!

Tentei as duas opções que você me deu e não funcionou... Tentei também transformar os valores em string antes de passá-los como parâmetro, mas isso também não mudou nada. Alguma outra opção?

Valeu!

solução!

Oi Carolina, tudo bom?

Verifica qual valor estamos passando pros campos numéricos? Executa o código a seguir:

  vlCredito = 0.00;
    vlLimite = 0.00;

     if ($modalidade == "X" || $modalidade == "Y") {
        $vlCredito = $grupopedido["vl_credito"];  
    } else {
        $vlLimite = $grupopedido["vl_credito"];
    }
var_dump($vlCredito);
var_dump($vlLimite);
die();

E compartilha o resultado com a gente.

As vezes a formtação do número pode estar causando o problema =)

Oi André, boa tarde!

Realmente a formatação estava causando problema no envio para o banco de dados. Os valores no banco estão sendo tratados com vírgula na casa dos centavos. Fiz um str_replace trocando os pontos por vírgulas e agora está funcionando ;)

Obrigada!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software