Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

diokhan

search mesma pagina tabelas diferentes

Recommended Posts

diokhan

boas,

como o nome do tópico diz, eu preciso de fazer uma pagina de pesquisa, ao inicio não apresenta dados, só serve para fazer a pesquisa e depois da pesquisa que aparece os dados referentes a pesquisa, mas posso fazer a pesquisa em 3 tabelas diferentes, onde não há relação entre elas.

a minha ideia foi, com uma combo box, colocar as opção para a pesquisa e conforme a opção escolhida eu vou pesquisar na tabela especifica e apresento só os dados referentes a essa tabela, espero ter-me feito perceber.

alguém pode ajudar-me a orientar as ideias? :D


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

neste momento o meu código esta assim:

<?php
require_once ('./admin/page.php');

echo'
<form method="POST" action="restrito.php?opcao=searchBGI">
      <fieldset>
        Search:
        <input type="text" id="consulta" name="consulta" maxlength="100" />
        <SELECT name="lst_search">
        	<option value="ID_GOTERMS">Id GO Terms</option>
			<option value="NAME_GO_TERMS">Name GO Terms</option>
        	<option value="HIT_DESCRIPTION">Hit Description</option>
        	<option value="NAME_INTERPRO">Name Interpro</option>
       		</SELECT>';

		$alias = array(
                'ID_GOTERMS' => 'Id GO Terms',
                'HIT_DESCRIPTION' => 'Hit Description',
                'NAME_INTERPRO' => 'Name Interpro',
			'NAME_GO_TERMS' => 'Name GO Termos'
			);

		$lst_search = $alias[$_POST['lst_search']];

		echo' <input type="submit" value="Search" />
		<br><br>';
		if(empty($_POST['consulta'])){

		}elseif (isset($_POST['consulta'])) 
			{
				echo 'Searching for:<strong> '.$consulta. '</strong> in:<strong> '.$lst_search.'</strong>';
			}
		echo' </fieldset>
    </form>
<table class="sortable" align=center>';
    if (empty($_POST['consulta'])){

}else{
	if ($_POST['lst_search'] == 'ID_GOTERMS'){
		echo '<th  align=center>
    		Id GO Terms
        </th>';
	}elseif($_POST['lst_search'] == 'NAME_GO_TERMS'){
		echo '<th  align=center>
    		Name GO Terms
        </th>';	
	}elseif ($_POST['lst_search'] == 'HIT_DESCRIPTION'){
		echo '<th  align=center>
    		Hit Description
        </th>';
	}elseif ($_POST['lst_search'] == 'NAME_INTERPRO'){
		echo '<th  align=center>
    		Name Interpro
        </th>';
	}
}
       	$conexao = new Conexao();
	$conexao = $conexao->conexao;

	$paginacao = new Paginacao_PDO();
	if (!isset($_POST['consulta'])) {

	}elseif (empty($_POST['consulta'])){
		$auth_error = '<div id="notification_error">Search empty! Please enter a search word!</div>';
   			echo $auth_error;

	}elseif (strlen($_POST['consulta']) < 3){
		$auth_error = '<div id="notification_error">Search must be at least 3 characters!</div>';
   			echo $auth_error;
   				
	}else{
		if ($_POST['lst_search'] == 'ID_GOTERMS' OR $_POST['lst_search'] == 'NAME_GO_TERMS'){
			$paginacao->sql = "SELECT * FROM GOTERMS AS G
							WHERE ".$_POST['lst_search']." LIKE '%".$_POST['consulta']."%'";

		}elseif ($_POST['lst_search'] == 'HIT_DESCRIPTION'){
			$paginacao->sql = "SELECT * FROM BLAST AS B
							WHERE ".$_POST['lst_search']." LIKE '%".$_POST['consulta']."%'";

		}elseif ($_POST['lst_search'] == 'NAME_INTERPRO'){
			$paginacao->sql = "SELECT * FROM INTERPRO AS I
							WHERE ".$_POST['lst_search']." LIKE '%".$_POST['consulta']."%'";
		}
	}
	if (empty($_POST['consulta'])){

	}else{
		$res = $conexao->query($paginacao->sql());

		while($r = $res->fetch(PDO::FETCH_OBJ)) {
			if ($_POST['lst_search'] == 'ID_GOTERMS'){
				echo '<tr>
	        	<td>';
	        		print $r->ID_GOTERMS;
	        	echo'</td>';
			}elseif($_POST['lst_search'] == 'NAME_GO_TERMS'){
				echo '<tr>
	        	<td>';
	        		print $r->NAME_GO_TERMS;
	        	echo'</td>';	
			}elseif ($_POST['lst_search'] == 'HIT_DESCRIPTION'){
				echo '<tr>
	        	<td>';
	        		print $r->HIT_DESCRIPTION;
	        	echo'</td>';
			}elseif ($_POST['lst_search'] == 'NAME_INTERPRO'){
				echo '<tr>
	        	<td>';
	        		print $r->NAME_INTERPRO;
	        	echo'</td>';
			}
		}
	}
