PHP - Filtrar datos de una tabla MySQL

   
Vista:

Filtrar datos de una tabla MySQL

Publicado por Carlos (20 intervenciones) el 02/06/2014 23:50:25
Buenas a todos, estoy intentando hacer un filtrado de búsqueda (antes de realizar dicha búsqueda) pero me sucede que no me devuelve resultados filtrados, no me funciona. Tengo un buscador (search engine) en el cuál quiero hacer un filtrado para que solo busque en la tabla, los valores que en la URL (fila de la tabla) empiezen con "http://taringa.net" o con "http://youtube.com", evidentemente algo estoy haciendo mal. Mi código es el siguiente:

index.php


1
2
3
4
5
6
7
8
9
10
11
12
<form class="searchForm" action="search.php" method="GET">
     <input type="text" autocomplete="off" name="q" id="query"/>
     <div>
      <button>
       <svg class='shape-search' viewBox="0 0 100 100" class='shape-search'><use xlink:href='#shape-search'></use></svg>
      </button>
     </div>
	 <input type="radio" name="filtroBusqueda" /><label for="filtro">Filtrar Busqueda</label>
	 <label for="All">All Links</label><input type="checkbox" name="all" />
	 <label for="youtube">youtube</label><input type="checkbox" name="youtube" />
	 <label for="taringa">taringa</label><input type="checkbox" name="taringa" />
    </form>

Manda los datos a search.php el cuál muestra los resultados de la busqueda, pero los datos los obtiene de functions.php, en el cuál agregue la función para filtrar pero no me funciona.

functions.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function filtrarBusqueda(){
 
        //Si no se selecciona ningún valor para filtrar o se selecciona "all" (que seria en el form: All Links)
       // devuelve todos los valores de la tabla.
 
	if(!isset($_POST["filtroBusqueda"]) || strcmp($_POST['filtroBusqueda'], 'all')==0){
 
		$sql = "SELECT * FROM search";
		$resultado = $mysqli->query($sql);
		}
		else{
 
// Si se selecciona algún valor		
 
			$youtube = $_POST['youtube'];
			$taringa = $_POST['taringa'];
			$tipoFiltro = $_POST['filtroBusqueda'];
 
			if(isset($tipoFiltro)){
 
			$sql = "SELECT 'url' FROM search WHERE 'url' LIKE '$tipoFiltro'";
 
			switch($tipoFiltro){
 
				case "youtube":
				$youtube = preg_match("https://youtube.com/");
				break;
 
				case "taringa":
				$taringa = preg_match("https://taringa.net/");
				break;
 
			}
 
			return $tipoFiltro;
 
			$resultado = $mysqli->query($sql);
		}
	}
}

¿Alguno podría ayudarme? Agradecería mucho, yo se que estoy haciendo un desastre por eso no me funciona.. recién estoy empezando en PHP. Muchas gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Filtrar datos de una tabla MySQL

Publicado por xve (5525 intervenciones) el 03/06/2014 10:57:19
Hola Carlos, no entiendo muy bien tu código, pero en la consulta, utilizas el campo $_POST['filtroBusqueda']
1
$sql = "SELECT 'url' FROM search WHERE 'url' LIKE '$tipoFiltro'";

yo haria algo así:
1
2
3
4
if($_POST['youtube']=="on")
    $sql = "SELECT 'url' FROM search WHERE 'url' LIKE 'http://youtube.com%'";
else
    $sql = "SELECT 'url' FROM search WHERE 'url' LIKE 'http://taringa.com%'";

Coméntanos si te sirve, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Filtrar datos de una tabla MySQL

Publicado por Carlos (20 intervenciones) el 03/06/2014 17:10:12
Mm, no me funciona el código. Sigue buscando todos los resultados sin filtrar y devolverme los específicos. De todas formas creo que no me exprese bien, ahora estoy complicado con la facultad pero luego replantearé lo que intento hacer. Muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Vainas

Filtrar datos de una tabla MySQL

Publicado por Vainas (254 intervenciones) el 03/06/2014 18:54:34
Buenas:

Estas haciendo un desastre, cierto. Por ejemplo como es posible que uses cosas como $_POST['youtube'] cuando en el formulario estas definiendo que los datos se pasan por GET?. Como es posible que despues de return realices algun calculo mas? Si no se ejecutara nunca!

la funcion preg_match("https://taringa.net/") hay que pasarle 2 parametos: el patron de busqueda y la cadena de entrada. Aqui tienes la documentacion: http://www.php.net/manual/es/function.preg-match.php

Pienso yo que si lo que quieres hacer es filtar de esa forma deberias cambiar algunas cosas:

1. el filtro de busqueda deberia ser un checkbox y no un radio, Si el usuario lo activa entonces es que quiere filtar su busqueda de lo contrario harias una busqueda normal.

2. Los distintos tipos de busqueda podrian ser radio buttons de esta forma:

