Autor Tema: [Problema PHP] al intentar filtrar datos de una tabla SELECT WHERE LIKE con URLs  (Leído 12529 veces)

CarloSher

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Buenas a todos, como dice el asunto, estoy teniendo problemas al intentar filtrar valores de mi database. Me baje un search engine (motor de búsqueda) y estoy intentando agregarle modificaciones pero me cuesta horrores. Paso a comentar, lo que quiero hacer yo es que antes de realizar una búsqueda los usuarios puedan filtrar que buscar. Por ejemplo, si solo quieren buscar videos,  cuando se seleccione la opción del formulario de "vídeos" al darle click al buscar solo busque en mi base de datos las filas de mi columna 'url' que empiezen con "http://youtube.com".

Paso a dejar mi código a ver si alguien me puede ayudar.

Este es el formulario:

Código: [Seleccionar]
    <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>

Y así tengo las funciones:

Código: [Seleccionar]
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(){

$sql = "SELECT 'url' FROM search";

if(isset($_GET["filtroBusqueda"])){

$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);
}


Espero que alguien me pueda ayudar. Lo que estoy pensando es que tendría que hacer lo que hago en la función filtrarBusqueda dentro de la función getResults, pero no se.

Aclaración: Lo que estoy intentando agregar yo al search engine que me baje es la función filtrarBusqueda. La función getResults ya venía y funciona bien. Y el problema que tengo únicamente es que no me devuelve los resultados filtrados, pero si me devuelve todos los resultados que yo busque normal.

Muchas Gracias!
« Última modificación: 14 de Septiembre 2014, 13:10 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:[Problema PHP] al intentar filtrar datos de una tabla
« Respuesta #1 en: 06 de Junio 2014, 17:33 »
No entiendo bien la descripción que has hecho, aunque no lo sé bien porque no conozco el detalle de tu base de datos.

¿Cuando dices <<solo busque en mi base de datos las filas que empiezen con "http://youtube.com".>> te refieres a que cuando se seleccione la opción de filtrado "youtube" en el formulario, sólo se muestren los resultados de la tabla search donde el contenido de la columna url empieza por http://youtube.com?

¿Tienes en tu base de datos una tabla que se llama search? ¿Qué contiene la tabla search? ¿Y esa tabla tiene una columna que se llama url ? Esto me lo pregunto porque el nombre search es un nombre un tanto extraño para una tabla, pareciera que fuera una tabla con un caché de búsquedas, y si es un caché de búsquedas realmente no se corresponde con una búsqueda completa sobre la base de datos.

La primera comprobación que parece lógico realizar sería:

$link = $_GET["link"];
echo 'El valor de link es '.$link;

¿Has comprobado que te recupera el valor elegido en el formulario correctamente? Es decir, que si eliges youtube te llega youtube y si elijes taringa te llega taringa?

¿Has probado a hacer la consulta con phpMyAdmin metiendo manualmente la consulta para ver si te funciona?

Estas cosas son lo primero a confirmar para poder generar la consulta, igual ya lo has hecho pero es lógico preguntarse por esto antes de considerar otras cosas.

Saludos

CarloSher

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re:[Problema PHP] al intentar filtrar datos de una tabla
« Respuesta #2 en: 06 de Junio 2014, 17:51 »
Si sabía que tenía que aclararlo, y me confundí no es fila es columna, claro. Tengo una base de datos llamada "search" (estoy probando en localhost) en la cuál tengo 3 columnas, 'title' , 'url' , 'descripcion'. Las columnas title y descripción no vienen al tema ya que no importan para el filtro que quiero hacer.

Cuando digo "solo busque en mi base de datos las filas que empiezen con "http://youtube.com" " Si, me refiero a eso que pensaste.

Perdón por no expresarme del todo bien. Y no, no hice esas comprobaciones que dices que haga. Las haré pero.. ¿el código de la función filtrarBusqueda esta bien hecho de todas formas?