echo "</tr></table>";
if (empty($_POST['consulta'])){

}else{
	$paginacao->imprimeBarraNavegacao();
}
?>

se alguém souber forma de melhorar aceito opiniões, e sei de um problema, depois de efectuar uma pesquisa aparece a paginação por baixo, e se caso eu clicar para ir para outra página eu perco tudo, logo, preciso de guardar a pesquisa para manter a paginação activa porque não quero perder tudo, quero que as pessoas possam andar pelas varias paginas


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

alterei o meu código para este:

<?php
require_once ('./admin/page.php');

echo'
<form method="POST" action="restrito.php?opcao=searchBGI">
      <fieldset>
        Search:
        <input type="text" id="consulta" name="consulta" maxlength="100" />
        <SELECT name="lst_search">
        	<option value="ID_GOTERMS">Id GO Terms</option>
			<option value="NAME_GO_TERMS">Name GO Terms</option>
        	<option value="HIT_DESCRIPTION">Hit Description</option>
        	<option value="NAME_INTERPRO">Name Interpro</option>
       		</SELECT>';

		$alias = array(
                'ID_GOTERMS' => 'Id GO Terms',
                'HIT_DESCRIPTION' => 'Hit Description',
                'NAME_INTERPRO' => 'Name Interpro',
			'NAME_GO_TERMS' => 'Name GO Termos'
			);

		$lst_search = $alias[$_POST['lst_search']];

		$_SESSION['pesquisa'] = $_POST['consulta'];

		echo' <input type="submit" value="Search" />
		<br><br>';
		if(empty($_POST['consulta'])){

		}elseif (isset($_POST['consulta'])) 
			{
				echo 'Searching for:<strong> '.$_POST['consulta']. '</strong> in:<strong> '.$lst_search.'</strong>';
			}
		echo' </fieldset>
    </form>
<table class="sortable" align=center>';
   
	if ($_POST['lst_search'] == 'ID_GOTERMS'){
		echo '<th  align=center>
    		Id GO Terms
        </th>';
	}elseif($_POST['lst_search'] == 'NAME_GO_TERMS'){
		echo '<th  align=center>
    		Name GO Terms
        </th>';	
	}elseif ($_POST['lst_search'] == 'HIT_DESCRIPTION'){
		echo '<th  align=center>
    		Hit Description
        </th>';
	}elseif ($_POST['lst_search'] == 'NAME_INTERPRO'){
		echo '<th  align=center>
    		Name Interpro
        </th>';
	}

       	$conexao = new Conexao();
	$conexao = $conexao->conexao;

	$paginacao = new Paginacao_PDO();
	if (!isset($_SESSION['pesquisa'])) {
			$paginacao->sql = "SELECT * FROM INTERPRO AS I";

	}elseif (empty($_POST['consulta'])){
		$auth_error = '<div id="notification_error">Search empty! Please enter a search word!</div>';
   			echo $auth_error;
			$paginacao->sql = "SELECT * FROM INTERPRO AS I";

	}elseif (strlen($_POST['consulta']) < 3){
		$auth_error = '<div id="notification_error">Search must be at least 3 characters!</div>';
   			echo $auth_error;
   				$paginacao->sql = "SELECT * FROM INTERPRO AS I";
   				
	}elseif ($_POST['lst_search'] == 'ID_GOTERMS' OR $_POST['lst_search'] == 'NAME_GO_TERMS'){
			$paginacao->sql = "SELECT * FROM GOTERMS AS G
							WHERE ".$_POST['lst_search']." LIKE '%".$_POST['consulta']."%'";

	}elseif ($_POST['lst_search'] == 'HIT_DESCRIPTION'){
			$paginacao->sql = "SELECT * FROM BLAST AS B
							WHERE ".$_POST['lst_search']." LIKE '%".$_POST['consulta']."%'";

	}elseif ($_POST['lst_search'] == 'NAME_INTERPRO'){
			$paginacao->sql = "SELECT * FROM INTERPRO AS I
							WHERE ".$_POST['lst_search']." LIKE '%".$_POST['consulta']."%'";
	}

		$res = $conexao->query($paginacao->sql());

		while($r = $res->fetch(PDO::FETCH_OBJ)) {
			if ($_POST['lst_search'] == 'ID_GOTERMS'){
				echo '<tr>
	        	<td>';
	        		print $r->ID_GOTERMS;
	        	echo'</td>';
			}elseif($_POST['lst_search'] == 'NAME_GO_TERMS'){
				echo '<tr>
	        	<td>';
	        		print $r->NAME_GO_TERMS;
	        	echo'</td>';	
			}elseif ($_POST['lst_search'] == 'HIT_DESCRIPTION'){
				echo '<tr>
	        	<td>';
	        		print $r->HIT_DESCRIPTION;
	        	echo'</td>';
			}elseif ($_POST['lst_search'] == 'NAME_INTERPRO'){
				echo '<tr>
	        	<td>';
	        		print $r->NAME_INTERPRO;
	        	echo'</td>';
			}
		}
