Jump to content


Photo

Criando Sistema De Consulta


  • Faça o login para participar
3 replies to this topic

#1 Sereburo Sunju

Sereburo Sunju

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Não informado

Posted 10/09/2006, 13:43

Fala pessoas, e aí? Visito o fórum de vez em quando pra ver as dúvidas e dicas do pessoal, é bastante interessante... Só que esse é meu primeiro post.

Não sou exatamente o usuário avançado de PHP, sei mais ou menos os comandos, entrei num estágio aki da universidade e é a primeira vez que programo propriamente dito seguindo modelos, formalismos... Acho que a gente só aprende mesmo quando começa a trabalhar propriamente dito em algum lugar...

É o seguinte... estamos desenvolvendo lá um sistema de newsletter (informativos e jornalzinhos de email), eu mais 4 amigos, e cada um está encarregado de mais ou menos uma parte (pelo menos agora), e eu tou fazendo os sistemas de consultas... em termos, podemos consultar cada newsletter criada, pessoas cadastradas que recebem newsletters podem ser consultadas, e pegamos as informações delas no banco e imprimimos na tela...

Por exemplo, se consultarmos pessoas, pegamos do banco os dados dela referente a nome, data de nascimento, identidade, cpf...

Aparentemente, tudo que eu fiz aqui está em ordem, exceto um problema que é todos os dados de cada pessoa poderem ser consultadas (assim sendo, vc pode consultar a partir de cada um dos dez tipos de informações disponiveis, seja nome, identidade, cpf, email...). Você pode consultar por nome e email, por nome e cpf, por identidade e cpf... por todos os dados, ou por apenas um.

Não consigo chegar num consenso de como deve ser o comando sql da query, levando em conta que as vezes ela pode consultar soh por nome, ou soh por email... primeiramente eu fiz isso:

$_SESSION['sql'] = "SELECT * FROM autor WHERE nome='$this->nomeB' or email='$this->emailB' or cpf='$this->cpfB' or identidade='$this->identB' or data_nascimento='$this->data_nascB' or data_cadastro='$this->data_cadB' or data_modificacao='$this->data_modB' or biografia='$this->bioB'";

Não dá certo, temos que levar em conta que as vezes podemos consultar só por nome, e se algum registro no banco tiver dados de email nulo... esse registro tambem vai aparecer, não pode... existem registros que podem ter campos nulos, um deles eh email

Ah sim, eu gravo o comando SQL num session pra depois ser aproveitado num outro método de buscarDados que aí sim vai realizar a query e os dados serão arquivados num vetor... As variaveis nomeB, identidadeB armazenam o que a pessoa digitou num textfield a ser buscado, algo como:

$_POST["nome"] = $this->nomeB;

Pois é, o departamento de modelagem realmente naum tem dó de programadores, tem que definir os métodos e modelos UML da forma mais dificil pra gente =P

Eu já pensei em tudo, ateh em gambiarras, mas nada... existe algum jeito de gerar um comando SQL baseado soh nos dados que foram preenchidos no campo? Por exemplo, só preenchi o campo de nome e email, daí ele geraria o seguinte SQL:

$_SESSION['sql'] = "SELECT * FROM autor WHERE nome='$this->nomeB' and email='$this->emailB';

Se fosse apenas identidade por exemplo, geraria isso:

$_SESSION['sql'] = "SELECT * FROM autor WHERE identidade='$this->identB';

É possível fazer isso na mão, mas... olha o numero de possibilidades que você ia ter que fazer na mão, confuso e bagunçado demais =P

Ficou claro oq eu perguntei? Não que eu saiba explicar direito =P

Quem souber... salvou minha vida, valeu gente

Ops... Coisa de noob =P

Desculpa por ter quebrado a barra de rolagem, e mais uma coisa, onde está escrito:

$_POST["nome"] = $this->nomeB;

era isso aqui, eu me enganei:

$this->nomeB = $_POST["nome"];

Foi mal a confusão, se algum moderador puder ajeitar essas coisas pra mim no post inicial e apagar esse segundo post...

#2 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 11/09/2006, 10:08

mas retorna erro ou simplesmente não retornada nada ?

já experimentou colocar um or die (mysql_error()); depois da QUERY do SQL ?

outra coisa, da um ECHO na instrução do SQL para ver se está TUDO OK !

T+
-----------------------------------------------------------------------
PALMEIRAS - Primeiro campeão do mundo em 1951

#3 fly2k

fly2k

    Super Veterano

  • Usuários
  • 2262 posts
  • Sexo:Não informado

Posted 11/09/2006, 12:42

Velho... tem que tratar campo a campo mesmo....