Muchas Gracias.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:[Problema PHP] al intentar filtrar datos de una tabla
« Respuesta #3 en: 06 de Junio 2014, 18:45 »
Hola,

<<Tengo una base de datos llamada "search" (estoy probando en localhost) en la cuál tengo 3 columnas, 'title' , 'url' , 'descripcion'.>>

Una base de datos se compone de tablas, y las tablas se componen de columnas.

Hay que aclarar cómo se llama la base de datos y cómo se llama la tabla para poder hacer la consulta correcta. En realidad el acceso a la base de datos ya estará establecido, más que nada hay que aclarar qué tablas son las que existen en la base de datos y de qué columnas consta cada tabla. Sin tener claro la tabla, columna, formato de datos, etc. no se podrá aclarar bien la consulta...


CarloSher

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re:[Problema PHP] al intentar filtrar datos de una tabla
« Respuesta #4 en: 06 de Junio 2014, 19:32 »
Los tengo en claro, ahí te dejo bien el esquema.

Localhost (base de datos)
|
|--> search (tabla)
       |
       |---> id (columna de search) // Tipo: int
       |---> title (columna de search) // Tipo: varchar
       |---> url (columna de search) // Tipo: text
       |---> descripcion (columna de search) // Tipo: varchar
       
« Última modificación: 06 de Junio 2014, 19:35 por CarloSher »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:[Problema PHP] al intentar filtrar datos de una tabla
« Respuesta #5 en: 07 de Junio 2014, 09:22 »
ok, ahora veo clara cuál es la tabla y cuáles son los campos de la tabla.

La lógica de la consulta que planteas parece estar bien, pero puede ocurrir tanto que no te esté llegando bien la variable $link como que haya algún problema al ejecutarse el switch.

Además de lo indicado de comprobaciones debes hacer algunas más:

case "youtube": $sql = $sql."WHERE 'url' LIKE 'https://youtube.com%' or 'url' LIKE 'http://youtube.com%'"; break;

echo 'La consulta que se va a ejecutar es: '.$sql;

Para comprobar qué consulta es la que se va a ejecutar. Puede ser que el carácter / te de algún problema por ser carácter de escape, hay que ir haciendo comprobaciones para ver dónde salta el problema  ::)

CarloSher

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re:[Problema PHP] al intentar filtrar datos de una tabla
« Respuesta #6 en: 07 de Junio 2014, 19:31 »
Luego hago esas comprobaciones, tenés razón. Me olvide de ir haciendolas

Pero entonces la función getResults no debería tener que afectar a la función filtrarBusqueda?

Muchas Gracias.


Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:[Problema PHP] al intentar filtrar datos de una tabla
« Respuesta #7 en: 07 de Junio 2014, 19:44 »
Lo que se va a ejecutar cuando se envíe el formulario depende del contenido del archivo search.php que es al que apunta el action del formulario.

La función getResults devuelve algo, con la sentencia return $res;

En cambio la función filtrarBusqueda no devuelve nada, esto puede ser (parece ser) un error, aunque tampoco tiene obligatoriamente que serlo. Habría que estudiarlo para ver en su conjunto qué es lo que se ejecuta y cómo  influye cada función en el resultado.

CarloSher

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re:[Problema PHP] al intentar filtrar datos de una tabla
« Respuesta #8 en: 07 de Junio 2014, 19:51 »
el search.php lo único que hace es mostrar los resultados que se obtienen del functions.php específicamente de la función getResults. El problema debe basarse en estas funciones. Luego iré probando como me dijiste por partes y ver si me devuelve $link, entre todas las cosas

Pero entonces ya me saque la duda que el codeo de la función filtrarBusqueda lo hice bien  por más que por ahora no funcione.

Cuando haga las pruebas te comento como me fue, muchas gracias por la ayuda!
« Última modificación: 07 de Junio 2014, 19:53 por CarloSher »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".