echo "</tr></table>";
$paginacao->imprimeBarraNavegacao();
?>

ainda não faz o que preciso, faz as pesquisas mas não guarda o valor da pesquisa, e preciso de guardar nem que seja numa variável de sessão, para ser possível andar pelas paginas onde tem os dados todos, neste momento efectua a pesquisa e quando mudo de pagina perco a pesquisa

:D


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
yoda

Cria um cookie ou uma variável de sessão com um hash qualquer, e associa esse hash a um registo numa tabela para o efeito (user_options ou assim), e dentro dessa tabela metes um campo para um array serializado com todas essas informações que precisas preservar.

Sem ser assim, só se serializares a informação toda directamente no cookie ou sessão.

Share this post


Link to post
Share on other sites
diokhan

eu também pensei em fazer uma coisa para diminuir as linhas de código, uma combobox dinâmica, 1º escolho a tabela e depois só devolve os campos da tabela seleccionada anteriormente, assim já conseguia reduzir muito o meu código, mas tambem ando a aprender a fazer isto, já sei que preciso de jquery mas ainda não estou a saber implementar no meu código

:wallbash:

quanto a tua ideia yoda.pt, podes dar-me algum tutorial ou assim para eu estudar e aprender? e obrigado :D


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

quanto a combobox dinâmica, tudo o que encontro é por base de dados, e eu não quero e nem preciso de ir a base de dados buscar nada, já tentei adaptar alguns exemplos sem sucesso.

basicamente a minha ideia é, para fazer a pesquisa o utilizador escolhe a tabela onde pesquisar, e conforme a tabela escolhe o campo onde pesquisar, mas só preciso apresentar 3 nomes de tabelas e 4 campos, onde 2 campos são da mesma tabela, posso definir isto dentro de um array pelo próprio php. alguém sabe algum tutorial ou assim parecido com isto que me possa ajudar?

o meu código actualizado:

<?php
require_once ('./admin/page.php');

