Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Alexandre Bandeira

SELECT em vários campos - Multi camadas

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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){ ...
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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:

  1. public function select($fields,$table,$cond,$exec)
  2. {
  3. $this->prepExec('SELECT '.$fields.' FROM '.$table.' '.$cond.'',$exec);
  4. return $this->query;
  5. }

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.

  1. // mas, montado com dois ou mais campos não funciona, montado fica assim: (dá erro no "$exec" do CRUD)
  2. 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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

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) {...

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por FabianoSouza
      Eu preciso exibir duas informações em minha consulta:
      1) A quantidade de pessoas inscritas numa turma de treinamento (isso é feito com um simples COUNT)
      2) Uma flag de excesso de inscrições na turma. Seria obtido pela comparação entre a quantidade máxima permitida (já existe esse campo) e o COUNT feito acima.
       
      Até aqui sem problemas.
       
      O que quero é evitar fazer duas contagens (1 para saber a quantidade de inscritos, e outra para gerar a flag de excesso de inscrições).
       
      Há uma forma de utilizar UMA contagem para atender as duas necessidades?
       
      Meu código está assim:
       
      ... --AQUI FAZ A COMPARAÇÃO PARA GERAR A FLAG DE EXCESSO DE INSCRIÇÕES , CASE WHEN (SELECT COUNT(*) FROM dbo.tab AS ITT WHERE ITT.codTurmaDeTreina = T.id) > T.lotacaoMax Then T.nome + '&nbsp;'+'<span class=%22icon-aviso fcolor-critico%22 style=%22font-size:18px%22 title=Excesso&nbsp;de&nbsp;inscrições></span>' --AQUI FAZ A CONTAGEM DE INSCRIÇÕES , (SELECT COUNT(*) FROM dbo.tab AS ITT WHERE ITT.codTurmaDeTreina = T.id) AS 'Inscrições'  
    • Por FabianoSouza
      Possuo uma coluna de data.
      Eu gostaria que os registros com datas futuras aparecessem no topo do meu select, em relação aos demais registros.
      Em seguida, gostaria que somente esses registros com datas futuras ficassem em ordem crescente.
      Algo como 
       
      João  | 16/11/2023
      Maria | 17/11/2023
      José  |  20/11/2023
       
      -----------------------------
      (demais registros da base)
      Antônio   |  20/05/2023
      Rosa        | 15/08/2023
      Cida         | 15/10/2022
      Pedro      |  20/05/2021
      Paulo      |  14/11/2020
       
      O select seria esse.
      select dbo.formataData(ET.dataInicial) AS 'data' FROM dbo.tab AS ET GROUP BY ET.dataInicial  
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse resultado do array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por Rodrigo V
      Boa tarde pessoal, sou novo aqui e não sei se o conteúdo que estou postando está no lugar correto.
      Estou com uma dúvida no ajax de uma requisição onde o retorno do banco popula o meu select, mas o problema é que  meu select devido possuir muitos dados ( em torno de 3000 options) quando retorna o navegador da uma leve travada mas no navegado do celular(com android 9) e trava ao ponto de ter que fechar aplicação. Acredito que teria que fazer um option que carregue por demanda algo assim, mas não sei se o meu pensamento está correto, e se estiver não sei como fazer... se alguém conseguir me ajudar agradeço. segue abaixo  códigos:
       
      onde é populado o select
                 <div class="col-md-2">             <select class="btao1" id="resultados"></select>             <input id="btao1" type="submit" value="Conferir" />           </div>  
      requisicao ajax
      <script>   $(document).ready(function() {     select_resultados()     });     function select_resultados() {     $.ajax({       url: 'select_resultados.php',       method: 'GET',       success: function(dados) {         $('#resultados').html(dados);       }     });   }   </script>  
      pagina php que busca no banco 
       
      $query_select = "SELECT * FROM resultados ORDER BY id DESC"; $result_select = $connect->prepare($query_select); $result_select->execute();   while($resultado_select = $result_select->fetch(PDO::FETCH_ASSOC)){     extract($resultado_select);     echo '         <option value='.$id.'>'.$name.'</option>'; }  
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.