Ошибка: PDOStatement::execute(): SQLSTATE[HY093]: неверный номер параметра:

Я написал такую ​​функцию:

function tim_kiem($tenchu,$sohieutoba,$sothututhu,$gia_dat){
        global $dbh;
        $where="1=1";
        $tenchu = "%".$tenchu."%";

        if($tenchu<>""){

        $where=$where." and tenchu like :tenchu";
        }
        if($sohieutoba<>0){
        $where=$where." and (sohieutoba=:sohieutoba)";
        }
        if($sothututhu<>0){
        $where=$where." and (sothututhu=:sothututhu)";
        }
        if($gia_dat<>""){
        $where=$where." and gia_dat=:gia_dat";
        }
        $sql="SELECT * FROM mybinh WHERE ".$where;


        $sth=$dbh->prepare($sql);
        $sth->bindValue(':tenchu', $tenchu);
        $sth->bindValue(':sohieutoba', $sohieutoba);
        $sth->bindValue(':sothututhu', $sothututhu);
        $sth->bindValue(':gia_dat', $gia_dat);

        $sth->execute();

        $row=$sth->fetch(PDO::FETCH_ASSOC);
        return $row;

    }

Результат в порядке, но он связывает предупреждение

"PDOStatement::bindValue(): SQLSTATE[HY093]: недопустимый номер параметра:: sohieutoba..."

, если я введу оба $sohieutoba а также $sothututhu, результат без предупреждения, я не знаю, где я не прав. Любые предложения будут с благодарностью.

1 ответ

Поскольку вы используете условия для создания запроса, вы также должны привязывать значения в зависимости от ваших условий. Теперь вы можете использовать только одно условие if($tenchu<>"") но свяжите все 4 параметра, что не так.

Самое простое решение - просто повторить ваши заявления:

function tim_kiem($tenchu,$sohieutoba,$sothututhu,$gia_dat){
        global $dbh;
        $where="1=1";
        $tenchu = "%".$tenchu."%";

        if($tenchu<>""){

        $where=$where." and tenchu like :tenchu";
        }
        if($sohieutoba<>0){
        $where=$where." and (sohieutoba=:sohieutoba)";
        }
        if($sothututhu<>0){
        $where=$where." and (sothututhu=:sothututhu)";
        }
        if($gia_dat<>""){
        $where=$where." and gia_dat=:gia_dat";
        }
        $sql="SELECT * FROM mybinh WHERE ".$where;

        $sth=$dbh->prepare($sql);
        if($tenchu<>""){        
           $sth->bindValue(':tenchu', $tenchu);
        }
        if($sohieutoba<>0){
          $sth->bindValue(':sohieutoba', $sohieutoba);
        }
        if($sothututhu<>0){
           $sth->bindValue(':sothututhu', $sothututhu); 
        }
        if($gia_dat<>""){
           $sth->bindValue(':gia_dat', $gia_dat);
        }

        $sth->execute();

        $row=$sth->fetch(PDO::FETCH_ASSOC);
        return $row;

    }

Однако это не самый элегантный способ. Например, вы можете использовать только одно условие и создать массив, а затем в цикле связать ваши параметры

Другие вопросы по тегам