echo'
<form method="POST" action="restrito.php?opcao=searchBGI">
      <fieldset>
        Search:
        <input type="text" id="consulta" name="consulta" maxlength="100" />';

        echo 'Table: <SELECT name="lst_table">
			<option value="GOTERMS">GO Terms</option>
			<option value="INTERPRO">InterPro</option>
			<option value="BLAST">Blast</option>
		</SELECT>
        
		Field: <SELECT name="lst_search">
        	<option value="ID_GOTERMS">Id GO Terms</option>
			<option value="NAME_GO_TERMS">Name GO Terms</option>
        	<option value="HIT_DESCRIPTION">Hit Description</option>
        	<option value="NAME_INTERPRO">Name Interpro</option>
       		</SELECT>';

		$alias = array(
			'GOTERMS' => 'GO Terms',
			'INTERPRO' => 'InterPro',
			'BLAST' => 'Blast'
		);

		$lst_table = $alias[$_POST['lst_table']];

		$alias = array(
                'ID_GOTERMS' => 'Id GO Terms',
                'HIT_DESCRIPTION' => 'Hit Description',
                'NAME_INTERPRO' => 'Name Interpro',
			'NAME_GO_TERMS' => 'Name GO Termos'
			);

		$lst_search = $alias[$_POST['lst_search']];



		echo' <input type="submit" value="Search" />
		<br><br>';
		if(empty($_POST['consulta'])){

		}elseif (isset($_POST['consulta'])) 
			{
				echo 'Searching for:<strong> '.$_POST['consulta']. '</strong> in:<strong> '.$lst_table.' - '.$lst_search.'</strong>';
			}
		echo' </fieldset>
    </form>';
    
    $search = $_POST['consulta'];
    $table = $_POST['lst_table'];
    $field = $_POST['lst_search'];
    /*echo $search. "\n";
    echo $table. "\n";
    echo $field. "\n";*/
    
    
echo '<table class="sortable" align=center>';
if (empty($_POST['consulta'])) {

}else{
	if ($_POST['lst_search'] == 'ID_GOTERMS'){
		echo '<th  align=center>
    		Id GO Terms
        </th>';
	}elseif($_POST['lst_search'] == 'NAME_GO_TERMS'){
		echo '<th  align=center>
    		Name GO Terms
        </th>';	
	}elseif ($_POST['lst_search'] == 'HIT_DESCRIPTION'){
		echo '<th  align=center>
    		Hit Description
        </th>';
	}elseif ($_POST['lst_search'] == 'NAME_INTERPRO'){
		echo '<th  align=center>
    		Name Interpro
        </th>';
	}
}

       	$conexao = new Conexao();
	$conexao = $conexao->conexao;

	$paginacao = new Paginacao_PDO();
	if (!isset($_POST['consulta'])) {
			$paginacao->sql = "SELECT * FROM user";

	}elseif (empty($_POST['consulta'])){
		$auth_error = '<div id="notification_error">Search empty! Please enter a search word!</div>';
   			echo $auth_error;
			$paginacao->sql = "SELECT * FROM user";

	}elseif (strlen($_POST['consulta']) < 3){
		$auth_error = '<div id="notification_error">Search must be at least 3 characters!</div>';
   			echo $auth_error;
				if ($_POST['lst_search'] == 'ID_GOTERMS' OR $_POST['lst_search'] == 'NAME_GO_TERMS'){
						$paginacao->sql = "SELECT * FROM GOTERMS AS G";

				}elseif ($_POST['lst_search'] == 'HIT_DESCRIPTION'){
						$paginacao->sql = "SELECT * FROM BLAST AS B";

				}elseif ($_POST['lst_search'] == 'NAME_INTERPRO'){
						$paginacao->sql = "SELECT * FROM INTERPRO AS I";
				}
   				
	}elseif ($_POST['lst_search'] == 'ID_GOTERMS' OR $_POST['lst_search'] == 'NAME_GO_TERMS'){
			$paginacao->sql = "SELECT * FROM GOTERMS AS G
							WHERE ".$_POST['lst_search']." LIKE '%".$_POST['consulta']."%'";

	}elseif ($_POST['lst_search'] == 'HIT_DESCRIPTION'){
			$paginacao->sql = "SELECT * FROM BLAST AS B
							WHERE ".$_POST['lst_search']." LIKE '%".$_POST['consulta']."%'";

	}elseif ($_POST['lst_search'] == 'NAME_INTERPRO'){
			$paginacao->sql = "SELECT * FROM INTERPRO AS I
							WHERE ".$_POST['lst_search']." LIKE '%".$_POST['consulta']."%'";
	}




		$res = $conexao->query($paginacao->sql());
		if (empty($_POST['consulta'])) {
			}else{
		while($r = $res->fetch(PDO::FETCH_OBJ)) {
			if ($_POST['lst_search'] == 'ID_GOTERMS'){
				echo '<tr>
	        	<td>';
	        		print $r->ID_GOTERMS;
	        	echo'</td>';
			}elseif($_POST['lst_search'] == 'NAME_GO_TERMS'){
				echo '<tr>
	        	<td>';
	        		print $r->NAME_GO_TERMS;
	        	echo'</td>';	
			}elseif ($_POST['lst_search'] == 'HIT_DESCRIPTION'){
				echo '<tr>
	        	<td>';
	        		print $r->HIT_DESCRIPTION;
	        	echo'</td>';
			}elseif ($_POST['lst_search'] == 'NAME_INTERPRO'){
				echo '<tr>
	        	<td>';
	        		print $r->NAME_INTERPRO;
	        	echo'</td>';
			}
		}
	}
