Ir para conteúdo

POWERED BY:

Arquivado

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

Alex Martins

[Resolvido] Consultas parametrizada em sistema PHP

Recommended Posts

Boa tarde!

 

Estou desenvolvendo um sistema em PHP e a parte de alimentar o banco de dados está OK. Agora me deparei na seguinte situação: Os usuários devem fazer as consultas e gostaria de deixar o mais simples possível na parte de programação. Sabe aqueles formulários de consulta que selecionamos alguns checkbox, selecionamos a condição (maior, menor, diferente, entre) e informamos o parâmetro de consulta, como no exemplo da imagem abaixo:

 

Imagem Postada

 

Com a experiência de vocês, o que vcs recomendam para fazer?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É... até hoje eu não encontrei um jeito "bonitinho" de fazer isso, tem que ir testando os valores e concatenando a query como o Beraldo falou...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alex Martins,

 

Seu Post Nr. 2 foi excluído por desrespeitar as regras do fórum: http://forum.imaster...ore&module=help

 

10ª Regra

É proibido o post de mensagens com o objetivo de evidenciar o tópico, tornando-o primeiro da lista de tópicos (up), tal como mensagens repetitivas e/ou que não condizem com o assunto do tópico em questão (flood). Tais mensagens serão excluídas e o usuário advertido por MP.

 

É... até hoje eu não encontrei um jeito "bonitinho" de fazer isso, tem que ir testando os valores e concatenando a query como o Beraldo falou...

 

Bom, uma forma 'bonitinha' de se fazer isso:

 

Primeiro criamos uma classe que será nosso select:

Select.php

<?php
class Select {
private $criteria;
private $fields = array();
private $table;

public function __construct(){
$argv = func_get_args();
$argc = func_num_args();

for ( $i = 0 ; $i < $argc ; $i++ ) $this->fields[ $argv[ $i ] ] = $argv[ $i ];
}

public function __toString(){
return sprintf( 'select %s from %s %s' , count( $this->fields ) ? implode( ',' , $this->fields ) : '*' , $this->table , $this->criteria );
}

public function addField( $field ){ $this->fields[ $field ] = $field; }

public function fromTable( $table ){
$this->table = $table;
return $this;
}

public function where( Criteria $criteria ){
$criteria->setType( 'where' );
$this->criteria = $criteria;
}
}

 

A classe Select recebe no construtor um número indefinido de argumentos, cada argumento é um campo da tabela:

$stm = new Select( 'id' , 'nome' , 'usuario' );
$stm->fromTable( 'minhatabela' );

echo $stm;

 

Quando um objeto da classe é usado como string, o método __toString é chamado automaticamente e 'monta' a consulta para você, no exemplo acima a saída será:

select id,nome,usuario from minhatabela 

 

Agora adicionando os critérios da consulta:

 

Criteria.php

<?php
class Criteria {
private $storage = array();
private $type;

public function __construct( $type = 'where' ){
$this->type = $type;
}

public function __toString(){
$ret = null;

foreach ( $this->storage as $criteria ){
$op = $ret ? sprintf( ' %s ' , $criteria[ 'type' ] ) : null;

if ( $criteria[ 'o' ] !== null )
$ret .= sprintf( '%s(%s %s %s)' , $op , $criteria[ 'l' ] , $criteria[ 'o' ] , $criteria[ 'r' ] );
else
$ret .= sprintf( '%s%s' , $op , $criteria[ 'l' ] );
}

return $ret ? sprintf( '%s %s' , $this->type , $ret ) : '';
}

public function addCriteria( $lvalue , $operator = null , $rvalue = null , $type = 'and' ){
$this->storage[] = array( 'type' => $type , 'l' => $lvalue , 'o' => $operator , 'r' => $rvalue );
return $this;
}

public function setType( $type ){ $this->type = $type; }
}

 

A classe Criteria definirá as condições da consulta, por exemplo:

 

$criteria = new Criteria();
$criteria->addCriteria( 'id' , '=' , 10 );

$stm = new Select( 'id' , 'nome' , 'usuario' );
$stm->fromTable( 'teste' );
$stm->where( $criteria );

echo $stm;

 

Dessa vez, a saída será:

 

select id,nome,usuario from teste where (id=10)

 

Adicionando mais de uma condição:

 

$criteria = new Criteria();
$criteria->addCriteria( 'id' , '=' , 10 );
$criteria->addCriteria( 'nome' , 'LIKE' , '"Neto"' );

$stm = new Select( 'id' , 'nome' , 'usuario' );
$stm->fromTable( 'teste' );
$stm->where( $criteria );

echo $stm;

 

A saída será:

 

select id,nome,usuario from teste where (id = 10) and (nome LIKE "Neto")

 

Agora é só recuperar os dados do seu formulário e ir adicionando as condições conforme a requisição do usuário, quando tudo estiver pronto você pode utilizar o objeto $stm direto na função/método que fará a consulta:

 

$criteria = new Criteria();
$criteria->addCriteria( 'id' , '=' , 10 );
$criteria->addCriteria( 'nome' , 'LIKE' , '"Neto"' );

$stm = new Select( 'id' , 'nome' , 'usuario' );
$stm->fromTable( 'teste' );
$stm->where( $criteria );

if ( $res = mysql_query( $stm ) ){
while ( $row = mysql_fetch_array( $res ) ) var_dump( $row );
}

 

;)

 

*EDIT*: Corrigido o método __toString da classe Criteria para retornar uma string vazia caso nenhum critério seja adicionado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá João, agradecido mais uma vez por sua solução. Mas preciso passar a classe Select os campos invidualmente para fazer um foreach, pois dependem do checkbox selecionado pelo usuário. Da maneira que está passo predeterminando os campos via $stm = new Select( 'id' , 'nome' , 'usuario' );

 

A idéia seria mais ou menos esta:

$select = newSelect();

$select->addSelect( 'id' );
$select->addSelect( 'nome' );
$select->addSelect( 'curso' );

Obrigado,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu pessoal, consegui... apenas tratei a classe desta forma:

 

$stm = new Select();

$stm->addField('id');

$stm->addField('nome');

 

Estou me esforçando para aprender POO (Programação Orientada a Objetos), pois é o máximo.

 

Valeu a todos.

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.