Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

diokhan

search mesma pagina tabelas diferentes

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
yoda

serialize é uma espécie de normalização de um array ou objecto para uma string, de forma a poder ser guardada numa base de dados, etc. Não é nada de mais, nem custa a entender, basta fazeres echo de um array serializado e vês logo do que se trata.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.