Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Oi Pessoal, estou tentando um select mas, só funciona com um único campo. Gostaria que funcionasse com "N" campos.
Estou usando:
// Estou recebendo do html via post e jogando para a variável
for($i=0;$i<count($arrabusca);$i++){
if($arrabusca[$i] != ''){
if($i==0){
//Grau de instrução completo
$campbusca = ' WHERE grau LIKE ?';
$dadobusca = $arrabusca[$i];
}
elseif($i==1){
//Nome do associado
if(!$dadobusca == ''){
$campbusca = $campbusca.' && nome LIKE ?';
$dadobusca = $dadobusca.', %'.$arrabusca[$i].'%';
}else{
$campbusca = ' WHERE nome LIKE ?';
$dadobusca = '%'.$arrabusca[$i].'%';
}
... // as reticencias é para reduzir o código, são ao todo oicampos, só pego os validos.
if($crud->select('codi','associado',$campbusca,array($dadobusca))->rowCount()<1){
print 'O(A) Associado(a) não foi localizado(a)!';
...
}else{
...
{
Só tem um problema, só funciona se for com um único campo.
// por exemplo, depois de montado com um único campo fica assim: (funciona)
if($crud->select('codi','associado','WHERE grau=?',array('Profissional'))->rowCount()<1){ ...
// mas, montado com dois ou mais campos não funciona, montado fica assim: (dá erro no "$exec" do CRUD)
if($crud->select('codi','associado','WHERE grau=? && aceiplan=?',array('Profissional,s'))->rowCount()<1){ ...
Bom, para deixar claro só funciona com um campo, mas com dois ou mais campos não funciona, alguém poderia me informar onde estou errando?
A baixo segue como está meu CRUD.
private $query;
private function prepExec($prep,$exec)
{
$this->query=$this->getConn()->prepare($prep);
$this->query->execute($exec); // nesta linha dá o erro
}
public function select($fields,$table,$cond,$exec)
{
$this->prepExec('SELECT '.$fields.' FROM '.$table.' '.$cond.'',$exec);
return $this->query;
}
Msg de erro:
>
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp\www\atcpe\require\class\CRUD.class.php on line 9
Certo de ser ajudado, agradeço com antecedência.
Oi tibet_teixeira, me desculpe mas não entendi a sua dica, você poderia ser mais detalhado?
Caro amigo
Alexandre
Tenho o seguinte Código onde Seleciono o Tipo de Categoria | Venda/Alugar | Cidade | Bairro, na qual vem de um código em HTML.
Código HTML
<?php include"js/scripts.php"; ?>
<div id="header_navegar_filtro">
<h1>Encontre Seu Imóvel</h1>
<form name="filtrar_avancado" method="post" action="index.php?pg=filtro" >
<label>
<br/>
<select name="tipo" id="tipo">
<option value="">Selecione uma opção</option>
<option value="alugar">Alugar</option>
<option value="vender">Comprar</option>
</select>
</label>
<label>
<span>Categoria
<br/>
<select name="categoria">
<option value="" disabled="disabled">Categoria do Imóvel</option>
</select>
</span>
</label>
<label>
<span>Cidade
<br/>
<select name="sub-cat">
<option value="" disabled="disabled">Selecionar a Cidade!</option>
</select>
</span>
</label>
<label>
<span>Bairro
<br/>
<select name="bairro">
<option value="" disabled="disabled">Selecione o Bairro!</option>
</select>
</span>
</label>
<input class="btn_filtro" type="submit" name="listar" value="Pesquisar" />
</form>
</div><!--fecha navegar filtro-->
Depois criei um .JS - FILTRO.JS
$(function(){
$("select[name=tipo]").change(function(){
beforeSend:$("select[name=categoria]").html('<option value="0">Aguarde Carregando...</option>');
var categoria = $("select[name=tipo]").val();
$.post("filtro/categoria.php",{categoria: categoria},function(pega_cat){
complete:$("select[name=categoria]").html(pega_cat);
$("select[name=categoria]").change(function(){
beforeSend:$("select[name=sub-cat]").html('<option value="0">Aguarde Carregando...</option>');
var cidade = $("select[name=categoria]").val();
$.post("filtro/cidade.php",{cidade: cidade},function(pega_cidade){
complete:$("select[name=sub-cat]").html(pega_cidade);
$("select[name=sub-cat]").change(function(){
beforeSend:$("select[name=bairro]").html('<option value="0">Aguarde Carregando...</option>');
var bairro = $("select[name=sub-cat]").val();
$.post("filtro/bairro.php",{bairro: bairro, cidade: cidade},function(pega_bairro){
complete:$("select[name=bairro]").html(pega_bairro);
}); //Fecha Pega Bairro
}); //Fecha Função Bairro
}); //Fecha Pega Cidade
}); //Fecha Função Categoria
}); //Fecha Pega Categoria
}); //Fecha Tipo de Transação
}) //Fecha Function
Conforme seleciona a opção no SELECT, os demais vão sendo preenchido
//Código do bairro.php
<?php include"../Connections/painel_config.php";
$conecta = mysql_connect("$hostname_painel_config","$username_painel_config","$password_painel_config");
$db = mysql_select_db("$database_painel_config");
$bairro = $_POST['bairro'];
$tipo = $_POST['cidade'];
$sql_sub = "SELECT imovelId, imovelTipo, imovelBairro, COUNT(imovelBairro) as total_cat ";
$sql_sub = $sql_sub . " FROM imoveis ";
$sql_sub = $sql_sub . " WHERE imovelCidade = '$bairro' ";
$sql_sub = $sql_sub . " AND imovelTipo = '$tipo' ";
$sql_sub = $sql_sub . " GROUP BY imovelBairro ";
$sql_sub = $sql_sub . " ORDER BY imovelBairro ";
$seleciona = mysql_query($sql_sub, $conecta);
echo '<option value="">Selecione o Bairro</option>';
while ($reg_sub = mysql_fetch_array($seleciona)) {
$resultado = $reg_sub["imovelBairro"];
$total_cat = $reg_sub["total_cat"];
echo "<option value='". $resultado ."'>[". $total_cat ."] ". $resultado ."</option><br/>";
}
mysql_free_result($rs_sub);
?>
//Código da Categoria.php
<?php include"../Connections/painel_config.php";
$conecta = mysql_connect("$hostname_painel_config","$username_painel_config","$password_painel_config");
$db = mysql_select_db("$database_painel_config");
$cat = $_POST['categoria'];
$seleciona = mysql_query("SELECT * FROM imoveis WHERE imovelNegocio = '$cat' GROUP BY imovelTipo");
echo '<option value="">Selecione a Categoria</option>';
while($res_seleciona = mysql_fetch_array($seleciona)){
$tipo = $res_seleciona['imovelTipo'];
echo '<option value="'.$tipo.'">'.$tipo.'</option>';
}
?>
//Código fonte da Cidade.php
<?php include"../Connections/painel_config.php";
$conecta = mysql_connect("$hostname_painel_config","$username_painel_config","$password_painel_config");
$db = mysql_select_db("$database_painel_config");
$cidade = $_POST['cidade'];
$uf = $_POST['estado'];
$seleciona = mysql_query("SELECT * FROM imoveis WHERE imovelTipo = '$cidade' GROUP BY imovelCidade");
echo '<option value="">Selecione a Cidade</option>';
while($res_seleciona = mysql_fetch_array($seleciona)){
$cid = $res_seleciona['imovelCidade'];
$uf = $res_seleciona['imovelEstado'];
echo '<option value="'.$cid.'">'.$cid.'-'.$uf.'</option>';
}
?>
Espero ter ajudado.
Testa o código, se atender a sua necessidade, poste um OK.
Abraços,
Renato
Bom dia, muito bom Remazela. Mas, para eu usar esta solução eu teria que alterar todo o projeto. Bom, se eu não achar uma solução no caminho que estou indo, terei que mudar mesmo. Mas, de toda forma agradeço pela ajuda, de fato, o código que você enviou me parece perfeito, no entanto, eu estou precisando mesmo uma solução no código en que estou trabalhando. está quase tudo pronto. Encontra certinho quando por um campo, mas quando faço a busca com dois campos ou mais gera um erro.
Sei que é uma coisa simples.
É como estou montando o SELECT, um detalhe que eu não estou percebendo agora. pode ser marcação, pontuação, não sei. Sei que é possível, mas está me faltando um detalhe.
A questão é apenas descobrir este mistério: p q com um campo funciona, mas com mais de um campo gera erro?
// por exemplo, depois de montado com um único campo fica assim: (funciona)
if($crud->select('codi','associado','WHERE campotbl_profissao=?',array('Profissional'))->rowCount()<1){ ...
// mas, montado com dois ou mais campos não funciona, montado fica assim: (dá erro no "$exec" do CRUD)
if($crud->select('codi','associado','WHERE campotbl_profissao=? && campotbl_aceita=?',array('Profissional,sim'))->rowCount()<1){ ...
Boa tarde.
No seu CRUD você colocou esta linha
$this->query->execute($exec); // nesta linha dá o erro
certo?
O parâmetro que eu falei foi o $exec. Tente tirá-lo e diga se funciona.
Ha tá!
Este parâmetro "$exec" não pode ser removido não, caso contrário não funciona de jeito nenhum. Ele é solicitado pela function.
Descobri como não dar erro, no entanto não funciona.
// Posso usar qualque um desse que não dá erro, mas não faz a abusca:
("WHERE 'grau LIKE ? or aceiplan LIKE ?'";) ou ("WHERE 'grau LIKE ?' or 'aceiplan LIKE ?'";) ou ('WHERE "grauLIKE?" or "aceiplanLIKE?"';)
// com
('"%Profissional%", "%s%"';) ou ('"Profissional", "s"';)
Tenho que arrumar uma forma de colocar estes parâmetros de forma que não dê erro e ache os dados nos campos. uma vez que eles existem na tabela e funcionam quando a busca é feita em apenas um campo.
já resolveu?? Não entendo muito bem este tipo de select da forma como fez, todavia notei algo:
tem certeza que o codigo que faz busca em dois ou mais campos esta certo, pois estive dando uma olhada, porém não vi a especificação do segundo campo:
vi em seu codigo que tem a seguinte função:
-
>
-
public function select($fields,$table,$cond,$exec)
-
{
-
$this->prepExec('SELECT '.$fields.' FROM '.$table.' '.$cond.'',$exec);
-
return $this->query;
ao que me parece é uma função que seleciona o conteudo das variaveis existentes na função e acaba gerando
o codigo montado, conforme voce mostrou.
-
>
-
// mas, montado com dois ou mais campos não funciona, montado fica assim: (dá erro no "$exec" do CRUD)
-
-
if($crud->select('codi','associado','WHERE grau=? && aceiplan=?',array('Profissional,s'))->rowCount()<1){ ...
conforme disse, nao entendco bem deste tipo de select, mas mas pelo o que deu para notar, apos a concatenação (&&) apenas vejo uma única variavel (aceiplan), como critério de pesquisa, pergunto pois: o que tem dentro desta variavel?
Nela estariam especificados os dois ou mais campos, que seriam os critérios de busca?
A mensagem de erro apresentada:
>
Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp\www\atcpe\require\class\CRUD.class.php on line 9
Esse erro acontece quando existe um parametro a mais ou a menos na consulta...dê uma melhor olhada na resposta da variavel aceiplan...
Parece que o problema é porque você está passando apenas um valor no array, sendo que, como você adicionou dois "?" no SQL, o método "execute" espera que você passe dois valores no array, ficando dessa forma:
if ($crud->select('codi','associado','WHERE grau=? && aceiplan=?', array('Profissionals', 's'))->rowCount() < 1) {...
Já tentou tirar o parâmetro do do execute() ??