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