Pegar variáveis de um array e enviar dentro do bind_param no sql select usando a cláusula IN (?)
Salve pessoal tudo bem! Depois de muito tempo venho aqui pedir uma ajuda, bem vamos lá... Eu tenho uma classe POO e nela pego algumas variáveis que vem como array e uso o implode para enviar através do load do javascript.
Até aí tranquilo, eu resgato com $_GET usando o explode, e depois uso implode para separar elas novamente. Montei essa rotina toda por se tratar de uma o paginação se reload, bem dinâmica, só que ao passar os parâmetros e as variáveis no bind_param da erro de parâmetros, dizendo que: Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement E entendi que o erro diz que o número de parametros não condiz com o número de variáveis, E AI QUE ENTRA A MINHA DOR DE CABEÇA... Mesmo eu usando implode eu consigo separar as variáveis mas dando um var_dump elas ficam juntas e a execução do prepare lê como uma única variável. Segue o código abaixo: <?php class DadosFiltroBusca { private $conecta_banco. public function __construct(){ $this->conecta_banco= new Conexao(). $this->conecta_banco->Conectar(). } public $ativo. public $negocio. public $tipo. public $cidade. public $bairro. public $id_negocio. public $id_tipo. public $id_cidade. public $id_bairro. public $foto. public $where. public $sqlT_1. public $sqlT_2. public $total. public $current_page. public $get_total_rows. public $item_per_page. public $total_pages. public $total_records. public $pgst. public $page_number. public $page_position. public $filtro_dados. public $site. public function BuscarFiltroBusca(){ $result=$this->conecta_banco->banco. $this->item_per_page = 4. if(isset($_POST["page"])){ $this->page_number =(isset($_POST['page']))? (int)$_POST['page']: 1. if(!is_numeric($this->page_number)){die('Página inválida!'). } //incase of invalid page number }else{ $this->page_number = 1. //if there's no page number, set it to 1 } $negocio = $_GET['negocio']. $this->id_tipo= explode(",",$_GET['tipo']). $this->id_cidade=explode(",",$_GET['cidade']). $this->id_bairro=explode(",",$_GET['bairro']). $idi=implode('', $this->id_tipo). echo "<br /><br />". $in=(is_array($this->id_tipo)? count($this->id_tipo):0). $id_tipo = implode(',', array_fill(0, $in, '?')). echo ":: ". $id_tipo_2 =join('', array_fill(0, 1, $idi)). echo ":: ".$types =str_repeat('s',$in). echo "<br /> VAR:: ".$tipo =str_repeat(''.$id_tipo_2.'',1). var_dump ($tipo ). $idi1='5'. $idi2='11'. foreach ($this->id_cidade as $key=> $id_cidade): foreach ($this->id_bairro as $key=> $id_bairro): $ativo='1'. "%".$negocio."%". $id_tipo. $id_cidade. $id_bairro. echo "<br /><br />RESULTADO:: ". $t='ss'.$types.'ss',$ativo,$negocio,$tipo,$id_cidade,$id_bairro."<br /><br />". $where = " i.ativo =? ". if( $negocio) { $where.="AND i.id_negocio_tipo LIKE?". }if( $id_tipo ) { $where.=" AND i.id_tipo_imovel IN ($id_tipo)". } if( $id_cidade ) { $where.=" AND i.id_cidade=?". } if($id_bairro) { $where.=" AND i.bairro=?". } $sqlT_1 =$result->prepare("SELECT i.*, t.tipo_nome, b.bairro, n.tipo, c.cidade FROM imoveis i LEFT JOIN negocio_tipo n ON (n.id = i.id_negocio_tipo) LEFT JOIN imoveis_tipo t ON (t.id = i.id_tipo_imovel) LEFT JOIN cidades c ON (c.id = i.id_cidade) LEFT JOIN bairros b ON (b.id = i.bairro) WHERE ".$where.""). $sqlT_1->bind_param('ss'.$types.'ss',$ativo,$negocio,$tipo,$id_cidade,$id_bairro). $sqlT_1->execute(). $this->sqlT_1 = $sqlT_1->get_result(). $this->get_total_rows+=$this->sqlT_1->num_rows. if($this->get_total_rows >0 ){ $this->total_pages = ceil($this->get_total_rows / $this->item_per_page). } $this->sqlT_1->num_rows. //break records into pages //get starting position to fetch the records if($this->get_total_rows > 0 ){ $this->page_position = (($this->page_number * $this->item_per_page) -$this->item_per_page). $this->pgst = ceil($this->get_total_rows / $this->item_per_page). } $sqlT_1->close(). endforeach. endforeach. $sqlT_2 =$result->prepare("SELECT i.id, i.valor,i.locacao, i.foto_exibicao,i.latitude,i.longitude, i.quartos, i.garagem,i.mapa, i.codigo, t.tipo_nome, n.tipo AS negocio, c.cidade, c.uf, b.bairro FROM imoveis i LEFT JOIN negocio_tipo n ON (n.id = i.id_negocio_tipo) LEFT JOIN imoveis_tipo t ON (t.id = i.id_tipo_imovel) LEFT JOIN cidades c ON (c.id = i.id_cidade) LEFT JOIN bairros b ON (b.id = i.bairro) WHERE ".$where." ORDER BY i.id DESC LIMIT?,?"). $sqlT_2->bind_param('sssssss',$ativo,$negocio,$idi,$id_cidade,$id_bairro,$this->page_position,$this->item_per_page). $sqlT_2->execute(). $this->sqlT_2=$sqlT_2->get_result(). } }?> Vejam no código que existem 2 consultas, um select é para montar a páginação sem reflesh e a outra é para buscar os dados do filtro de busca, e para deixar mais claro, se eu colocar no lugar cláusula IN em vez de IN (?) colocar IN ($variavel ) que já foi separada com o implode ela busca perfeitamente as informações, exemplo abaixo: $where = " i.ativo =? ". if( $negocio) { $where.="AND i.id_negocio_tipo LIKE?". }if( $id_tipo ) { $where.=" AND i.id_tipo_imovel IN (?)". AQUI É AONDE TEM O ARRAY, E AS OUTRAS ESTÃO SEM ARRAYS PARA TESTAR APENAS ESSA VARIÁVEL } if( $id_cidade ) { $where.=" AND i.id_cidade=?". } if($id_bairro) { $where.=" AND i.bairro=?". } Acima da aquele erro de. Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement Mas agora logo abaixo vai de boa e forma a paginação e trás os valores: $where = " i.ativo =? ". if( $negocio) { $where.="AND i.id_negocio_tipo LIKE?". }if( $id_tipo ) { $where.=" AND i.id_tipo_imovel IN ($id_tipo)". } if( $id_cidade ) { $where.=" AND i.id_cidade=$id_cidade". } if($id_bairro) { $where.=" AND i.bairro=$id_bairro". } E vi que o problema esta aqui abaixo: $sqlT_1->bind_param('ss'.$types.'ss',$ativo,$negocio,AQUI É A VARIÁVEL COM ARRAY -> $tipo,$id_cidade,$id_bairro). Notem que esta variável dentro dos parâmetros ($types) ela trás o número de parâmetros conforme o critério de busca do filtro de busca, E este parametro como variável eu pego com o str_repeat E se eu montar as variáveis manualmente tipo > $tipo1=15'. e $tipo2='11'. e jogar lá no bind param ela chama de boa tipo assim: $tipo1='15'. $tipo2='11'
$sqlT_1->bind_param('ss'.$types.'ss',$ativo,$negocio,$tipo1,$tipo2,$id_cidade,$id_bairro). se eu fizer desta forma chama perfeitamente, e vi que o problema é na hora de separar as variáveis do array. Já usei serialize, join, json_decode e nada. Se alguém souber de como contornar agradeço. E desculpe pela imensa explicação, mas é para entederem melhor:) Obrigado!Discussão (0)
Carregando comentários...