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

diokhan

search

54 mensagens neste tópico

boas,

sei que ultimamente ando a fazer muitas perguntas..mas pronts..procurei antes no forum e nao encontrei nada deste genero.

eu queria fazer um search no meu site, mas por exemplo, tenho uma input para introduzir o texto, e ao lado tenho uma select box para seleccionar a tabela onde pesquisar e desta escolha temos outra select box onde escolho o campo, referente a tabela escolhida, onde pesquisar, ou entao um search que faz a pesquisa em todas as tabelas ao mesmo tempo e em todos os campos. se alguem souber um script que me possa ajudar agradecia  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

como ja sabes a tabela e o campo so precisas de concatenar uma string ( com a devida segurança usando o mysql_real_escape_string por exemplo ) e fazes uma query do genero $var = 'SELECT '.$campo.' FROM '.$tabela.' WHERE '.$campo.' LIKE \'%'.$textoQueAPessoaPesquisou.'%\''

PS: Caso queiras uma coisa um pouco mais "politicamente correcta" e um pouco mais complicada lê: http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

como ja sabes a tabela e o campo so precisas de concatenar uma string ( com a devida segurança usando o mysql_real_escape_string por exemplo ) e fazes uma query do genero $var = 'SELECT '.$campo.' FROM '.$tabela.' WHERE '.$campo.' LIKE \'%'.$textoQueAPessoaPesquisou.'%\''

PS: Caso queiras uma coisa um pouco mais "politicamente correcta" e um pouco mais complicada lê: http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

e como é que eu apanho as variaveis? que eu faço por uma select box

<SELECT name=project>
        	<option name=project>Project Name</option>
        	<option name=description>Description</option>
        	<option name=idplate>ID Plate</option>
</SELECT>

é pelo name da option certo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, para isso funcionar o HTML tem que estar desta maneira

<select name="lst_project">
         <option value="project">Project Name</option>
         <option value="description">Description</option>
         <option value="idplate">ID Plate</option>
</select>

Agora no ficheiro que ira receber esses dados usas o array $_POST['lst_projecto']

Caso seja seleccionado a opçao "project" o array vai retornar o valor que esta no atributo value.

Percebido?  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

este é o meu codigo actual:

echo'<form method="GET" action="restrito.php?opcao=project">
      <fieldset>
        <label for="consulta">Search:</label>
        <input type="hidden" value="project" name="opcao" />
        <SELECT name=projects id=projects>
        	<option name=nameproject>Project Name</option>
        	<option name=description>Description</option>
        	<option name=idplate>ID Plate</option>
        </SELECT>
        <input type="text" id="consulta" name="consulta" maxlength="255" />
        <input type="submit" value="Search" />
      </fieldset>
    </form>';

no meu caso ficaria assim:

echo'<form method="GET" action="restrito.php?opcao=project">
      <fieldset>
        <label for="consulta">Search:</label>
        <input type="hidden" value="project" name="opcao" />
        <SELECT name=lst_project>
        	<option value=nameproject>Project Name</option>
        	<option value=description>Description</option>
        	<option value=idplate>ID Plate</option>
        </SELECT>
        <input type="text" id="consulta" name="consulta" maxlength="255" />
        <input type="submit" value="Search" />
      </fieldset>
    </form>';

e na query da pesquisa seria algo do tipo:

"SELECT * FROM project WHERE '".$_GET['lst_project']."' LIKE '%".$_GET['consulta']."%' ORDER BY ID_PROJECT ASC";

certo?

e o value das option devem ser iguais aos nomes dos campos nas tabelas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não recomendo usares GET nesse form, por causa dos espaços das palavras, acentos, etc ..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma coisa não invalida a outra amigo. Campos ocultos são passados por POST na mesma.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tao neste caso com o POST o codigo ficaria:

echo'<form method="POST" action="restrito.php?opcao=project">
      <fieldset>
        <label for="consulta">Search:</label>
        <input type="hidden" value="project" name="opcao" />
        <input type="text" id="consulta" name="consulta" maxlength="255" />
         <SELECT name=lst_project>
        	<option value=NAME_PROJECT>Project</option>
        	<option value=DESCRIPTION>Description</option>
        	<option value=ID_PLATE>Plate</option>
        </SELECT>
        <input type="submit" value="Search" />
      </fieldset>
    </form>';

e na query:

SELECT * FROM project WHERE '".$_POST['lst_project']."' LIKE '%".$_POST['consulta']."%' ORDER BY ID_PROJECT ASC

certo? ou tenho de alterar algo?

