3
respostas

Warning: PDOStatement::execute(): SQLSTATE[HY093]:

Boa noite Galera Estou tendo o seguinte erro ao clica no botão cadastrar Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /var/www/html/winprofit/class/clientes.class.php on line 106 A linhas 106 é

if($cst->execute()){
                return 'ok';
            }else{
                return 'erro';
            }
        }catch (PDOException $ex){
            return 'error '.$ex->getMessage();
        }

HTML

<?php 
include("cabecalho.php");

require_once 'class/funcoes.class.php';
require_once 'class/clientes.class.php';

//Objeto para substanciar as classes
$objFc = new Funcoes();
$objCn = new Clientes();

if(isset($_POST['btnCadastrar'])){
    if($objCn->queryInsert($_POST)=='ok'){
        header("location: /winprofit/formulario_cliente.php");
    }else{
        echo '<script type="text/javascript">
        alert("Erro ao cadstrar cliente")
        </script>';
    }
}

?>
<div id="page-wrapper">
    <div class="container-fluid">
        <!-- Page Heading -->
        <div class="row">
            <div class="col-lg-12">
                <h1 class="page-header">
                   Adicionar Cliente - <small>Clientes</small>
                </h1>
                    <ol class="breadcrumb">
                        <li>
                            <i class="fa fa-dashboard"></i>  <a href="home.php">Painel Home</a>
                        </li>
                        <li class="active">
                            <i class="fa fa-money "></i> Cadastro de Clientes
                        </li>
                       </ol>
               </div>
        </div>
                <!-- /.row -->
        <div class="row">
            <div class="col-md-12">
                <form role="form" action="" method="post">
                    <div class="form-group col-md-6 col-sm-6">
                        <label>NOME DO CLIENTE</label>
                            <input class="form-control" type="text" name="nomeCliente">
                    </div>
                    <div class="form-group col-md-6 col-sm-6">
                        <label>CNPJ/CPF</label>
                               <input class="form-control" maxlength="14" type="text" name="docCliente" id="" onKeyUp="maskCpf(this)">
                       </div>
                    <div class="form-group col-md-2 col-sm-4">
                        <label>CEP</label>
                            <input class="form-control" id="cep" placeholder="" type="text" name="cepCliente">
                       </div>
                       <div class="form-group col-md-4 col-sm-6">
                        <label>RUA</label>
                            <input class="form-control" placeholder="" type="text" name="ruaCliente" id="rua">
                       </div>
                       <div class="form-group col-md-2 col-sm-2">
                        <label>NÚMERO</label>
                            <input class="form-control" placeholder="" type="text" name="numCasaCliente">
                       </div>
                       <div class="form-group col-md-4 col-sm-6">
                        <label>BAIRRO</label>
                            <input class="form-control" placeholder="" type="text" name="bairroCliente" id="bairro">
                       </div>
                       <div class="form-group col-md-6 col-sm-6">
                        <label>CIDADE</label>
                            <input class="form-control" placeholder="" type="text" name="cidadeCliente" id="cidade">
                       </div>
                       <div class="form-group col-md-3 col-sm-3">
                        <label>ESTADO</label>
                            <input class="form-control" placeholder="" type="text" name="ufCliente" id="uf">
                       </div>
                       <div class="form-group col-md-3 col-sm-3">
                        <label>CÓDIGO IBGE</label>
                            <input class="form-control" placeholder="" type="text" name="IBGEcliente" id="ibge">
                       </div>
                    <div class="form-group col-md-4 col-sm-3">
                        <label>TELEFONE</label>
                            <input class="form-control" id="telefone" placeholder="" type="text" name="telCliente">
                       </div>
                       <div class="form-group col-md-4 col-sm-3">
                        <label>CELULAR</label>
                            <input class="form-control" id="celular" placeholder="" type="text" name="celCliente">
                       </div>
                       <div class="form-group col-md-4 col-sm-12">
                        <label>E-MAIL</label>
                            <input class="form-control" placeholder="" type="email" name="emailCliente">
                    </div>
                       <div class="form-group col-md-12">
                        <button type="submit"name="btnCadastrar"class="btn btn-primary">Salvar</button>
                        <button type="reset" class="btn btn-danger">Limpar</button>
                    </div>                       
                </form>
            </div>
         <!-- /.row -->   
        </div>
    <!-- container-fluid -->            
    </div>
<!-- /#page-wrapper -->
</div>


<?php
    include("rodape.php");
?>

class.cliente

<?php
require_once'conexao.class.php';
require_once'funcoes.class.php';

class Clientes{
    private $con;
    private $objCliente;
    private $idCliente;
    private $nomeCliente;
    private $docCliente;
    private $cepCliente;
    private $ruaCliente;
    private $numCasaCliente;    
    private $bairroCliente;
    private $cidadeCliente;
    private $ufCliente;
    private $IBGEcliente;
    private $telCliente;
    private $celCliente;
    private $emailCliente;
    private $dataCadastro;

    //construtor
    public function __construct(){
        $this->con = new conectaDB();
        $this->objCliente = new Funcoes();
    }

    public function __set($atributo, $valor){
        $this->$atributo = $valor;
    }