echo "</tr></table>";
$paginacao->imprimeBarraNavegacao();
?>


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

e como posso fazer a pesquisa nas 3 tabelas diferentes que tenho? e é possível fazer a pesquisa em simultâneo mas só aparecer quando encontrar resultados? por exemplo, eu pesquiso por "pesca" e só em duas tabelas há a palavra "pesca", logo ao mostrar os resultados só devolvia estes resultados, e onde não tivesse resultados ficasse oculto ou assim, assim já era uma forma de não ter combobox, quanto ao problema das paginas é que ainda não descobri como fazer

:D


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

agora estou a falar de tabelas da base de dados, se é possível fazer uma query para procurar em 3 tabelas diferentes o mesmo valor de pesquisa, e só mostrar os resultados obtidos


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

eu tenho uma base de dados com muitas tabelas, base de dados criada pelo meu chefe, e ele diz que preciso de criar uma parte no site onde posso efectuar uma pesquisa, mas que só é para consultar 3 tabelas diferentes em que não há relação entre elas, e numa das tabelas tenho dois campos onde pesquisar

como posso fazer este tipo de pesquisa? nas 3 tabelas em simultâneo e mostrar apenas o que me interessa

se eu fizer este tipo de pesquisa ja posso retirar as combobox e fica mais limpo o meu código


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

e como posso juntar os resultados? para aparecer só os que pesquisei, eu fiz 3 queries diferentes, achei mais simples


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

neste momento o meu código esta assim:

<?php
require_once ('./admin/page.php');

echo'
<form method="POST" action="restrito.php?opcao=searchBGI">
      <fieldset>
        Search:
        <input type="text" id="consulta" name="consulta" maxlength="100" />';
		echo'<input type="submit" value="Search" />
		<br><br>';
		if(empty($_POST['consulta'])){

		}elseif (isset($_POST['consulta'])) 
			{
				echo 'Searching for:<strong> '.$_POST['consulta'];
			}
		echo' </fieldset>
    </form>';

echo '<table class="sortable" align=center>';
if (empty($_POST['consulta'])) {

}else{
		echo '<th  align=center>
    		Id GO Terms
        </th>';
		echo '<th  align=center>
    		Name GO Terms
        </th>';
		echo '<th  align=center>
    		Hit Description
        </th>';
		echo '<th  align=center>
    		Name Interpro
        </th>';
	}

       	$conexao = new Conexao();
	$conexao = $conexao->conexao;

	$paginacao = new Paginacao_PDO();
	if (!isset($_POST['consulta'])) {
			$paginacao->sql = "SELECT * FROM user";

	}elseif (empty($_POST['consulta'])){
		$auth_error = '<div id="notification_error">Search empty! Please enter a search word!</div>';
   			echo $auth_error;
			$paginacao->sql = "SELECT * FROM user";

	}elseif (strlen($_POST['consulta']) < 3){
		$auth_error = '<div id="notification_error">Search must be at least 3 characters!</div>';
   			echo $auth_error;
		$paginacao->sql = "SELECT * FROM user";		

	}else{
		$paginacao->sql = "SELECT * FROM GOTERMS AS G
							WHERE ID_GOTERMS LIKE '%".$_POST['consulta']."%'
							OR 
							NAME_GO_TERMS LIKE '%".$_POST['consulta']."%'";
		$paginacao->sql = "SELECT * FROM BLAST AS B
							WHERE HIT_DESCRIPTION LIKE '%".$_POST['consulta']."%'";
		$paginacao->sql = "SELECT * FROM INTERPRO AS I
							WHERE NAME_INTERPRO LIKE '%".$_POST['consulta']."%'";
	}
		$res = $conexao->query($paginacao->sql());
		if (empty($_POST['consulta'])) {

		}else{
			while($r = $res->fetch(PDO::FETCH_OBJ)) {
					echo '<tr>
		        	<td>';
		        		print $r->ID_GOTERMS;
		        	echo'</td>';
					echo '<tr>
		        	<td>';
		        		print $r->NAME_GO_TERMS;
		        	echo'</td>';	
					echo '<tr>
		        	<td>';
		        		print $r->HIT_DESCRIPTION;
		        	echo'</td>';
					echo '<tr>
		        	<td>';
		        		print $r->NAME_INTERPRO;
		        	echo'</td>';
				}
			}