eu pensava que por causa dos campos hidden precisava mesmo de usar o GET :(

eu mudei do GET para o POST..mas agora sempre que faço uma pesquisa nao acontece nada ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, em princípio é só isso, se nao tiveres mais campos com $_GET ..

$_GET é mais usado para campos que precisem ser passados pelo url

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu ja troquei todos os GET por POST, mas sempre que faço pesquisar nao acontece nada, fica na mesma ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ja vi o meu erro..onde eu tinha:

WHERE '".$_POST['lst_user']."'

eu tinha de ter:

WHERE ".$_POST['lst_user']."

nao funcionava por causa de uma ' :wallbash:

mas ja esta a funcionar..obrigado pela ajuda ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

uma ultima duvida sobre o search..eu faço o search numa boa, mas se eu clicar num dos icones da tabela, apresenta os dados abaixo e a logica seria nao perder a pesquisa, mas perco a pesquisa. eu deixo aqui o meu codigo caso alguem possa ajudar-me

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

echo'<form method="POST" action="restrito.php?opcao=project">
      <fieldset>
        <label for="consulta">Search:</label>
        <input type="text" id="consulta" name="consulta" maxlength="255" />
        <SELECT name=lst_project id=lst_project>
        	<option value=NAME_PROJECT>Project Name</option>
        	<option value=DESCRIPTION>Description</option>
        	<option value=ID_PLATE>ID Plate</option>
        	<option value=DATE>Date</option>
        </SELECT>
        <input type="submit" value="Search" />
      </fieldset>
    </form>';

echo'<table class="tabela" align=center>
    <tr>
        <th align=center>
    		Name Project
        </th>
        <th align=center>
        	Date
        </th>
       	<th align=center>
        	Id Plate
       	</th>
       	<th align=center>
        	View Project
       	</th>';
/* Verifica nivel de acesso do utilizador. 
        			Apenas quem tem acesso de nivel 2 consegue visualizar estas opções. */
if (isset($_SESSION['ACCESS_LEVEL'])){
if ($_SESSION['ACCESS_LEVEL']==2){
       	echo'<th  align=center>
       			Edit Project
       		</th>
       		<th  align=center>
       			Delete Project
       		</th>
       		<th  align=center>
       			View Task
       		</th>
       		</tr>';
       		}
}
       		     
	$conexao = new Conexao();
	$conexao = $conexao->conexao;

	$paginacao = new Paginacao_PDO();
	if (!isset($_POST['consulta'])) {
		$paginacao->sql = "SELECT * FROM project ORDER BY ID_PROJECT ASC";
	}
	else{
		$paginacao->sql = "SELECT * FROM project WHERE ".$_POST['lst_project']." 
									LIKE '%".$_POST['consulta']."%' ORDER BY ID_PROJECT ASC";
	}


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

	while($r = $res->fetch(PDO::FETCH_OBJ)) {
        echo '<tr>
        	<td>';
        		print $r->NAME_PROJECT;
        	echo'</td>
        	<td>';
        		print $r->DATE;
        	echo'</td>
        	<td  align=center>';
        		print $r->ID_PLATE;
        	echo"</td>
        	<td align=center>
       			<a href=restrito.php?opcao=project&po=view&id=$r->ID_PROJECT>
       				<img src=images/add.png border=0 align=center></a>
      		</td>";
        	
	         /* Verifica nivel de acesso do utilizador. 
        			Apenas quem tem acesso de nivel 2 consegue visualizar estas opções. */
        	if (isset($_SESSION['ACCESS_LEVEL'])){
        	if ($_SESSION['ACCESS_LEVEL']==2){
        	echo"
       			<td align=center>
       				<a href=restrito.php?opcao=project&po=edit&id=$r->ID_PROJECT>
       					<img src=images/pencil.png border=0 align=center></a>
      			</td>
       			<td align=center>
       				<a href=restrito.php?opcao=project&po=delete&id=$r->ID_PROJECT>
       					<img src=images/cross.png border=0 align=center></a>
       			</td>
       			<td align=center>
       				<a href=restrito.php?opcao=project&po=task&id=$r->ID_PROJECT>
       					<img src=images/clipboard_text.png border=0 align=center></a>
       			</td>";
        	}
        	}
		echo'</tr>';
	}
        
echo "</table>";
$paginacao->imprimeBarraNavegacao(); 

if ( isset ($_GET['po'])){
	echo"<table align=center>";
		if ($_GET['po']=='edit'){
			include('admin/edit/edit_project.php');
		}elseif($_GET['po']=='delete'){
			include('admin/edit/delete_project.php');
		}elseif($_GET['po']=='task'){
			include('admin/viewtask.php');
		}elseif($_GET['po']=='view'){
			include('admin/viewproject.php');
		}
	echo "</table>";
}
?>

eu pensei em fazer um ciclo while dentro do:

else{
		//o while seria aqui
$paginacao->sql = "SELECT * FROM project WHERE ".$_POST['lst_project']."  LIKE '%".$_POST['consulta']."%' ORDER BY ID_PROJECT ASC";

	}

com a condiçao de fazer o ciclo ate sair da pagina..é possivel?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

por exemplo..eu faço uma pesquisa e nos resultados faço editar um projecto, aparece a ediçao em baixo, mas ao clicar em editar eu perco a pesquisa, mas gostaria que a pesquisa continuasse, que estivesse sempre a funcionar a pesquisa, e pensei em fazer algum ciclo antes da query da pesquisa para obrigar a manter a variavel activa. nao sei se a ideia que tenho é a mais correcta

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

PHP é interpretado e no fim é lançado o resultado para o browser. A partir da altura em que fazem um request, deixas de ter qualquer php sequer, ficas só com o html, css, javascript, etc, como se fosse estático. Se pusesses isso em execução com um cliclo, o que aconteceria é que o php ia ficar eternamente a pensar e não chegavas a receber o resultado estático da pagina por completo, era até o php chegar ao limite de execução ou dar algum erro.

Tens 2 soluções :

1. ir passando o valor da pesquisa (string) através das páginas, através de um input oculto (implica teres sempre um formulario que é executado) ou pelo url (ambas pouco usuais)

2. colocares na variável de sessão, cookie ou base de dados com uso de um dos outros 2 como referência, o valor da pesquisa, e assim em cada página é só procurares esse valor e correr novamente a query.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

podes explicar melhor a segunda ideia por favor?

talvez colocar nas variaveis de sessao seja mais simples e rapido nao? :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, podes por nas variaveis de sessão directamente, se for coisa pouca, mas essas variáveis têm limite de informação.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas vai ser pouca informação, é só mesmo o valor da pesquisa  que preciso de guardar, e como faço para manter a pesquisa activa por assim dizer? guardo o valor da pesquisa na variável de sessão e depois como a chamo para continuar a mesma pesquisa? que o meu problema é que sempre que clico em algum botão na mesma pagina, para editar ou apagar um registo da tabela eu perco a pesquisa, espero ter-me feito perceber :hmm:

PS: eu penso que ja sei o que tenho errado..reparei no link que obtenho

antes de clicar em qualquer opçao, editar apagar ou assim tenho o link:

http://localhost/Project%20Manager/restrito.php?pag=2&opcao=project

depois de escolher uma opçao tenho o link:

http://localhost/Project%20Manager/restrito.php?opcao=project&po=edit&id=79

basicamente, reparei que perco a variavel "pag=2", o que faz com que volte atras na paginaçao, o que eu nao queria, tenho a paginaçao feita numa classe num ficheiro a parte, é possivel buscar esta variavel pag de dentro da classe para o php? que assim eu colocava a variavel, "pag=$variavel", no:

<a href=restrito.php?pag=$variavel&opcao=project&po=view&id=$r->ID_PROJECT>

não sei se a ideia esta bem elaborada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A variável de sessão mantem-se desde que uses session_start() no inicio de cada pagina.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a variável de sessão esta a funcionar correctamente, guardo e ela mantém-se activa.

eu também pensei em fazer algo do género, faço a pesquisa, e ao clicar numa opção ele envia-me para outra página, o ideal era fazer a pesquisa, e ao clicar numa opção para editar um resultado da pesquisa, aparecesse em baixo o menu para editar e a pesquisa continuasse com os mesmos resultados, não voltava a apresentar todos os registos.

sei que isto vai dar uma volta muito grande :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

resolvi por enquanto o problema da forma como disse, sempre que clico em algum botao ele envia-me para outra pagina, agora tenho uma questao, eu tenho um botao para voltar para tras:

echo "<tr>
      <td colspan='10' align='center'>
        <input type='button' value='Back' onclick=javascript:history.back()>
      </td>
    </tr> ";

mas gostaria de saber se ha forma de voltar para tras sem confirmar, porque por exemplo, se faço uma pesquisa e entro numa opçao e faço voltar para tras ele pergunta se desejo reenviar os dados, ha forma de contornar esta situaçao e "obrigar" a voltar atras reenviando os dados sem perguntar?

0

Partilhar esta mensagem


Link 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