    public function __get($atributo){
        return $this->$atributo;
    }

    // metodos
    //Metodo que seleciona o arquivo para edição
    public function querySeleciona($dado){
        try{
            $this->idCliente = $this->objCliente->base64($dado, 2);
            $cst = $this->con->conecta()->prepare("SELECT 'idCliente', 'nomeCliente', 'docCliente', 'cepCliente',
                                                  'ruaCLiente', 'numCasaCLiente', 'bairroCliente', 'cidadeCliente',
                                                  'ufCliente', 'IBGEcliente', 'telCliente', 'celCLiente', 'emailCliente'
                                                  'dataCadastro' FROM 'clientes' WHERE 'idCliente = idClien';");
            $cst->bindParam(":idClien", $this->idCliente, PDO::PARAM_INT);
            $cst->execute();
            return $cst->fetch();
        }catch (PDOException $ex){
            return 'error ';
            $ex->getMessage();
        }
    }

    //Lista todos o registro do formulários
    public function querySelect(){
        try{
            $cst = $this->con->conecta()->prepare("SELECT 'idCliente', 'nomeCliente', 'docCliente', 'cepCliente',
                                                  'ruaCLiente', 'numCasaCLiente', 'bairroCliente', 'cidadeCliente',
                                                  'ufCliente', 'IBGEcliente', 'telCliente', 'celCLiente', 'emailCliente'
                                                   FROM 'clientes';");
            $cst->execute();
            return $cst->fetchAll();
        }catch (PDOException $ex){
            return 'error '.$ex->getMessage();
        }
    }

    //Metodo que inseri os registro no banco de dados via POST
    public function queryInsert($dados){
        try{
            $this->nomeCliente = $this->objCliente->tratarCaracter($dados['nomeCliente'], 1);
            $this->docCliente = $dados['docCliente'];
            $this->cepCliente = $dados['cepCliente'];
            $this->ruaCliente = $this->objCliente->tratarCaracter($dados['ruaCliente'],1);
            $this->numCasaCliente = $dados['numCasaCliente'];
            $this->bairroCliente = $this->objCliente->tratarCaracter($dados['bairroCliente'], 1);
            $this->cidadeCliente = $this->objCliente->tratarCaracter($dados['cidadeCliente'], 1);
            $this->ufCliente = $this->objCliente->tratarCaracter($dados['ufCliente'], 1);
            $this->IBGEcliente = $dados['IBGEcliente'];
            $this->telCliente = $dados['telCliente'];
            $this->celCliente = $dados['celCliente'];
            $this->emailCliente = $dados['emailCliente'];
            //$this->senha = sha1($dados['senha']);
            $this->dataCadastro = $this->objCliente->dataAtual(2);
            $cst = $this->con->conecta()->prepare("INSERT INTO 'clientes' ('nomeCliente', 'docCliente',
                                                  'cepCliente', 'ruaCliente','numCasaCliente', 'bairroCliente',
                                                  'cidadeCliente','ufCliente', 'IBGEcliente', 'telCliente',
                                                  'celCliente','emailCliente','dataCadastro') VALUES
                                                  (:nomeCliente, :docCliente, :cepCliente, :ruaCliente,
                                                  :numCasaCliente, :bairroCliente, :cidadeCliente,:ufCliente,
                                                  :IBGEcliente, :telCliente, :celCliente,:emailCliente,
                                                  :dataCadastro;");
            $cst->bindParam(":nomeCliente", $this->nomeCliente, PDO::PARAM_STR);
            $cst->bindParam(":docCliente", $this->docCliente, PDO::PARAM_STR);
            $cst->bindParam(":cepCliente", $this->cepCliente, PDO::PARAM_STR);
            $cst->bindParam(":ruaCliente", $this->ruaCliente, PDO::PARAM_STR);
            $cst->bindParam(":numCasaCliente", $this->numCasaCliente, PDO::PARAM_STR);
            $cst->bindParam(":bairroCliente", $this->bairroCliente, PDO::PARAM_STR);
            $cst->bindParam(":cidadeCliente", $this->cidadeCliente, PDO::PARAM_STR);
            $cst->bindParam(":ufCliente", $this->ufCliente, PDO::PARAM_STR);
            $cst->bindParam(":telCliente", $this->telCliente, PDO::PARAM_STR);
            $cst->bindParam(":celCliente", $this->celCliente, PDO::PARAM_STR);
            $cst->bindParam(":emailCliente", $this->emailCliente, PDO::PARAM_STR);
            $cst->bindParam(":dataCadastro", $this->dataCadastro, PDO::PARAM_STR);
            if($cst->execute()){
                return 'ok';
            }else{
                return 'erro';
            }
        }catch (PDOException $ex){
            return 'error '.$ex->getMessage();
        }
    }

    public function queryUpdate($dados){
        try{
            $this->idCliente = $this->objCliente->base64($dados['idClien'],2);
            //Trata caracteres
            $this->nomeCliente = $this->objCliente->tratarCaracter($dados['nomeCliente'], 1);
            $this->ruaCliente = $this->objCliente->tratarCaracter($dados['ruaCliente'], 1);
            $this->bairroCliente = $this->objCliente->tratarCaracter($dados['bairroCliente'], 1);
            $this->cidadeCliente = $this->objCliente->tratarCaracter($dados['cidadeCliente'], 1);
            $this->ufCliente = $this->objCliente->tratarCaracter($dados['ufCliente'], 1);
            //sem tratamento de caracteres
            $this->docCliente = $dados[docCliente];
            $this->celCliente = $dados[cepCliente];
            $this->numCasaCliente = $dados[numCasaCliente];
            $this->IBGEcliente = $dados[IBGEcliente];
            $this->telCliente = $dados[telCliente];
            $this->celCliente = $dados[celCliente];
            $this->emailCliente = $dados[emailCliente];
            $cst = $this->con->conecta()->prepare("UPDATE 'clientes' SET 'nomeCliente' = :nomeCliente, 'docCliente' = :docCliente,
                                                  'celCliente' = :celCliente, 'ruaCliente' = :ruaCliente,'numCasaCliente' = :numCasaCliente,
                                                  'bairroCliente' = :bairroCliente, 'cidadeCliente' = :cidadeCliente,
                                                  'ufCliente' = :ufCliente, 'IBGEcliente' = :IBGEcliente,
                                                  'telCliente' = :telCliente, 'celCliente' = :celCliente,
                                                  'emailCliente' = :emailCliente WHERE 'idCliente' = :idClien;");
            $cst->bindParam(":idClien", $this->idCliente, PDO::PARAM_INT);
            $cst->bindParam(":nomeCliente", $this->nomeCliente, PDO::PARAM_STR);
            $cst->bindParam(":docCliente", $this->docCliente, PDO::PARAM_STR);
            $cst->bindParam(":celCliente", $this->cepCliente, PDO::PARAM_STR);
            $cst->bindParam(":ruaCliente", $this->ruaCliente, PDO::PARAM_STR);
            $cst->bindParam(":numCasaCliente", $this->numCasaCliente, PDO::PARAM_STR);
            $cst->bindParam(":bairroCliente", $this->bairroCliente, PDO::PARAM_STR);
            $cst->bindParam(":cidadeCliente", $this->cidadeCliente, PDO::PARAM_STR);
            $cst->bindParam(":ufCliente", $this->ufCliente, PDO::PARAM_STR);
            $cst->bindParam(":telCliente", $this->telCliente, PDO::PARAM_STR);
            $cst->bindParam(":celCliente", $this->celCliente, PDO::PARAM_STR);
            $cst->bindParam(":emailCliente", $this->emailCliente, PDO::PARAM_STR);
            if($cst->execute()){
                return "OK";
            }else{
                return "erro";
            }
        }catch (PDOException $ex){
            return "Erro".$ex->getMessage();
        }
    }

    //Metodo que vai deletar um registro recebendo o ID
    public function queryDelete($dado){
        try{
            $this->idCliente = $this->objCliente->base64($dado,2);
            $cst = $this->con->conecta()->prepare("DELETE FROM 'clientes' WHERE 'idCliente' = :idClien:");
            $cst->bindParam(":idClien", $this->idCliente, PDO::PARAM_INT);
            if($cst->execute()){
                return "OK";
            }else{
                return "ERRO";
            }
        }catch (PDOException $ex){
            return "ERRO ".$ex->getMessage();
        }
    }
}
?>
3 respostas

Tacio Torres,

Fala cara tudo bom? Esse erro normalmente acontece quando esquecemos de passar algum parâmetro na hora de fazer o bindParams, pode dar uma checada?

            $cst = $this->con->conecta()->prepare("UPDATE 'clientes' SET 'nomeCliente' = :nomeCliente, 'docCliente' = :docCliente,
                                                  'celCliente' = :celCliente, 'ruaCliente' = :ruaCliente,'numCasaCliente' = :numCasaCliente,
                                                  'bairroCliente' = :bairroCliente, 'cidadeCliente' = :cidadeCliente,
                                                  'ufCliente' = :ufCliente, 'IBGEcliente' = :IBGEcliente,
                                                  'telCliente' = :telCliente, 'celCliente' = :celCliente,
                                                  'emailCliente' = :emailCliente WHERE 'idCliente' = :idClien;");
            $cst->bindParam(":idClien", $this->idCliente, PDO::PARAM_INT);

Amigo Mario Desculpe mais o problema ta sendo no

if($cst->execute()){
                return 'ok';
            }else{
                return 'erro';
            }

Da função queryInsert

Tacio, isso eu entendi o erro acontece no ponto do execute porque a execução está falhando mas temos que testar o que ele está tentando executar para achar a coisa toda, por isso vamos testar se erro acontece pela forma como os parâmetros estão sendo passados no INSERT.

Tenta passar nesse formato:

$this->idCliente = $this->objCliente->base64($dado, 2);
$cst = $this->con->conecta()
$statement = $cst->prepare("INSERT INTO tabelaexemplo(name, lastname, age)
    VALUES(?, ?, ?)");

$statement->execute(array("Mario", "Souto", "19"));

Ao invés de passar VALUES(:fname, :lname, :age)