Ir para conteúdo

POWERED BY:

Arquivado

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

Soaress

[Resolvido] 'Like' dentro do select

Recommended Posts

Alguem poderia nos ajudar em um select para busca um nome ou parte do nome? por meio de um LINK

$select = $sql->select()
   	->from(array('p'=>'cliente'))
   	->from(array('LIKE'=>'LIKE'))			     
->where(array($coluna=>$option,))
->order("idCliente");
$dados = $sql->fetchAll(PDO::FETCH_OBJ)->toArray();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poste a query como você quer que fique (seja enviada para o banco), porque não consegui entender. O LIKE que eu conheço é no where, não no FROM.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Descupa erro na digitação.

 

Quero fazer uma busca e mostrar o resultado. Quero que mostre os dados daquela palavra que eu mandar via post.

 

$coluna = coluna da tabela

$option = nome ou palavra buscado

 

Estou usando o Zend_Db_Table_Abstract

$form = new Application_Form_Busca();
if($this->_request->isPost())
{
	$option = $this->_request->getPost('option');
	$coluna = $this->_request->getPost('coluna');

        if ($coluna) 
        { 	
        	$sql = new Application_Model_Cliente();
   			$select = $sql->select()
   			              ->from(array('p'=>'cliente'))
   				      ->where(array('LIKE'=>'LIKE'))
			      ->where(array($coluna=>$option,))
			      ->order("idCliente");
$dados=$sql->fetchAll(PDO::FETCH_OBJ)->toArray();								   							    	 
			$this->view->form = $form;
                         if ($dados > 0)
		  {  
			$this->view->rows = $dados;
        	  }
        }
	}else {
		$this->view->form = $form;
        //$this->_redirect('/cliente/busca');	        

   	}
   }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ficaria algo assim:

 

$sql->select()
  ->from(array('p'=>'cliente'))
  ->where(sprintf('%s LIKE ?', $coluna), $option)
  ->order("idCliente");

Só que você não pode esquecer que o LIKE precisa do % antes e/ou depois da string de busca.

 

Outra coisa é que você está misturando camadas. A montagem da SQL de busca deve ser feita no Model, e não no controller.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Carlos obrigado pela ajuda. Estou apredendo a trabalhar com o zend.

 

Refiz aqui: (cada macaco no seu galho).

 

Model:

public function busca($coluna, $option)
{
	try {

		if (!empty($coluna))
		$where = $this->select()
					  ->from('cliente')
					  ->where(sprintf('%s LIKE ', $coluna), sprintf(" '%%%s%%' " , $option));
		return $where->query()->fetchAll();

	} catch (Zend_Db_Exception $e) {
		echo $e->getMessage();
	}	
}

Controller:

public function buscaAction()
   {

   	$form = new Application_Form_Busca();

       if($this->_request->isPost())
	{
		$option = $this->_request->getPost('option');
		$coluna = $this->_request->getPost('coluna');

        if (!empty($coluna)) 
        { 	
        	$sql = new Application_Model_Cliente();
   				$dados = $sql->busca($coluna, $option);

   				$this->view->form = $form;
			if ($dados > 0)
			{  
				$this->view->rows = $dados;

			}
        }
	}else {
		$this->view->form = $form;
        //$this->_redirect('/cliente/busca');	        

   	}
   }

Quando busco por um nome Ex: Timoteo (tabela=cliente, coluna=mome)

Me retorne este erro: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu where tem um problema.

 

->where(sprintf('%s LIKE ', $coluna), sprintf(" '%%%s%%' " , $option));

Troque por:

->where(sprintf('%s LIKE ?', $coluna), sprintf("%%%s%%" , $option));

 

Veja se funciona. Se não funcionar, para efeito de debug, dê um echo $where antes do fetchAll() e encerre o script(exit ou die). Algo assim:

 

public function busca($coluna, $option)
       {
               try {

                       if (!empty($coluna))
                       $where = $this->select()
                                     ->from('cliente')
                                     ->where(sprintf('%s LIKE ?', $coluna), sprintf("%%%s%%" , $option));
                       echo $where;
                       exit();
                       return $where->query()->fetchAll();

               } catch (Zend_Db_Exception $e) {
                       echo $e->getMessage();
               }       
       }

 

Veja o que retorna e veja se localiza o erro do SQL.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Matias, Deu certo.

O Carlos tinha passado a formula, porem quando fui refazer esqueci de colocar o bendito "?".

 

Deus Abencoe a todos!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, o Carlos e o Matias sou eu... :P

 

Sobre o ?, é a forma que o Zend encontra os parâmetros a serem substituídos. Só que, pelo menos nesta versão, é 1 parâmetro por condição só. Então, ele substitui o ? pelo segundo parâmetro do where(). O terceiro parâmetro é o tipo de valor que pode ser aceito. Por exemplo, para obrigar um valor a ser inteiro:

 

->where('coluna = ?', $var, Zend_Db::INT_TYPE);

Aí ele não adiciona as aspas (colocar aspas em números inteiros em uma query é um erro) e converte $var para um inteiro.

 

Carlos Eduardo (Matias Rezende :P)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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