ujma maneira de código legível:
$sql = "";
if (isset($_POST['campo1']) && !empty($_POST['campo1'])
	$sql.= (strlen($sql)==0?" ":" OR ") . "campo1 LIKE \"%" . $_POST['campo1'] . "%\"";
if (isset($_POST['campo2']) && !empty($_POST['campo2'])
	$sql.= (strlen($sql)==0?" ":" OR ") . "campo2 LIKE \"%" . $_POST['campo2'] . "%\"";
...
if (isset($_POST['campo3']) && !empty($_POST['campo3'])
	$sql.= (strlen($sql)==0?" ":" OR ") . "campo3 LIKE \"%" . $_POST['campo3'] . "%\"";

$_SESSION['sql'] = "SELECT * FROM tabela" . (strlen($sql)==0?"":$sql) . " ORDER BY id";

* não testado
Quer aprender PHP? -> www.manjaphp.com.br
Tutoriais, código colaborativo (pastebin), curso de PHP, artigos e etc.

#4 Sereburo Sunju

Sereburo Sunju

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Não informado

Posted 13/09/2006, 18:51

(Aprendendo a postar em foruns, hehe)

Aí que tá Goku Jr... erro não dá, mas eu não conseguia criar o SQL adequado, pois o comando SQL depende dos dados que o usuário preencheu pra iniciar a busca, eu naum chegava a um consenso...

E fly2k... realmente, eu pensei em fazer campo a campo, mas como são dez campos, o código ia ficar muito grande e confuso... e esse código vai ser disponibilizado pra parceiros da empresa que estagio...

Mas olha só, eu resolvi esse problema ontem, olha o código:

Esse é o método construtor, ele recebe os dados que a pessoa escreveu nos campos para consultar no BD:

function __construct($nomeC,$emailC,$cpfC,$identC,$data_nascC,$data_cadC,$data_modC,$bioC){
		$this->nomeB = $nomeC;
		$this->emailB = $emailC;
		$this->cpfB = $cpfC;
		$this->identB = $identC;
		$this->data_nascB = $data_nascC;
		$this->data_cadB = $data_cadC;
		$this->data_modB = $data_modC;
		$this->bioB = $bioC;
		
		if(!($this->nomeB==NULL)) { $nomesql = "nome like '%$this->nomeB%'"; } else{ $nomesql = "1 = 1"; }
		if(!($this->emailB=='')) { $mailsql = "email like '%$this->emailB%'"; } else{ $mailsql = "1 = 1"; }
		if(!($this->cpfB==NULL)) { $cpfsql = "cpf like '%$this->cpfB%'"; } else{ $cpfsql = "1 = 1"; }
		if(!($this->identB=='')) { $identsql = "identidade like '%$this->identB%'"; } else{ $identsql = "1 = 1"; }
		if(!($this->data_nascB=='')) { $nascsql = "data_nascimento like '%$this->data_nascB%'"; } else{ $nascsql = "1 = 1"; }
		if(!($this->data_cadB=='')) { $cadsql = "data_cadastro like '%$this->data_cadB%'"; } else{ $cadsql = "1 = 1"; }
		if(!($this->data_modB==NULL)) { $modsql = "data_modificacao like '%$this->data_modB%'"; } else{ $modsql = "1 = 1"; }
		if(!($this->bioB==NULL)) { $biosql = "biografia like '%$this->bioB%'"; } else{ $biosql = "1 = 1"; }
		
		$_SESSION['sql'] = "SELECT * FROM autor WHERE ".$nomesql." and ".$mailsql." and ".$cpfsql." and ".$identsql." and ".$nascsql." and ".$cadsql." and ".$modsql." and ".$biosql;
	}

hehe... entenderam oq eu fiz pra gerar o SQL? Se por exemplo o campo "nome" é um dos campos que a pessoa busca, no lugar de $nomesql ele coloca "nome like '%$this->nomeB%'"... ou seja, ele procura no campo um registro que seja parecido ao nome que eu busquei no campo...

Se eu naum coloquei nada no campo nome pra buscar, entaum ele coloca a variavel $nomesql recebendo 1=1... pq eu fiz isso?

Simples, se eu deixasse ao invés de um "1=1" as variaveis vazias, todos os campos vazios exceto o de nome iam gerar um comando sql do tipo: "Select * From autor where and and and and"... ia ficar and soltos, ia dar pau, fiz uma gambiarra e forcei a barra de que algo ficasse no lugar =P

Foi uma gambiarra engraçada, no estágio ficaram morrendo de rir XD mas funcionou... se naum achar uma solução melhor vai ter q ser essa mesma, fazer oq =P

Mas eh isso, valeu caras...




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq