Problem with Mysql and PHP query

Asked

Viewed 157 times

2

I have the following problem, when using the WHERE clause I am not able to use the values that are being passed by parameter.

As a return I have the following message:

  • Pdostatement::execute(): SQLSTATE[HY093]: Invalid Parameter number: number of bound variables does not match number of tokens in*
TIPOS DE DADOS NO BANCO

date  tipo -> DATETIME
municipio tipo -> INT
entidade tipo -> INT


    public function listLicitacoesEntidadesCidades($date, $municipio, $entidade){       

        $stmt = $this->pdo->prepare("
        select 
        tab_licitacoes.id,
        tab_licitacoes.cidade_id,
        tab_licitacoes.entidade_id,
        tab_licitacoes.data_abertura,
        tab_licitacoes.data_cancelamento,
        tab_licitacoes.status,
        tab_licitacoes.modalidade,
        tab_cidades.nome,
        tab_entidades.nome_entidade
            from tab_licitacoes 
            join 
            tab_cidades on (tab_licitacoes.cidade_id = tab_cidades.id)
            join
            tab_entidades on (tab_licitacoes.entidade_id = tab_entidades.id) 
                where 
                tab_licitacoes.status = 'A'
                and
                tab_licitacoes.data_cancelamento >= :date
                and
                tab_licitacoes.cidade_id = :municipio
                and
                tab_licitacoes.entidade_id = :entidade

                ");
        $stmt->bindValue(':date', $date, PDO::PARAM_STR);
        $stmt->bindValue(':municipio', $municipio, PDO::PARAM_INT);
        $stmt->bindValue(':entidade', $entidade, PDO::PARAM_INT);
        $stmt->execute();

        $data = $stmt->fetchAll(PDO::FETCH_ASSOC);

        return $data;

    }
  • If you run this select directly in the database causes some error?

  • Passing fixed values on the 3 variables, example :pass municipality 34 returns exactly what I need

1 answer

1

Based on what you reported in the comments, already tried to do different?

Thus:

 public function listLicitacoesEntidadesCidades($date, $municipio, $entidade){       

    $stmt = $this->pdo->prepare("
    select 
    tab_licitacoes.id,
    tab_licitacoes.cidade_id,
    tab_licitacoes.entidade_id,
    tab_licitacoes.data_abertura,
    tab_licitacoes.data_cancelamento,
    tab_licitacoes.status,
    tab_licitacoes.modalidade,
    tab_cidades.nome,
    tab_entidades.nome_entidade
        from tab_licitacoes 
        join 
        tab_cidades on (tab_licitacoes.cidade_id = tab_cidades.id)
        join
        tab_entidades on (tab_licitacoes.entidade_id = tab_entidades.id) 
            where 
            tab_licitacoes.status = 'A'
            and
            tab_licitacoes.data_cancelamento >= ?
            and
            tab_licitacoes.cidade_id = ?
            and
            tab_licitacoes.entidade_id = ?

            ");

    $stmt->execute(array(date("Y-m-d H:i:s", strtotime($date)), $municipio, $entidade));

    $data = $stmt->fetchAll(PDO::FETCH_ASSOC);

    return $data;

}

EDITED

In signing your method

public function listLicitacoesEntidadesCidades($date, $municipio, $entidade)

your parameter $date is the type DATETIME?

When you will assign the value to the query parameter

$stmt->bindValue(':date', $date, PDO::PARAM_STR);

you set the parameter as string in PDO::PARAM_STR, then you must convert $date for string.

$stmt->bindValue(':date', date("Y-m-d H:i:s", strtotime($date)), PDO::PARAM_STR);

Would that be?

  • I had already tried this way, apologies for not posting. But with the other parameters also occur the same problem, it is as if I was not understanding the data types even, I tried to force the data typing to all the parameters even so it did not work, but thanks for the tip.

  • This error indicates that you have a number of parameters in the query other than the one you are filling with your lines bindValue. At least in the code you posted this is not happening. In your actual code, which is running, is there nothing left or missing? It’s different than what you posted here?

  • Check the alternative solution I posted...

  • Had already tried, shows only an empty array, this way. however there is content in the table

Browser other questions tagged

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