echo "</tr></table>";
$paginacao->imprimeBarraNavegacao();
?>

mas não aparece os resultados da pesquisa, estou a fazer algo de errado?


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

corri no navicat, não deu erro, mas também não me devolveu valores como quero, fez a pesquisa, mas apresentou tudo e fazia muitos registos iguais, estava sempre a repetir os registos.

:wallbash:

esta foi a query que fiz no navicat, tentei melhorar a que tinha antes:

SELECT
G.NAME_GO_TERMS,
G.ID_GOTERMS,
B.HIT_DESCRIPTION,
I.NAME_INTERPRO
FROM
GOTERMS AS G ,
BLAST AS B ,
INTERPRO AS I
WHERE
B.HIT_DESCRIPTION =  'hypothetical protein BRAFLDRAFT_125291 [branchiostoma floridae]'

já percebi que preciso de um GROUP BY para não repetir os registos, mas como posso fazer um GROUP BY se os campos são todos diferentes? não há relação entre eles

:D

e com esta query entra em ciclo infinito:

SELECT
G.NAME_GO_TERMS,
G.ID_GOTERMS,
B.HIT_DESCRIPTION,
I.NAME_INTERPRO
FROM
GOTERMS AS G ,
BLAST AS B ,
INTERPRO AS I
WHERE
B.HIT_DESCRIPTION LIKE  '%hyp%' OR
G.ID_GOTERMS LIKE  '%hyp%' OR
G.NAME_GO_TERMS LIKE  '%hyp%' OR
I.NAME_INTERPRO LIKE '%hyp%'
GROUP BY
B.HIT_DESCRIPTION


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

eu tentei com esta query:

$paginacao->sql = "(SELECT * FROM GOTERMS AS G
							WHERE G.ID_GOTERMS LIKE '%".$_POST['consulta']."%' OR
							G.NAME_GO_TERMS LIKE '%".$_POST['consulta']."%')
							UNION
							(SELECT * FROM BLAST AS B
							WHERE B.HIT_DESCRIPTION LIKE  '%".$_POST['consulta']."%')
							UNION
							(SELECT * FROM INTERPRO AS I
							WHERE I.NAME_INTERPRO LIKE '%".$_POST['consulta']."%')";

mas deu-me este erro:

Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\BioCant\BioCantProject\searchBGI\searchBGI.php on line 145

a linha 145 é esta:

$res = $conexao->query($paginacao->sql());
		if (empty($_POST['consulta'])) {

		}else{
			while($r = $res->fetch(PDO::FETCH_OBJ)) {

PS: tive acesso ao esquema da base de dados que estou a utilizar, e há umas relações entre as tabelas, mas vou ter de usar cerca de 7 ou 8 tabelas ao mesmo tempo, mas já se torna mais simples ao ter relações

desde já obrigado pela ajuda  ;)


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

é verdade eu tinha 3 queries diferentes, mas eu andei a testar varias alternativas, ate que o meu chefe disponibilizou o desenho das base de dados, o que me deu outra perspectiva do problema e perceber que afinal havia relações, mas que iria necessitar de mais tabelas nas queries para resolver, ainda não esta feito as queries todas, mas ando a trabalhar nisso, mas desde já agradeço a tua ajuda e disponibilidade


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

já tenho apenas uma query a funcionar, com tudo o que preciso, e tenho assim o meu código que faz a pesquisa:

<?php
$hitDescription = $_POST['hitDescription'];
$idGOTerms = $_POST['idGOTerms'];
$nameGOTerms = $_POST['nameGOTerms'];
$nameInterpro = $_POST['nameInterpro'];
$nameProtein = $_POST['nameProtein'];

$szTemp = "";
//$szInnerJoin = "";
$bFirst = true;
$count=0;

// hit description
if ($hitDescription != ""){
	$szTemp = " WHERE B.HIT_DESCRIPTION LIKE '%".$_POST['hitDescription']."%' ";
	echo "Searching for: <strong>Hit Description: <font color=#006633>".$hitDescription."</font></strong>";

} 

// id GO terms
if ($idGOTerms != ""){
	$count=$count+1;
	if (!empty($szTemp)){
		$szTemp .= "AND ";
		echo "; <strong>Id GO Terms: <font color=#006633>".$idGOTerms."</font></strong>";
	}
	else{
		$szTemp .= " WHERE ";
		echo "Searching for: <strong>Id Plate: <font color=#006633>".$idGOTerms."</font></strong>";
	}
	$szTemp .= "G.ID_GOTERMS LIKE '%".$_POST['idGOTerms']."%' ";
}

// name GO terms
if ($nameGOTerms != ""){
	$count=$count+1;
	if (!empty($szTemp)){
		$szTemp .= "AND ";

		if ($count>1)
		{
			echo "<br> <strong>Name GO Terms: <font color=#006633>".$nameGOTerms."</font></strong>";
		}else{
			echo "; <strong>Name GO Terms: <font color=#006633>".$nameGOTerms."</font></strong>";
		}
	}
	else{
		$szTemp .= " WHERE ";
		echo "Searching for: <strong>Name GO Terms: <font color=#006633>".$nameGOTerms."</font></strong>";
	}
	$szTemp .= "G.NAME_GO_TERM LIKE '%".$_POST['nameGOTerms']."%' ";
}

// name interpro
if ($nameInterpro != ""){
	$count=$count+1;
	if (!empty($szTemp)){
		$szTemp .= "AND ";
		if ($count>3)
		{
			echo "<br> <strong>Name Interpro: <font color=#006633>".$nameInterpro."</font></strong>";
		}else{
			echo "; <strong>Name Interpro: <font color=#006633>".$nameInterpro."</font></strong>";
		}
	}
	else{
		$szTemp .= " WHERE ";
		echo "Searching for: <strong>Name Interpro: <font color=#006633>".$nameInterpro."</font></strong>";
	}
	$szTemp .= "I.NAME_INTERPRO LIKE '%".$_POST['nameInterpro']."%' ";
}

// name protein
if ($nameProtein != ""){
	$count=$count+1;
if (!empty($szTemp)){
		$szTemp .= "AND ";
		if ($count>3)
		{
			echo "<br> <strong>Protein Name: <font color=#006633>".$nameProtein."</font></strong>";
		}else{
			echo "; <strong>Protein Name: <font color=#006633>".$nameProtein."</font></strong>";
		}
	}
	else{
		$szTemp .= " WHERE ";
		echo "Searching for: <strong>Protein Name: <font color=#006633>".$nameProtein."</font></strong>";
	}
	$szTemp .= "P.NAME_PROTEIN LIKE '%".$_POST['nameProtein']."%' ";
}

// query
$paginacao->sql = "SELECT DISTINCT * FROM BLAST AS B
				Inner Join PROTEIN AS P ON B.ID_PROTEIN = P.ID_PROTEIN
				Inner Join INTERPRO_PROTEIN AS IP ON IP.ID_PROTEIN = P.ID_PROTEIN
				Inner Join INTERPRO AS I ON I.ID_INTERPRO = IP.ID_INTERPRO
				Inner Join PROTEINS_GOTERMS AS PG ON PG.ID_INTERPRO_PROTEIN = IP.ID_INTERPRO_PROTEIN
				Inner Join GOTERMS AS G ON G.ID_GOTERMS = PG.ID_GOTERMS 
				" . $szTemp . " ORDER BY B.ID_BLAST ASC";

?>

yoda.pt podes dar uma explicação sobre isto, para eu entender e poder colocar na minha pagina:

Cria um cookie ou uma variável de sessão com um hash qualquer, e associa esse hash a um registo numa tabela para o efeito (user_options ou assim), e dentro dessa tabela metes um campo para um array serializado com todas essas informações que precisas preservar.

Sem ser assim, só se serializares a informação toda directamente no cookie ou sessão.

que preciso deixar a pesquisa activa para poder andar pelas paginas, a pesquisa só funciona enquanto o campo para pesquisar enviar algo, eu já pensei em criar uma tabela onde guardo tudo o que pesquiso e teria um campo que seria 0 ou 1, 0 para ja pesquisado e 1 que é a pesquisa recente, não sei se é viável esta solução

;)


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