<input type="radio" name="link" value="all" checked/>
<input type="radio" name="link" value="youtube"/>
<input type="radio" name="link" value="taringa"/>

Al tener el mismo "name" el usuario solo podria seleccionar solo uno de los 3 en cada busqueda.


En la busqueda solo tendrias primero que preguntar si existe "filtroBusqueda" y dentro preguntar que valor tiene $_GET['link'].


Este es mi ejemplo de como deberia quedar el formulario

1
2
3
4
5
6
7
8
9
10
11
12
<form class="searchForm" action="search.php" method="GET">
    <input type="text" autocomplete="off" name="q" id="query"/>
    <button>Aceptar</button><br/>
    <input type="checkbox" name="filtroBusqueda" />
    <label for="filtro">Filtrar Busqueda</label><br/>
    <label for="All">All Links</label>
    <input type="radio" name="link" value="all" checked/><br/>
    <label for="youtube">youtube</label>
    <input type="radio" name="link" value="youtube"/><br/>
    <label for="taringa">taringa</label>
    <input type="radio" name="link" value="taringa"/>
</form>

y el codigo (tomo prestado codigo de xve):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$sql = "SELECT 'url' FROM search ";
 
if(isset($_GET["filtroBusqueda"]){
$link = $_GET["link"];
	switch($link){
		case "youtube": $sql = $sql."WHERE 'url' LIKE 'http://youtube.com%'"; break;
		case "taringa": $sql = $sql."WHERE 'url' LIKE 'http://taringa.com%'"; break;
		case "all":
	}
}else{
	//Una busqueda completa
}
$resultado = $mysqli->query($sql)
 
?>

El codigo no lo he probado asi que me he podido equivocar en algo. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Filtrar datos de una tabla MySQL

Publicado por xve (5525 intervenciones) el 03/06/2014 19:09:13
Vainas, tienes toda la razón... es en GET...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Filtrar datos de una tabla MySQL

Publicado por Carlos (20 intervenciones) el 04/06/2014 02:30:03
Muchísimas Gracias por tus indicaciones. Que tonto fuí, no ví que el formulario mandaba por GET y estaba haciendolo por POST.

Tengo 2 dudas y perdón la ignorancia pero, en el case "all", no va nada? No tendría que poner un $sql; break; o algo así ?

Otra pregunta, en el else{ // busqueda completa } ¿Puedo repetir la variable usada antes? Digo, hacer algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
}
else
{
 
$sql = "SELECT 'url' FROM search";
 
$resultado = $mysqli->query($sql);
 
$sinFiltro = Array();
 
while($fila = $resultado->fetch_array(MYSQLI_ASSOC)){
 
$sinFiltro[ ] = $fila;
 
}


Y así almacenar en un array los resultados? O es más simple todavía y esto esta mal?

Probando el código de todas formas me tira el siguiente error:

Parse error: syntax error, unexpected '}' in /home/..../functions.php on line 74

Así tengo la función por ahora:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
51 function filtrarBusqueda(){
52
53	$sql = "SELECT 'url' FROM search ";
54
55	if(isset($_GET["filtroBusqueda"])){
56
57		$link = $_GET["link"];
58
59		switch($link){
60
61			case "youtube": $sql = $sql."WHERE 'url' LIKE 'http://youtube.com%'"; break;
62			case "taringa": $sql = $sql."WHERE 'url' LIKE 'http://taringa.net%'"; break;
63			case "all": $sql; break;
64		}
65	}
66	else
67	{
68
69		// busqueda completa
70
71	}
72
73	$resultado = $mysqli->query($sql)
74 }


O sea, me tirra error en el cierre de la función.

Repito, perdón mi ignorancia, disculpen las molestias y muchas gracias por la ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Filtrar datos de una tabla MySQL

Publicado por xve (5525 intervenciones) el 04/06/2014 08:13:30
Hola Carlos, si que puedes volver a utilizar la variable, lo que no esta bien, es pasarla a un array... porque quieres pasar los valores a un array?
fetch_array() ya devuelve un array.


Fijate, que no cierras el while!!!! solo tienes que fijarte en tu código y el error que te da.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Filtrar datos de una tabla MySQL

Publicado por Carlos (20 intervenciones) el 05/06/2014 02:40:54
Aaa claro, ok. Pero de todas formas me sigue tirando el error.

Así tengo la función actualmente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function filtrarBusqueda(){
 
	$sql = "SELECT 'url' FROM search ";
 
	if(isset($_GET["filtroBusqueda"])){
 
		$link = $_GET["link"];
 
		switch($link){
 
			case "youtube": $sql = $sql."WHERE 'url' LIKE 'http://youtube.com%'"; break;
			case "taringa": $sql = $sql."WHERE 'url' LIKE 'http://taringa.net%'"; break;
			case "all":
		}
	}
	else
	{
 
		$sql = "SELECT 'url' FROM search";
 
	}
 
	$resultado = $mysqli->query($sql)
}

Y el error me lo tira en la llave de cierre de la función, no entiendo porque. Cierro todo. Lo que me queda la duda es que va después del case "all": o si queda así. Muchas gracias por la ayuda

PD: Ya probé poniendo case "all": $sql; break;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Filtrar datos de una tabla MySQL

Publicado por Carlos (20 intervenciones) el 05/06/2014 22:32:35
Perdón por el doble post, pero ya logré solucionar el error. Me estaba olvidando en el $resultado cerrar con ;

El tema es que sigue sin devolverme los resultados filtrados, pero bueno. Ya me dieron una gran ayuda y seguiré viendo como hacer, muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Filtrar datos de una tabla MySQL

Publicado por xve (5525 intervenciones) el 06/06/2014 08:19:30
Gracias por compartirlo Carlos...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Filtrar datos de una tabla MySQL

Publicado por Carlos (20 intervenciones) el 12/06/2014 03:22:16
Perdón por revivir el tema, pero me estoy volviendo loco porque no me sale. Espero que alguien me pueda ayudar, voy a dejar el código esta vez de la función que obtiene los valores porque se que se involucra, estuve probando. Comento de nuevo el problema para recordar: Tengo una tabla en una base de datos la cual consta de 3 columnas y una de ellas es 'url'. Bueno, yo quiero hacer que en mi search engine antes de buscar, si el usuario selecciona Filtrar Busqueda, pueda elegir entre "youtube" y "taringa". Si elije taringa, cuando le de al boton de buscar que se devuelvan solo los links que empiezen en la columna 'url' con "http://taringa.net" o con "https://taringa.net" y lo mismo para youtube.

Las funciones son:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
function getResults(){
 $q=$GLOBALS['q'];
 $p=$GLOBALS['p'];
 $start=($p-1)*10;
 if($q!=null){
  $starttime = microtime(true);
  $sql=$GLOBALS['dbh']->prepare("SELECT `title`, `url`, `description` FROM search WHERE `title` LIKE :q OR `url` LIKE :q OR `description` LIKE :q ORDER By id");
  $sql->bindValue(":q", "%$q%");;
  $sql->execute();
  $endtime = microtime(true);
  if($sql->rowCount()==0 || $start>$sql->rowCount()){
   return 0;
  }else{
   $duration = $endtime - $starttime;
   $res=array();
   $res['count']=$sql->rowCount();
   $res['time']=round($duration, 4);
   $limitedResults=$GLOBALS['dbh']->prepare("SELECT `title`, `url`, `description` FROM search WHERE `title` LIKE :q OR `url` LIKE :q OR `description` LIKE :q ORDER BY id LIMIT :start,:limit");
   $limitedResults->bindValue(":q", "%$q%");
   $limitedResults->bindValue(":start", $start, PDO::PARAM_INT);
   $limitedResults->bindValue(":limit", 10, PDO::PARAM_INT);
   $limitedResults->execute();
   while($r=$limitedResults->fetch()){
    $res["results"][]=array($r['title'], $r['url'], $r['description']);
   }
   return $res;
  }
 }
}
 
function filtrarBusqueda(){
   if(isset($_GET["filtroBusqueda"])){
 
	$sql = "SELECT 'url' FROM search";
 
		$link = $_GET["link"];
 
		switch($link){
 
			case "youtube": $sql = $sql."WHERE 'url' LIKE 'https://youtube.com%' or 'url' LIKE 'http://youtube.com%'"; break;
			case "taringa": $sql = $sql."WHERE 'url' LIKE 'https://taringa.net%' or 'url' LIKE 'http://taringa.net%'"; break;
 
		}
	}
	else
	{
 
		$sql = "SELECT 'url' FROM search";
 
	}
	$resultado = $mysqli->query($sql);
}

Yo se que esta mal, no se porque supongo que no tendría que hacer 2 funciones por separado, si no todo en la misma función (en la de getResults) pero no se como.

Y el formulario lo tengo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<form class="searchForm" action="search.php" method="GET">
     <input type="text" autocomplete="off" name="q" id="query"/>
     <div>
      <button>
       <svg class='shape-search' viewBox="0 0 100 100" class='shape-search'><use xlink:href='#shape-search'></use></svg>
      </button>
     </div>
	<input type="checkbox" name="filtroBusqueda" />
	<label for="filtro">Filtrar Busqueda</label><br/>
	<label for="youtube">youtube</label>
	<input type="radio" name="link" value="youtube"/><br/>
	<label for="taringa">taringa</label>
	<input type="radio" name="link" value="taringa"/>
	</form>

El formulario se envía a search.php, si. Pero search.php solo se encarga de mostrar los resultados que se obtienen de la función getResults. Por eso es que creo que debería hacer todo en la misma función.

Espero respuesta y realmente agradezco su ayuda, nuevamente disculpen que vuelva al tema pero no pude solucionarlo.

Si alguien quiere o necesita verlo en vivo para ayudarme, tengo un host. Lo puedo subir sin problema, muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar