Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Galera,
Estou com uma página PHP funcionando no Windows 2008, inclusive carregando os dados dos comboboxs que veem do banco de dando MS SQL Server 2008, mas ao utilizar a busca, gera a seguinte mensagem de erro:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[iMSSP]: Tried to bind parameter number 0. SQL Server supports a maximum of 2100 parameters.' in C:\inetpub\wwwroot\GAV\Fornecedor.php:166 Stack trace: #0 C:\inetpub\wwwroot\GAV\Fornecedor.php(166): PDOStatement->execute() #1 {main} thrown in C:\inetpub\wwwroot\GAV\Fornecedor.php on line166
Abaixo segue o código e destaque na linha 166 - $stmt->execute();
$sql = "SELECT dbo.EFORNEC.CODFOR, dbo.EFORNEC.NOMFOR, dbo.EFORNEC.RAZAOSOC, dbo.EFORNEC.PESSOAFISJUR, dbo.EFORNEC.CGCCPF, ";
$sql = $sql . " dbo.EFORNEC.INSCRRG, dbo.EFORNEC.CODTIPO, dbo.EFORNEC.SITUACAO, dbo.EFORNEC.ENDERECO, dbo.EFORNEC.SIGLACID,";
$sql = $sql . "dbo.EFORNEC.CEP, dbo.EFORNEC.BAIRRO, dbo.ECIDADE.DESCRCID, dbo.ECIDADE.SIGLAESTADO, dbo.ECIDADE.DDD, ";
$sql = $sql . "dbo.EESTADO.DESCRESTADO, dbo.EFORNEC.FONES ";
$sql = $sql . "FROM dbo.EFORNEC ";
$sql = $sql . "INNER JOIN dbo.ECIDADE ON dbo.EFORNEC.SIGLACID = dbo.ECIDADE.SIGLACID ";
$sql = $sql . "INNER JOIN dbo.EESTADO ON dbo.ECIDADE.SIGLAESTADO = dbo.EESTADO.SIGLAESTADO ";
if (!empty($_POST['Nome_Fantasia'])){
$sql = $sql . "AND dbo.EFORNEC.NOMFOR LIKE '%".$_POST['Nome_Fantasia']."%' ";
}
if(!empty($_POST['CPF'])){
$sql = $sql . "AND dbo.EFORNEC.CGCCPF = '".$_POST['CPF']."' ";
}
if(!empty($_POST['CNPJ'])){
$sql = $sql . "AND dbo.EFORNEC.CGCCPF = '".$_POST['CNPJ']."' ";
}
if(!empty($_POST['TipoFornecedor'])){
$sql = $sql . "AND dbo.EFORNEC.CODTIPO = '".$_POST['TipoFornecedor']."' ";
}
if(!empty($_POST['Estado'])){
$sql = $sql . "AND dbo.ECIDADE.SIGLAESTADO = '".$_POST['Estado']."' ";
}
if(!empty($_POST['Cidade'])){
$sql = $sql . "AND dbo.EFORNEC.SIGLACID = '".$_POST['Cidade']."' ";
}
$sql = $sql . "ORDER BY dbo.EFORNEC.NOMFOR ASC";
//print_r($sql);
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':Nome_Fantasia', $_POST['Nome_Fantasia'], PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 200);
$stmt->bindParam(':CPF', $_POST['CPF'], PDO::PARAM_STR);
$stmt->bindParam(':CNPJ', $_POST['CNPJ'], PDO::PARAM_STR);
$stmt->bindParam(':TipoFornecedor', $_POST['TipoFornecedor'], PDO::PARAM_STR);
$stmt->bindParam(':Estado', $_POST['Estado'], PDO::PARAM_STR);
$stmt->bindParam(':Cidade', $_POST['Cidade'], PDO::PARAM_STR);
print_r($stmt);
$stmt->execute(); //LINHA 166
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
Alguém pode me informar onde está o erro?
Jonas,
Obrigado pela resposta.
Eu não estou nomeando os parâmetros, pois já estou pegando direto da $_POST['Nome_Fantasia'] estou fazendo errado?
Então, você está "pegando" direto da super global $_POST, mas no trecho de código abaixo, você usa parâmetros nomeados:
$stmt->bindParam(':CPF', $_POST['CPF'], PDO::PARAM_STR);
Então, se for usar direto pela super global $_POST (não recomendo), esqueça os bindParams... Ou então, mude sua query adicionando esses parâmetros nomeados:
if( !empty( $_POST['CPF'] ) ) {
$sql.= " AND dbo.EFORNEC.CGCCPF = :CPF ";
}
E no trecho onde insere os bindParams:
if( !empty( $_POST['CPF'] ) ) {
$stmt->bindParam(':CPF', $_POST['CPF'], PDO::PARAM_STR);
}
Você tem que fazer isso com todos os parâmetros da sua query...Jonas,
Eu fiz desta forma e ainda continua com a mensagem de erro:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[iMSSP]: Tried to bind parameter number 0. SQL Server supports a maximum of 2100 parameters.' in C:\inetpub\wwwroot\GAV\Fornecedor.php:178 Stack trace: #0 C:\inetpub\wwwroot\GAV\Fornecedor.php(178): PDOStatement->execute() #1 {main} thrown in C:\inetpub\wwwroot\GAV\Fornecedor.php on line178
if (!empty($_POST)):
//$sql = "SELECT * FROM dbo.vw_Fornecedor AND dbo.Nome_Fantasia LIKE CONCAT('%', :Pesquisar, '%') Order By dbo.NOMFOR Desc";
$sql = "SELECT dbo.EFORNEC.CODFOR, dbo.EFORNEC.NOMFOR, dbo.EFORNEC.RAZAOSOC, dbo.EFORNEC.PESSOAFISJUR, dbo.EFORNEC.CGCCPF, ";
$sql = $sql . " dbo.EFORNEC.INSCRRG, dbo.EFORNEC.CODTIPO, dbo.EFORNEC.SITUACAO, dbo.EFORNEC.ENDERECO, dbo.EFORNEC.SIGLACID,";
$sql = $sql . "dbo.EFORNEC.CEP, dbo.EFORNEC.BAIRRO, dbo.ECIDADE.DESCRCID, dbo.ECIDADE.SIGLAESTADO, dbo.ECIDADE.DDD, ";
$sql = $sql . "dbo.EESTADO.DESCRESTADO, dbo.EFORNEC.FONES ";
$sql = $sql . "FROM dbo.EFORNEC ";
$sql = $sql . "INNER JOIN dbo.ECIDADE ON dbo.EFORNEC.SIGLACID = dbo.ECIDADE.SIGLACID ";
$sql = $sql . "INNER JOIN dbo.EESTADO ON dbo.ECIDADE.SIGLAESTADO = dbo.EESTADO.SIGLAESTADO ";
if (!empty($_POST['Nome_Fantasia'])){
$Nome_Fantasia = $_POST['Nome_Fantasia'];
$sql = $sql . "AND dbo.EFORNEC.NOMFOR LIKE :Nome_Fantasia ";
$Nome_Fantasia = "%".$Nome_Fantasia."%";
}
if(!empty($_POST['CPF'])){
$CPF = $_POST['CPF'];
$sql = $sql . "AND dbo.EFORNEC.CGCCPF = ':CPF' ";
$stmt->bindParam(':CPF', $CPF, PDO::PARAM_STR);
}
if(!empty($_POST['CNPJ'])){
$CNPJ = $_POST['CNPJ'];
$sql = $sql . "AND dbo.EFORNEC.CGCCPF = ':CNPJ' ";
$stmt->bindParam(':CNPJ', $CNPJ, PDO::PARAM_STR);
}
if(!empty($_POST['TipoFornecedor'])){
$TipoFornecedor = $_POST['TipoFornecedor'];
$sql = $sql . "AND dbo.EFORNEC.CODTIPO = ':TipoFornecedor' ";
$stmt->bindParam(':TipoFornecedor', $TipoFornecedor, PDO::PARAM_STR);
}
if(!empty($_POST['Estado'])){
$Estado = $_POST['Estado'];
$sql = $sql . "AND dbo.ECIDADE.SIGLAESTADO = ':Estado' ";
$stmt->bindParam(':Estado', $Estado, PDO::PARAM_STR);
}
if(!empty($_POST['Cidade'])){
$Cidade = $_POST['Cidade'];
$sql = $sql . "AND dbo.EFORNEC.SIGLACID = :Cidade ";
$stmt->bindParam(':Cidade', $Cidade, PDO::PARAM_STR);
}
$sql = $sql . "ORDER BY dbo.EFORNEC.NOMFOR ASC";
//print_r($sql);
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':Nome_Fantasia', $Nome_Fantasia, PDO::PARAM_STR);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);O bindParam deve vir depois do $stmt->prepare(). Tente assim:
<?php
if (!empty($_POST)):
//$sql = "SELECT * FROM dbo.vw_Fornecedor AND dbo.Nome_Fantasia LIKE CONCAT('%', :Pesquisar, '%') Order By dbo.NOMFOR Desc";
$sql = "SELECT dbo.EFORNEC.CODFOR, dbo.EFORNEC.NOMFOR, dbo.EFORNEC.RAZAOSOC, dbo.EFORNEC.PESSOAFISJUR, dbo.EFORNEC.CGCCPF, ";
$sql = $sql . " dbo.EFORNEC.INSCRRG, dbo.EFORNEC.CODTIPO, dbo.EFORNEC.SITUACAO, dbo.EFORNEC.ENDERECO, dbo.EFORNEC.SIGLACID,";
$sql = $sql . "dbo.EFORNEC.CEP, dbo.EFORNEC.BAIRRO, dbo.ECIDADE.DESCRCID, dbo.ECIDADE.SIGLAESTADO, dbo.ECIDADE.DDD, ";
$sql = $sql . "dbo.EESTADO.DESCRESTADO, dbo.EFORNEC.FONES ";
$sql = $sql . "FROM dbo.EFORNEC ";
$sql = $sql . "INNER JOIN dbo.ECIDADE ON dbo.EFORNEC.SIGLACID = dbo.ECIDADE.SIGLACID ";
$sql = $sql . "INNER JOIN dbo.EESTADO ON dbo.ECIDADE.SIGLAESTADO = dbo.EESTADO.SIGLAESTADO ";
if (!empty($_POST['Nome_Fantasia'])){
$Nome_Fantasia = $_POST['Nome_Fantasia'];
$sql = $sql . "AND dbo.EFORNEC.NOMFOR LIKE :Nome_Fantasia ";
$Nome_Fantasia = "%".$Nome_Fantasia."%";
}
if(!empty($_POST['CPF'])){
$CPF = $_POST['CPF'];
$sql = $sql . "AND dbo.EFORNEC.CGCCPF = :CPF ";
}
if(!empty($_POST['CNPJ'])){
$CNPJ = $_POST['CNPJ'];
$sql = $sql . "AND dbo.EFORNEC.CGCCPF = :CNPJ ";
}
if(!empty($_POST['TipoFornecedor'])){
$TipoFornecedor = $_POST['TipoFornecedor'];
$sql = $sql . "AND dbo.EFORNEC.CODTIPO = ':TipoFornecedor ";
}
if(!empty($_POST['Estado'])){
$Estado = $_POST['Estado'];
$sql = $sql . "AND dbo.ECIDADE.SIGLAESTADO = :Estado ";
}
if(!empty($_POST['Cidade'])){
$Cidade = $_POST['Cidade'];
$sql = $sql . "AND dbo.EFORNEC.SIGLACID = :Cidade ";
}
$sql = $sql . "ORDER BY dbo.EFORNEC.NOMFOR ASC";
$stmt = $pdo->prepare($sql);
if (!empty($_POST['Nome_Fantasia'])){
$stmt->bindParam(':Nome_Fantasia', $Nome_Fantasia, PDO::PARAM_STR);
}
if(!empty($_POST['CPF'])){
$stmt->bindParam(':CPF', $CPF, PDO::PARAM_STR);
}
if(!empty($_POST['CNPJ'])){
$stmt->bindParam(':CNPJ', $CNPJ, PDO::PARAM_STR);
}
if(!empty($_POST['TipoFornecedor'])){
$stmt->bindParam(':TipoFornecedor', $TipoFornecedor, PDO::PARAM_STR);
}
if(!empty($_POST['Estado'])){
$stmt->bindParam(':Estado', $Estado, PDO::PARAM_STR);
}
if(!empty($_POST['Cidade'])){
$stmt->bindParam(':Cidade', $Cidade, PDO::PARAM_STR);
}
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);Jonas,
Funcionou, muito obrigado!
Agora quando utilizo o parâmetro **$_POST['Nome_Fantasia']**, não está trazendo resultado, será por conta do **$Nome_Fantasia = "%".$Nome_Fantasia."%";**. Segue a consulta SQL abaixo:
PDOStatement Object ( [queryString] => SELECT dbo.EFORNEC.CODFOR, dbo.EFORNEC.NOMFOR, dbo.EFORNEC.RAZAOSOC, dbo.EFORNEC.PESSOAFISJUR, dbo.EFORNEC.CGCCPF, dbo.EFORNEC.INSCRRG, dbo.EFORNEC.CODTIPO, dbo.EFORNEC.SITUACAO, dbo.EFORNEC.ENDERECO, dbo.EFORNEC.SIGLACID,dbo.EFORNEC.CEP, dbo.EFORNEC.BAIRRO, dbo.ECIDADE.DESCRCID, dbo.ECIDADE.SIGLAESTADO, dbo.ECIDADE.DDD, dbo.EESTADO.DESCRESTADO, dbo.EFORNEC.FONES FROM dbo.EFORNEC INNER JOIN dbo.ECIDADE ON dbo.EFORNEC.SIGLACID = dbo.ECIDADE.SIGLACID INNER JOIN dbo.EESTADO ON dbo.ECIDADE.SIGLAESTADO = dbo.EESTADO.SIGLAESTADO AND dbo.EFORNEC.NOMFOR LIKE :Nome_Fantasia ORDER BY dbo.EFORNEC.NOMFOR ASC )Rodando essa query manualmente traz algum resultado? No bindParam, experimente deixar assim:
if (!empty($_POST['Nome_Fantasia'])){
$Nome_Fantasia = "%$_POST['Nome_Fantasia']%";
$stmt->bindParam(':Nome_Fantasia', $Nome_Fantasia, PDO::PARAM_STR);
}Jonas,
Fiz uma pequena correção e funcionou perfeitamente!
if (!empty($_POST['Nome_Fantasia'])){
$Nome_Fantasia = "%".$Nome_Fantasia."%";
$stmt->bindParam(':Nome_Fantasia', $Nome_Fantasia, PDO::PARAM_STR);
}
Muito obrigado pela ajuda!
Abraço,
Pedro.
E onde você está nomeando os parâmetros do PDO statement? Por exemplo, não vi o parâmetro ":Nome_Fantasia" na sua query