pensei em fazer assim:

// Save $szTemp in Database "search"
$stmt= $dbh->prepare("INSERT INTO search (VALUE) VALUES (:value)");
$stmt->bindParam(':value', serialize($szTemp));
$stmt->execute();

try {
	$stmt= $dbh->prepare("SELECT * FROM search AS S WHERE ID = :id");
	$stmt->bindParam(':id', $dbh->lastInsertId());
	$stmt->execute();
} catch (PDOException $e) {
		    echo 'Query error: ' . $e->getMessage();
		}
	if($stmt->rowCount() > 0 )
		{	
			$result = $stmt->fetch(PDO::FETCH_BOTH);
			$_SESSION['ID_SEARCH'] = unserialize($result[0]);
			$_SESSION['VALUE'] = unserialize($result[1]);

			return true;
		}
		else
		{
			return false;
		}
		echo $_SESSION['ID_SEARCH']."<br>";
		echo $_SESSION['VALUE'];

// query
$paginacao->sql = "SELECT DISTINCT * FROM BLAST AS B
				Inner Join PROTEIN AS P ON B.ID_PROTEIN = P.ID_PROTEIN
				Inner Join INTERPRO_PROTEIN AS IP ON IP.ID_PROTEIN = P.ID_PROTEIN
				Inner Join INTERPRO AS I ON I.ID_INTERPRO = IP.ID_INTERPRO
				Inner Join PROTEINS_GOTERMS AS PG ON PG.ID_INTERPRO_PROTEIN = IP.ID_INTERPRO_PROTEIN
				Inner Join GOTERMS AS G ON G.ID_GOTERMS = PG.ID_GOTERMS 
				" . $szTemp . " ORDER BY B.ID_BLAST ASC";

mas não esta a funcionar, eu ainda não percebi o serialize e assim, se alguém puder arranjar-me um tutorial ou uma breve explicação. Já procurei na Internet sobre isto, mesmo no site do php.net, mas não percebi bem a ideia

;)


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

entao a forma como eu fiz:

<?php
...
$stmt= $dbh->prepare("INSERT INTO search (VALUE) VALUES (:value)");
$stmt->bindParam(':value', serialize($szTemp));
$stmt->execute();

try {
	$stmt= $dbh->prepare("SELECT ID_SEARCH, VALUE FROM search AS S WHERE ID_SEARCH = :id");
	$stmt->bindParam(':id', $dbh->lastInsertId());
	$stmt->execute();
} catch (PDOException $e) {
		    echo 'Query error: ' . $e->getMessage();
		}
	if($stmt->rowCount() > 0 )
		{	
			$result = $stmt->fetch(PDO::FETCH_BOTH);
			$_SESSION['ID_SEARCH'] = unserialize($result[0]);
			$_SESSION['VALUE'] = unserialize($result[1]);

			return true;
		}
		else
		{
			return false;
		}
		echo $_SESSION['ID_SEARCH']."<br>";
		echo $_SESSION['VALUE'];
...
?>

esta certo? eu já vi na base de dados que esta a guardar os valores, tento apanhar pelo ultimo id inserido mas quando faço o echo não devolve nenhum valor.

PS: eu pensei em criar um novo campo na tabela "search" que iria guardar a data e a hora da pesquisa, desta forma podia verificar se a pesquisa ainda esta activa ou não conforme as horas, por exemplo, comparava o dia se fosse igual ao dia actual verificava as horas se o intervalo de tempo guardado na base de dados fosse inferior a 10min (exemplo) a pesquisa ainda estaria activa senão fazia a query normal para apresentar todos os valores.

Tive a ideia mas não sei se é viável ou a melhor solução, mas não estou a saber implementar a ideia no meu sistema, agradeço toda a ajuda

;)


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.