Como hacer un Buscador con Ajax
En este post ahora trataré de explicar como crear un buscador utlizando AJAX:
Mucho de esto, fue código que implementé hace mucho tiempo, y aunque existen mejores o mas sencillas formas de hacerlo utilizando algun framework, trataré de explicar la forma en que trabajé cuando me inicié en esto de AJAX
Antes de continuar, aquí pueden ver el resultado final o descargar el ejemplo completo:
Antes de iniciar, describiré brevemente los archivos con los cuales consiste el buscador:
- /buscador.php Este archivo es la estructura de todo el buscador.
- /busqueda.php Este archivo es lo mismo que buscador.php con la diferencia de que le quitamos todo, menos lo que está entre el div resultados: <HTML>...<div id="resultados">...</div></BODY></HTML>. Esto con la finalidad de llamar este archivo para obtener las búsquedas y mostrarlas con AJAX sin recargar todo el sitio nuevamente.
- /buscador.js Aquí están incluídos las funciones básicas para el funcionamiento del buscador.
- /buscador.css Le da una bonita apariencia el buscador.
- /include/funciones.php Aquí sólo guardamos: sql_quote para el filtrado de las consultas que se necesiten ejecutar.
- /include/pagination.class.php Aquí descripción
- /config.php Aquí la configuración básica para el funcionamiento del buscador. Host, usuario, password, base de datos.
Ahora, trataré de describir a detalle la finalidad de cada archivo:
buscador.php
Primero que nada incluimos los archivos necesarios para su funcionamiento. Más adelante pondré la explicación más a detalle de cada uno.
- <?
- require('config.php');
- require('include/conexion.php');
- require('include/funciones.php');
- require('include/pagination.class.php');
Determino cuantos elementos se mostrarán por página y en que página estoy inicialmente (o por defecto). Estos dos datos son para ir limitando la consulta SQL que traerá los resultados de la búsqueda y en este otro artículo del Blog explico bien como paginar las consultas SQL, ya que internamente también estaré utilizando la clase para paginación de resultados.
- $items = 10;
- $page = 1;
- if(isset($_GET['page']) and is_numeric($_GET['page']) and $page = $_GET['page'])
- $limit = " LIMIT ".(($page-1)*$items).",$items";
- else
- $limit = " LIMIT $items";
En esta parte verifico si existe la variable q. La variable q estará presente en caso de que se haya introducido una búsqueda.
- if(isset($_GET['q']) and !eregi('^ *$',$_GET['q'])){
- //Realizamos la búsqueda de q en los registros
- }else{
- //Mostramos los registros disponibles ya que no hay nada por buscar
- }
Aquí lo que falta en el código del párrafo anterior: En caso de que si esté definida la variable q (para eso utilizo la función isset()), me aseguro que no esté formada por sólo espacios para asegurarme de que en realidad estoy buscando algo (para eso utilizo eregi() apoyándome de la expresión ^ *$ que significa algo así: "que inicie y termine con un espacio en blanco que se repita desde 0 a infinito veces")
- if(isset($_GET['q']) and !eregi('^ *$',$_GET['q'])){
- $q = sql_quote($_GET['q']); //para ejecutar consulta
- $busqueda = htmlentities($q); //para mostrar en pantalla
- $sqlStr = "SELECT * FROM preguntas WHERE pregunta LIKE '%$q%'";
- $sqlStrAux = "SELECT count(*) as total FROM preguntas WHERE pregunta LIKE '%$q%'";
- }else{
- $sqlStr = "SELECT * FROM preguntas";
- $sqlStrAux = "SELECT count(*) as total FROM preguntas";
- }
La función sql_quote sirve para filtrar la cadena y evitar inyecciones de código SQL. Está almacenada en el archivo includes/funcions.php que también explicaré mas adelante.
En este paso (creo yo que sería el más complicado ya que estamos trabajando con consultas SQL) estoy haciendo 2 cosas:
- Creando una consulta que devuelva todos los registros que necesitamos (SELECT * FROM preguntas WHERE pregunta LIKE '%$q%').
- y creando ésta otra que únicamente devuelva la cantidad de registros ("SELECT count(*) as total FROM preguntas WHERE pregunta LIKE '%$q%').
No se que tan complicado pueda ser esta paso para todos, especialmente para ti Stan :) ,... pero cualquier duda por favor en los comentarios y las vamos resolviendo entre todos los que gusten participar.
Voy a suponer que la mayoría sabe como funciona esto de las consultas SQL y continuaré.
Ahora, en el paso que sigue, ejecutamos ambas consultas y seguido de eso estructuramos el HTML que formará el buscador:
- $aux = Mysql_Fetch_Assoc(mysql_query($sqlStrAux,$link));
- $query = mysql_query($sqlStr.$limit, $link);
- ?>
En el paso anterior, a la segunda consulta le concatené la variable que habíamos preparado para limitar la cantidad de registros ($limit) que traeríamos según la página en la que estuviéramos ($sqlStr.$limit).
En este paso, comenzamos a estructurar el HTML: Incluimos la hoja de estilo CSS del paginador, el estilo CSS para mostrar las tablas con los resultados, y el archivo include/buscador.js (otro de los importantes en el funcionamiento del buscador)
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <link rel="stylesheet" href="pagination.css" media="screen">
- <link rel="stylesheet" href="style.css" media="screen">
- </head>
- <body>
Creamos la caja de búsqueda:
- <form action="index.php" onsubmit="return buscar()">
- <label>Buscar</label> <input type="text" id="q" name="q" value="<? if(isset($q)) echo $busqueda; ?>" onKeyUp="return buscar()">
- <input type="submit" value="Buscar" id="boton">
- <span id="loading"></span>
- </form>
Este es el formulario para realizar la búsqueda, en el encontraremos tres puntos a destacar:
- onsubmit="return buscar()": Al enviar el formulario o dar clic en buscar, se ejecutará la función buscar().
- onKeyUp="return buscar()": El momento en que ejecutará la función buscar() será al quitar el dedo de la tecla (onKeyUp).
- <span id="loading"></span>: Ahí aparecerá la animación
cuando el contenido esté siendo cargado.
La función buscar() está almacenada en include/buscador.js
Por último ya mostrar los resultados de las consultas SQL ejecutadas.
Está parte está formada básicamente y a grandes rasgos por:
Dentro <div id="resultados"> ... </div> aparecerán los resultados, y al momento de dar clic en buscar o ejecutar la funcion buscar() que está contenida dentro de include/buscador.js y es accionada por el formulario anterior, este div se actualizará con los nuevos resultados.
Tomando en cuenta que lo que está dentro del div anterior, es únicamente los resultados de búsqueda, y que estos se estarán mandando llamar cada que uno ejecute la búsqueda: Esto lo separé en el archivo busqueda.php (Este lo mandamos llamar cada que buscar() se ejecuta, y actualizamos el contenido del div con los que nos devuelva el archivo busqueda.php):
- echo" <div id=resultados>
- <p>";
- if($aux['total'] and isset($q)){
- echo "{$aux['total']} Resultado".($aux['total']>1?'s':'')." que coinciden con tu búsqueda \"<strong>$busqueda</strong>\".";
- }elseif($aux['total'] and !isset($q)){
- echo "Total de registros: {$aux['total']}";
- }elseif(!$aux['total'] and isset($q)){
- echo"No hay registros que coincidan con tu búsqueda \"<strong>$busqueda</strong>\"";
- }
- echo"</p>";
- if($aux['total']>0){
- $p = new pagination;
- $p->Items($aux['total']);
- $p->limit($items);
- if(isset($q))
- $p->target("index.php?q=".urlencode($q));
- else
- $p->target("index.php");
- $p->currentPage($page);
- $p->show();
- echo '<ul>';
- while($row = mysql_fetch_assoc($query))
- echo "<li>".htmlentities($row['pregunta'])."</li>";
- echo '</ul>';
- $p->show();
- }
- echo"
- </div>
- </body>
- </html>";
Dentro de este último bloque de código validamos que haya resultados para despues de eso paginarlos con ayuda de la clase de paginación (y el artículo sobre como paginar) y por último un ciclo en el que vamos mostrando los resultados.
Un punto que posiblemente pueda causar duda en el código anterior: cuanto intento cambiar a donde apunta la paginación de manera que los enlaces apunten a algo así (En caso de haber una busqueda):
- buscador.php?q=busqueda&page1
- buscador.php?q=busqueda&page2
- etc
A la busqueda le aplico la función urlencode, para que la búsqueda en caso de tener símbolos especiales me permita introducirlos como una URL. Aunque, recomiendo mejor leer las especificaciones que nos dan en la documentación de php: http://php.net/urlencode
- $p->target("index.php?q=".urlencode($q));
- else
- $p->target("index.php");
Cualquiera de todos los puntos anteriores puedo profundisarlo, sólo cuestion de dejarlo en los comentarios. (Uff, brb! voy por el 2do café.)
busqueda.php
Este archivo está formado básicamente por lo que está dentro de <div id="resultados"> ... </div> en buscador.php. Únicamente nos sirve para traer resultados mediante AJAX.
- require('config.php');
- require('include/conexion.php');
- require('include/funciones.php');
- require('include/pagination.class.php');
- $items = 10;
- $page = 1;
- if(isset($_GET['page']) and is_numeric($_GET['page']) and $page = $_GET['page'])
- $limit = " LIMIT ".(($page-1)*$items).",$items";
- else
- $limit = " LIMIT $items";
- if(isset($_GET['q']) and !eregi('^ *$',$_GET['q'])){
- $q = sql_quote($_GET['q']); //para ejecutar consulta
- $busqueda = htmlentities($q); //para mostrar en pantalla
- $sqlStr = "SELECT * FROM preguntas WHERE pregunta LIKE '%$q%'";
- $sqlStrAux = "SELECT count(*) as total FROM preguntas WHERE pregunta LIKE '%$q%'";
- }else{
- $sqlStr = "SELECT * FROM preguntas";
- $sqlStrAux = "SELECT count(*) as total FROM preguntas";
- }
- $aux = Mysql_Fetch_Assoc(mysql_query($sqlStrAux,$link));
- $query = mysql_query($sqlStr.$limit, $link);
- echo "<p>";
- if($aux['total'] and isset($busqueda)){
- echo "{$aux['total']} Resultado".($aux['total']>1?'s':'')." que coinciden con tu búsqueda \"<strong>$busqueda</strong>\".";
- }elseif($aux['total'] and !isset($q)){
- echo "Total de registros: {$aux['total']}";
- }elseif(!$aux['total'] and isset($q)){
- echo"No hay registros que coincidan con tu búsqueda \"<strong>$busqueda</strong>\"";
- }
- echo "</p>";
- if($aux['total']>0){
- $p = new pagination;
- $p->Items($aux['total']);
- $p->limit($items);
- if(isset($q))
- $p->target("index.php?q=".urlencode($q));
- else
- $p->target("index.php");
- $p->currentPage($page);
- $p->show();
- echo "\t<table class=\"registros\">\n";
- echo "<tr class=\"titulos\"><td>Titulo</td></tr>\n";
- $r=0;
- while($row = mysql_fetch_assoc($query)){
- echo "\t\t<tr class=\"row$r\"><td><a href=\"http://www.mis-algoritmos.com/?p={$row['id']}\" target=\"_blank\">".htmlentities($row['pregunta'])."</a></td></tr>\n";
- if($r%2==0)++$r;else--$r;
- }
- echo "\t</table>\n";
- $p->show();
- }
include/buscador.js
En este archivo están almacenadas las dos funciones más importantes para permitirle la funcionalidad con AJAX al buscador:
- xmlhttp() que crea una instancia del objeto con el que trabajaré las funciones de AJAX. (Esta función la conseguí en este artículo de anieto2k que escribió hace ya algo de tiempo)
- Y buscar() que ejecuta la búsqueda y devuelve al resultado a buscador.php para mostrarlo y dar el efecto que buscamos.
Aquí la función xmlhttp() que únicamente crea el objeto para trabajar con AJAX
- function xmlhttp(){
- var xmlhttp;
- try{xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");}
- catch(e){
- try{xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");}
- catch(e){
- try{xmlhttp = new XMLHttpRequest();}
- catch(e){
- xmlhttp = false;
- }
- }
- }
- if (!xmlhttp)
- return null;
- else
- return xmlhttp;
- }
Y aquí la función buscar(). Esta es importante, así que me voy describiendo casi línea por línea.
- function buscar(){
- var query = document.getElementById('q').value;
- var A = document.getElementById('resultados');
- var B = document.getElementById('loading');
- var ajax = xmlhttp();
- ajax.onreadystatechange=function(){
- if(ajax.readyState==1){
- B.innerHTML = "<img src='images/loading.gif' alg='Loading...'>";
- }
- if(ajax.readyState==4){
- A.innerHTML = ajax.responseText;
- B.innerHTML = "";
- }
- }
- ajax.open("GET","busqueda.php?q="+encodeURIComponent(query),true);
- ajax.send(null);
- return false;
- }
Creamos tres variables: A, B y ajax (El nombre no importa).
En la variable A y B estoy utilizando document.getElementById('elemento'), que nos permite acceder a las propiedades de cualquier elemento HTML que esté representado de alguna forma en el navegador. En la página de Mozilla está detallado con palabras más entendibles: http://developer.mozilla.org/en/docs/DOM:document.getElementById.
- var query = document.getElementById('q').value;
- var A = document.getElementById('resultados');
- var B = document.getElementById('loading');
- var ajax = xmlhttp();
A = document.getElementById('resultados'); nos permitirá manipular el DIV resultados
(<div id="resultados"> en donde sustituiremos los resultados que nos devuelva busqueda.php), y
con B = document.getElementById('loading'); controlaremos el contenido de <span id="loading"></span>,
en donde pondremos la imagen
cuando el objeto AJAX esté trabajando.
ajax.onreadystatechange=function(){ ... } permite estar a la escucha de cuando sucede un cambio en el objeto AJAX (Estos cambios está explicados aquí). Por el momento, sólo utilizaré dos de ellos:
- 1 (Cargando)
- Y 4 (Terminado)
Creo que esta información es suficiente para comprender que if(ajax.readyState==1){...}, debo mostrar la imagen cargando, y que si if(ajax.readyState==4){...}, entonces debo mostrar el resultado de las búsquedas.
Para poder hacer esto utilizaremos innerHTML, que nos permite obtener o cambiar el contenido de un elemento HTML. En la página de Mozilla está detallado con palabras más entendibles: http://developer.mozilla.org/en/docs/DOM:element.innerHTML.
Por lo que, con B.innerHTML = "<img src='images/loading.gif' alg='Loading...'>"; puedo alterar el contenido del <span id="loading"> y cambiarlo
por la imagen
, y de igual forma al momento
de terminar la obtención de los resultados borro lo que hay dentro de B(<span id="loading">) y en A (<div id="resultados">)
cargo los resultados: A.innerHTML = ajax.responseText;
- ajax.onreadystatechange=function(){
- if(ajax.readyState==1){
- B.innerHTML = "<img src='images/loading.gif' alg='Loading...'>";
- }
- if(ajax.readyState==4){
- A.innerHTML = ajax.responseText;
- B.innerHTML = "";
- }
- }
Espero que este tutorial, les hay servidor de algo y valga la pena la desveladota que me aventé... mañana mi examen de Ecuaciones Diferenciales y no estudié nada por estar escribiendo esto =S
Y bueno, ya para terminar: cualquier comentario o sugerencia que permita reforzar o documentar un poco mas este tutorial, es bien recibido :D ...
Igual y si notan muchas inconsistencias en mi explicación o horrores ortográficos pues me echan un grito en los comentarios /puf que yo ya me voy a dormir! u_U
Buscador en PHP con un poco de AJAX V 0.1 Beta
2007-10-17 03:13:12
[...] actualizada tan pronto tenga el tutorial y la CSStilación de Stan en mis manos Mejor escribí otro post, para que aparescan los cambios en el [...]
Stan
2007-10-17 10:55:01
Eres un Crack!
pecesama
2007-10-17 12:25:20
El titulo en ingles quedaria mejor como <strong>How to Create an Ajax Live Search</strong> o algo similar :P
Victor De la Rocha
2007-10-17 15:49:09
@Stan: :D
@pecesama: Si, me gusta mas y ya lo cambié en el url gracias, gracias jeje
JL
2007-10-17 18:03:00
Te equivocaste, no son 1 y 2 los eventos sino 1 y 4 (el error es nadamas en la redacción, el código si está bien)
Victor De la Rocha
2007-10-18 07:09:50
Gracias JL, ya hice el cambio :)
@<strong>Stanmx</strong>: No te hagas... Que estamos anciosos esperando la CSSstilización del buscador :D
Algunos estilos CSS para las cajas de búsqueda
2007-10-21 03:05:44
[...] Mis Algoritmos Hi :) 123456 « Como hacer un Buscador con Ajax [...]
CHICOGREENDAY
2007-11-01 17:46:01
mil algoritmos como harias un buscador youporn con ajax aver si hace un tuto y calro la descarga ah por cierto este buscador no le vanta tengo problemas con el config.php aver si me explicas si chaufas
Revilo
2007-11-03 10:21:05
En la parte de la paginacion me direcciona a index.php pero este archivo no lo tengo, me podrias ayudar diciendome que lleva este archivo?
Victor De la Rocha
2007-11-03 16:03:54
@CHICOGREENDAY: :S
@Revilo: Fue un error mio, hay que cambiar index.php por buscador.php en donde está la línea que configura la paginación: Deberá ser algo así $p->target('buscador.php') (En los archivos busqueda.php y buscador.php casi al final de ámbos archivos). Si esto no soluciona el problema lo veo mas tarde por que estoy fuera de la ciudad y lejos de mi computadora personal.
ChicaRubia
2007-11-06 03:03:18
Jeje, lamento hacer pregunta de rubia, pero la parte del direccionamiento... no me anda!!! (son como las 5 de la madrugada, mola mogollon tu script, quise probarlo, pero... no anda! :S ) Intente lo de tu ultimo post, pero no se, creo q la fatiga me esta ganando!!! :P
Victor De la Rocha
2007-11-06 18:39:57
ChicaRubia disculpa que no pueda atender esto en estos momentos, pero el fin de semana reviso con calma que está mal explicado o cual es el error.
:P Comprensión, comprensión... que estoy atareadamente lleno de trabajo :S
Intergus
2007-11-29 15:11:21
Hola Victor
Me está gustando tu codigo, quiero utilizarlo pero me encuentro con algunas dudas. Estoy haciendo funcionar solo buscador.php y parace que todo va Ok, parece que no necesita a busqueda.php. Solo me da un error pero no creo que se deba a haber anulado busqueda.php
Cuando tecleo una letra que no está en lo buscado me devuelve en el DIV resultado el tipico OBJETO NO ENCONTRADO, sin embargo no hay problemas mientras vas tecleando letras que si que estan, es decir que si que arrojan resultados.
La otra duda es ¿para que el boton del submit, si no es necesario pulsarlo? ¿sería posible usarlo para enviar la consulta a otra pagina?
Esta ultima pregunta es porque sería muy util buscar en una base de datos y cuando ya tengas el resultado que buscas (por ejemplo se te haya quedado en 5 o 6 registros que coinciden con tu busqueda, le mandas a otro php la query que arroja esos 5 resultados para que haga algo con ellos, como por ejemplo pintarlos en un google map (que es mi intención), si te interesa hablamos del tema....
Saludos
Victor De la Rocha
2007-11-29 15:36:59
Hola Intergus
buscador.php es la base de esta aplicación. El muestra resultados si le envías la variable ?q= en la barra de direcciones, pero si en vez de enviar la variable, escribes en la caja de texto, esta manda llamar a busqueda.php con la variable ?q= algo así busqueda.php?q=<query>. Así, busqueda.php trae los resultados tal cual lo haría buscador.php, pero sin volver a mostrar la caja de búsqueda y el botón enviar. <strong>Son indispensables, ámbos archivos</strong>.
<blockquote>Cuando tecleo una letra que no está en lo buscado me devuelve en el DIV resultado el tipico OBJETO NO ENCONTRADO, sin embargo no hay problemas mientras vas tecleando letras que si que estan, es decir que si que arrojan resultados.</blockquote>
No entendí muy bien eso...
El botón "submit" podría ocultarse con CSS, y aunque no sirva de mucho si tenémos javascript activado, este debería funcionar cuando "javascript no está activado" :)
Puedes comentar lo que gustes. Cuéntame más acerca de lo que quieres hacer con google map. Podría ocurrírseme algo.</query>
Intergus
2007-11-29 16:48:27
Pues no entiendo entonces muy bien como va.... lo estudiaré un poco más.
Lo que quiero hacer es permitir que busquen todos aquellos registros que cumplan la condicion de tener en un determinado campo, la palabra que el usuario busca, cuando al usuario ya le parece buena la busqueda, enviar esa busqueda a otro php que hará esa consulta y meterá los resultados (que serán los mismos que arrojó el buscador), los meterá como marcadores en el google map. Esa parte ya la tengo funcionando, es decir puedo hacer una consulta "select * from tabla where campo like $q" y lo que arroja, lo estoy metiendo en el mapa, ya que los registros disponen de coordenadas entre otras cosas.
Pero no se como hacer para lanzar la consulta. Por eso te comentaba si se podia usar el boton del form para lanzar esa consulta a un index con la query oculta para que no aparezca en el navegador.....
No se, ¿cómo lo ves?
Intergus
2007-11-29 17:13:10
La paginación da error. Al principio sale bien pero al no mostrar los resultados de la base de datos pero si los cuenta, saca paginación (2 páginas) pero no se ven resultados pues aun no se ha tecleado nada en la caja del buscador. Pues en ese momento si se pasa de pagina, salta error de OBJETO NO ENCONTRADO
Intergus
2007-11-29 17:16:40
vale.... solucionado cambiando en busqueda.php y buscador.php, aquello de ....
$p->target("index.php............
por
$p->target("buscador.php..........
son 2 lineas en cada fichero.
Intergus
2007-12-01 14:40:06
Hola Victor
En un intento de mejora, he modificado este trozo de codigo en ambos php (buscador y busqueda)
[php]if(isset($_GET['q']) and !eregi('^ *$',$_GET['q'])){
$q = sql_quote($_GET['q']); //para ejecutar consulta
$busqueda = htmlentities($q); //para mostrar en pantalla
if ($q''){
//CUENTA EL NUMERO DE PALABRAS
$trozos=explode(" ",$q);
$numero=count($trozos);
if ($numero==1) {
//SI SOLO HAY UNA PALABRA DE BUSQUEDA SE ESTABLECE UNA INSTRUCION CON LIKE
$sqlStr = "SELECT * FROM empresas WHERE pal_busca LIKE '%$q%'";
$sqlStrAux = "SELECT count(*) as total FROM empresas WHERE pal_busca LIKE '%$q%'";
} elseif ($numero>1) {
//SI HAY UNA FRASE SE UTILIZA EL ALGORTIMO DE BUSQUEDA AVANZADO DE MATCH AGAINST
//busqueda de frases con mas de una palabra y un algoritmo especializado
$sqlStr = "SELECT *, MATCH ( descripcion, pal_busca ) AGAINST ( '$q' ) AS Score FROM empresas WHERE MATCH ( descripcion, pal_busca ) AGAINST ( '$q' ) ORDER BY Score DESC";
$sqlStrAux = "SELECT count(*) as total FROM empresas WHERE MATCH ( descripcion, pal_busca ) AGAINST ( '$q' )";
}
}
}else{
$sqlStr = "SELECT * FROM empresas WHERE pal_busca LIKE ''";
$sqlStrAux = "SELECT count(*) as total FROM empresas WHERE pal_busca LIKE ''";
}[/php]
Con ello pretendo hacer una busqueda más completa para cuando pongan mas de una palabra en la caja de busqueda, pues si en el campo hay por ejemplo "pan pasteles tartas" y en la caja de busqueda pones pan tartas ya no encontraría nada y con este otro tipo de busqueda si que lo haria, pero me da un error, relativo al mysql_assoc y es por el valor de $sqlStrAux que no le debe de llegar....
¿se te ocurre algo?
Gracias
Victor De la Rocha
2007-12-01 15:10:22
Si <strong>Intergus</strong>, esa sería una mejora en la consulta que realiza la búsqueda. No está de mas mencionar que este paso requiere crear un índice de texto completo en la tabla con la que trabajaremos referenciando a los campos con los que se realizará la búsqueda (Esta es para <a href="http://www.stanmx.com" rel="nofollow">@<strong>Stan</strong></a> que está aprendiendo de estas cosas y trabajando con la CSStilización del buscador :P )
Este paso podemos verlo en la documentación de MySQL con mucho detalle: "<a href="http://dev.mysql.com/doc/refman/5.0/es/fulltext-search.html" rel="nofollow">12.7. Funciones de búsqueda de texto completo (Full-Text)</a>".
Bueno, continuando con el problema:
<del>Creo que en las últimas dos consultas SQL te equivocaste. Yo no pondría la búsqueda con espacios en blanco:
...}else{
$sqlStr = "SELECT * FROM empresas WHERE pal_busca LIKE ''";
$sqlStrAux = "SELECT count(*) as total FROM empresas WHERE pal_busca LIKE ''";
}
Yo lo haría así:
...}else{
$sqlStr = "SELECT * FROM empresas";
$sqlStrAux = "SELECT count(*) as total FROM empresas";
}
También veo otro errorsito, o algo que no entiendo por que lo haz hecho así:
</del><del> if ($q''){
//CUENTA EL NUMERO DE PALABRAS</del>
uff, espera, vi varios errores o cosas extrañas, así que mejor pongo como lo haría yo:
[php]if(isset($_GET['q']) and !eregi('^ *$',$_GET['q'])){
$q = sql_quote($_GET['q']); //para ejecutar consulta
$busqueda = htmlentities($q); //para mostrar en pantalla
if(strpos(trim($q),' ')){
/*
* Si encuentra un espacio, entonces tenemos 2 o mas palabras, por lo que podemos utilizar MATCH(campos) AGAINST(búsqueda).
* Siempre y cuando exista un índice de texto completo (FULLTEXT) en la tabla relacionado a los campos que se pretende realizar la búsqueda.
*/
$sqlStr = "SELECT *, MATCH ( descripcion, pal_busca ) AGAINST ( '$q' ) AS Score FROM empresas WHERE MATCH ( descripcion, pal_busca ) AGAINST ( '$q' ) ORDER BY Score DESC";
$sqlStrAux = "SELECT count(*) as total FROM empresas WHERE MATCH ( descripcion, pal_busca ) AGAINST ( '$q' )";
}else{
/*
* Si no encuentra ningun espacio, entonces tenemos nada mas una palabra, por lo que utilizamos LIKE en la consulta SQL.
*/
$sqlStr = "SELECT * FROM empresas WHERE pal_busca LIKE '%$q%'";
$sqlStrAux = "SELECT count(*) as total FROM empresas WHERE pal_busca LIKE '%$q%'";
}
}else{
$sqlStr = "SELECT * FROM empresas";
$sqlStrAux = "SELECT count(*) as total FROM empresas";
}[/php]
uff, por último, no entiendo por que te muestra un error en cuanto al mysql_assoc. Tal vez tenga que ver con la tabla que usas, algún campo mal escrito o el índice de texto completo. Revísale bien ;)
Intergus
2007-12-01 15:15:28
Bueno, ahora no da error, faltaba poner como fulltext en la base de datos los 2 campos descripcion y pal_busca, pero ahora mientras tecleas la primera palabra va de lujo pero al teclear el espacio en blanco para continuar, ya no encuentra nada y aunque sigas tecleando ya no encuentra nada pero no da errores, simplemente dice que no coincide ningun registro.
...... sigo probando.....
Intergus
2007-12-03 11:39:21
Nada, no funciona bien y tiene que ser por poca cosa. No me gustaria tirar la toalla pues me ha gustado el codigo pero sin el match again funcionando, vale de poco ....
Victor, ¿no te animas?.... supongo que estarás hasta arriba pero a lo mejor es cosa de poco.
Intergus
2007-12-03 15:03:20
Por cierto, no encuentra nada con ñ, en cuanto la tecleas... se acabó.
Abraham
2007-12-26 13:57:25
Una duda... es posible en vez de hacer que pase las búsquedas (al dar clic en las diferentes páginas) por la URL que las pase por $_POST y así no cambié la URL???
:$
link
2008-01-10 11:40:32
gracias me fue de mucha ayuda, lo adapte a mis necesidades, pero super facil de usar, no me demore nada
muchas gracias la verdad
Victor De la Rocha
2008-01-11 01:47:21
@<b>Intergus</b>, debes de tener cuidado con el juego de caracteres. Tal vez si tomas en cuenta utf8_encode y utf8_decode puedas lograr lo que no funciona, de otra manera no podría ayudarte.
@<b>Abraham</b>, creo que es posible, tendrás que hacer alguna función que haga exáctamente lo mismo que hago al dar clic en el botón submit.
@<b>link</b>, me alegra mucho saberlo ¡Suerte con eso! ;)
¡Feliz año a todos! Ya estoy de vuelta por aquí ... uff, casi desde noviembre desaparecido. :D
Jackfort
2008-02-14 00:25:23
Cual es la base de datos?
Victor De la Rocha
2008-02-14 01:57:18
La que pienses usar.
estibaliz2006
2008-02-19 02:52:02
y si quiero poner más de un criterio de búsqueda, es decir, hacer un buscador avanzado, donde poder seleccionar los campos por los que buscar y si hay dos campos a buscar me los busque?
Victor De la Rocha
2008-02-19 10:15:40
Sólo agrega los inputs que necesites y algún momento (apoyandote de los eventos) realizas la búsqueda.
Para cualquier otro caso, sólo es cuestion de agregar los <input> que necesites y tener en cuenta que cada uno tiene eventos especiales con los cuales podrías tu determinar "en este momento realiza la búsqueda".
Para buscas en dos campos, pues modificas la consulta en base a lo que envíes mediante los _POST.
Creo que es momento de dejar en claro: Para coomprender este documento, es necesario tener cierto dominio (al menos conocimiento básico) del funcionamiento de los formularios, y entender perfectamente que es el envío de datos por _GET, _POST u otro método. http://www.w3schools.com/html/html_forms.asp
Marcelo
2008-02-25 13:45:20
AYUDA!!!!!!!
A mi no me funciona porque no tengo los campos nesesarios ;(!!!!!!!!!!!1
Dijiste todo menos la tabla y campo de mysql!!!!
Decime dejando un comentario en mi web...http://mrb.laweb.es o por msn, marcelo11_Cho@hotmail.com
Porfa!!!!
Alex Ludvin
2008-03-04 00:56:06
Un saludo cordial a todos y gracias a ti Victor.
quisiera que pulbicases tambien el script d ela BD.
David
2008-03-05 07:30:35
El script va perfectamente, pero hay un problema bastante grande, que la paginación no es ajax. Es decir, la busqueda la hace sin hacer la renovación de la página, pero la paginación necesita refrescarla.
Hay alguna forma para que la paginación también sea utilizando ajax?
Alex Ludvin
2008-03-08 00:18:06
Como hago paraque al aparecer los links despues de la busqueda, al darle click, por ejemplo me lleve a otra pagina que tengo alojado en mi localhost
Alex Ludvin
2008-03-08 00:22:26
Quizas no me explique bien:
Yo en mi buscador tecleo "algorit" y me muestra el contenido que teno en una tabla de mi BD, ahora quisiera saber como al darle click en un link que yo elijo me lleva a otra pagina donde muestro el contenido completo de lo que yo seleccione.
jaime
2008-03-08 14:05:44
y si por ejemplo quiero hacer uina busqueda, en la cual yo le envien el nombre del campo donde va a buscar?? los nombres de los campos se pueden manaejar con un combo
gabriel_666
2008-04-18 08:27:37
siii, el gran problema de ajax es la letra ñ y Ñ y los acentos, yo tambien hice un buscador pero cuando metia palabras con ñ o Ñ no las encontraba, osea, las encotraba si tecleaba todo en minusculas pero si lo hacia con mayusculas no lo encontraba y es debido a q la ñ y Ñ se codifican de distinto modos y usando la funcion utf8_encode no lo solucionaba, tampoco pasando todo a mayuscula o minuscula con strtoupper y strtolower
todavia sigo buscando como corregir eso si alguien tiene alguna sugerencia
Andres
2008-05-19 05:22:51
Hola! Muchas gracias, una gran ayuda.
Como comentario podria decir que si se pone una llamada a la funcion "buscar" al final de la página buscador.php nos ahorrariamos duplicar el codigo.
Siempre insertamos lo que nos de busqueda.php.
Miquel
2008-09-04 19:07:25
Victor, eres un crack.
Muchas gracias!!! Funciona todo fenomenal. Me he ahorrado algunas horas.
Quizás cambiaria el LIKE de la SELECT, y hacer la consulta con MATCH.
Miquel
2008-09-04 19:45:10
Ah ok, ya veo que usan MATCH en los comentarios, saludos
alejandro
2008-09-28 01:59:20
Hola , perdon por mi ignorancia, pero he subido todos los archivos, y resulta que no se donde esta el archivo SQL , me podriais orientar por favor !
mariano
2009-05-19 10:23:09
hola alguien me puede decir porque no me conecta configuro todos los parametros (host,user,pass,database) correctamente y me sale " Ocurrió un error al intentar conectar. Verifica que están correctamente los datos dentro de config.php.", que puede pasar..
Gracias
Victor De la Rocha
2009-05-19 15:38:10
Quiere decir que tienes mal alguno de los datos en el config.php, quizá no existe la base de datos o estas escribiendo mal el nombre. En algunos hostings se le pone el prefijo de tu usuario a el nombre de tus bases de datos (<em>algo así: mariano_buscador</em>).
mariano
2009-05-19 17:36:14
los datos estan bien, lo estoy probando en modo local, pero no se porque no levanta, alguna sugerencia.
Gracias por responder
mariano
2009-05-20 11:43:52
hola victor te cuento que ya solucione el tema de la conexion le saque los corchetes y quedo ahora me tira este error y no se porque se procude
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\buscadorajax\busqueda.php on line 26
podiras orientarme.
Gracias
Victor De la Rocha
2009-05-20 14:11:24
Antes de la línea en que haces esto:
<code lang="php"><?
$aux = Mysql_Fetch_Assoc(mysql_query($sqlStrAux,$link));
$query = mysql_query($sqlStr.$limit, $link);
?></code>
Agregale esta línea:
<code lang="php">echo $sqlStrAux;</code>
Y muestrame el resultado por favor.
mariano
2009-05-20 14:29:27
hola victor ahora me sale este error
Parse error: parse error, expecting `','' or `';'' in C:\xampp\htdocs\buscadorajax\busqueda.php on line 26
25 echo $sqlStrAux
26 $aux = Mysql_Fetch_Assoc(mysql_query($sqlStrAux,$link));
27 $query = mysql_query($sqlStr.$limit, $link);
gracias te puese los numeros de las lineas del codigo para que veas cual es la linea 26
Victor De la Rocha
2009-05-20 14:43:24
Te escribiré un correo en privado.
Mariano
2009-06-11 07:46:23
Hola Victor. Puedes decirme que agregar exactamente para que no me salgan estos errores:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/mercadol/public_html/librehost.com/buscador.php on line 30
Ya no se como seguir y me parece un excelente buscador para agregar a mi web.
Mariano
2009-06-11 08:06:30
Amigo y tocayo Mariano. Aqui solucione ese error que yo tambien tenia. Eso es provocado por un faltante en la configuracion interna.
Aqui te dejo el ZIP (REPARADO) y completo del amigo Victor de la Rocha.
http://rapidshare.com/files/243332101/AjaxReparado_REPARADO.zip.html
Respondenos como te funciono amigo. Saludos muy atentamente
Mariano
2009-06-11 08:48:51
Hola. Buen dia Victor de la Rocha.
Yo ya tengo funcionando mi buscador,. Pero tengo una consulta. Exactamente que es lo que tengo que cambiar para que encuentre las palabras a buscar.
Me refiero a que ya agregue mi caja buscadora en el index HTML de mi sitio pero al momento que quiero buscar algo me dice siempre esto:
No hay registros que coincidan con tu búsqueda "PALABRABUSCADA"
Y mi pregunta exactamente es,. Como hago para que quede igual al buscador DEMO.
Saludos y muchas gracias por la respuesta
Victor De la Rocha
2009-06-11 14:16:02
Si tu buscador se despliega correctamente, es porque tienes correctamente: /buscador.php
Tienes que hacer que /busqueda.php se vea igual a /buscador.php pero sin la caja de búsqueda, etiqueta <html>, <body>, etc. Sólo los resultados.
Lo mas importante antes de hacer funciona la búsqueda en modo "live search" o en modo "real", "en vivo" es ASEGURARSE que funciona su consulta SQL en el archivo /busqueda.php y /buscador.php.
Para probar la consultas, utilicen el phpMyAdmin o en alguna otra aplicación de su gusto.
Para comprobar que los archivos /busqueda.php y /buscador.php funcionan. Envíenle el parámetro ?q= con una búsqueda de prueba. http://localhost/buscador/busqueda.php?q=buscame+esto
Gyselle
2009-06-19 21:01:17
Hola victor, me fue de gran ayuda tu codigo, con el cambio del foco del action funciona correctamente, gracias...
mariano
2009-06-29 12:06:12
Hola ante todo agracer al tocayo Mariano por pasarme el buscador reparado, ahora bien, sigo con problemas ahora no me encuentra nada en la busqueda , ponga lo que ponga me pone que no se encontraron datos.
Alguna idea?
Gracias
Victor De la Rocha
2009-06-29 15:32:06
Si no muetra datos es por que tienes mal la consulta SQL.
mariano
2009-07-01 12:51:22
hola molesto nuevamente, como seria la consulta mi base de datos se llama catalogos y la tabla sala9, como seria porque no le encuentro la vuelta.
Por el momento esta asi
$sqlStr = "SELECT * FROM catalogos WHERE sala9 LIKE '%$q%'"; $sqlStrAux = "SELECT count(*) as total FROM catalogos WHERE sala9 LIKE '%$q%'";
}else{
$sqlStr = "SELECT * FROM catalogos";
$sqlStrAux = "SELECT count(*) as total FROM sala9";
}
Victor De la Rocha
2009-07-09 11:25:56
Debería ser así:
$sqlStr = "SELECT * FROM catalogos WHERE (sala9 LIKE '%$q%' OR sala9 LIKE '$q%' OR sala9 LIKE '%$q')";
$sqlStrAux = "SELECT count(*) as total FROM catalogos WHERE (sala9 LIKE '%$q%' OR sala9 LIKE '$q%' OR sala9 LIKE '%$q')";
}else{
$sqlStr = "SELECT * FROM catalogos";
$sqlStrAux = "SELECT count(*) as total FROM catalogos";
}
marc
2009-07-11 13:26:40
Buenas Víctor, la verdad es que el tutorial me parece de 10.
Tengo un par de dudas de principiante:
* Cuando cargas la pagina busqueda.php internamente como trabaja el navegador, es decir , como sabe que tiene que sustituir de buscador.php. La pregunta puede parecer un poco estúpida pero me encuentro que en mi caso se me duplica el contenido.
Tengo una lista inicial, con todos los registros y cuando filtro, la lista inicial permanece y ademas aparece la lista filtrada.
* La segunda dude es referente al estilo. Si quiero que la lista filtrada tenga un estilo determinado, debo incluir la hoja de estilo en el archivo busqueda.php o en el archivo buscador.php
Gracias por todo compañero
alejandro
2009-07-17 14:20:17
hola a todos se que este post es medio viejito y me a servido mucho pero ahora estoy en la orca quiero saber cual es el archivo que hay que editar buscador.php o busqueda.php tambien
aqui
$sqlStr = "SELECT * FROM preguntas WHERE pregunta LIKE '%$q%'";
$sqlStrAux = "SELECT count(*) as total FROM preguntas WHERE pregunta LIKE '%$q%'";
}else{
$sqlStr = "SELECT * FROM preguntas";
$sqlStrAux = "SELECT count(*) as total FROM preguntas";
en donde pongo la tabla y en donde pongo la bd
no entiendo esa parte
preguntas:?
pregunta:?
que va en cada cual........... ayuda es urgente miren
http://www.centrodescargas.com/buscador/buscador.php
en mi buscador salen Total de registros: 24 pero no hay resultado
ayuda!!!!!!!!!!
mostuni
2009-07-20 10:50:32
me sigue sin funcionar, ¿me podrias pasar algun ejemplo con alguna base sql?, asi la cargo en mi server y me fijo que es lo que esta pasando porque no le encuentro la vuelta a esto
Gracias y perdon por todas las molestias
Victor De la Rocha
2009-07-20 13:26:20
Los resultados se cargan dentro del <div id="resultados">. El archivo javascript incluido lo localiza y carga el contenido después de haberse realizado la petición por ajax.
La hoja de estilo deberías incluirla en el archivo buscador.php, ya que busqueda.php sólo devuelve resultados, y el buscador en si completo es buscador.php.
Victor De la Rocha
2009-07-20 13:35:35
Alejandro, yo veo que funciona correctamente tu buscador. Sólo te hace falta desplegar los datos correctamente:
Cambia los nombres de los campos en buscador.php y busqueda.php en la parte donde muestra los resultados (htmlentities($row['pregunta']), cambialo por el nombre de la columna en tu base de datos que represente el título de lo que se está buscando).
ppx
2009-07-26 05:14:33
Tenia el mismo problema y la solucion, cambiar el nombre de buscador.php a index.php.
ah y para motsuni prueba con esta bd.
CREATE TABLE `preguntas` (
`id` int(11) NOT NULL auto_increment,
`pregunta` varchar(40) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
INSERT INTO `preguntas` VALUES (1, 'google');
INSERT INTO `preguntas` VALUES (2, 'hattrick');
INSERT INTO `preguntas` VALUES (2, 'terra');
ppx
2009-07-26 05:15:35
es que victor lo estaba trabajando en index
:)
alejandro
2009-07-27 09:24:32
hola que tal ya logre que funcionara muchas gracias pero ahora el problema es que cuando le doy click a cualquier busqueda me manda a tu web como arreglo eso dime...!!
alejandro
2009-07-27 15:53:59
gracias Victor De la Rocha pero ahora el problema no lo comprendo, lo que pasa es que lo busca pero cuando le doy click me trae a tu web http://www.centrodescargas.com/buscador/buscador.php
le doy a cualquiera pero me lleva a donde no es
fernando
2009-08-29 16:20:50
Excelente compae. Que elegante el codigo cuando lo adapte.
El mio no da una Url+ imagen + descripcion y todo lo que saque de la db.
fernando
2009-08-29 16:27:04
Perdon si da una Url+ imagen + descripcion y todo lo que saque de la db.
elegante. Te la echaste con esta.
fernando sarasty
2009-09-22 12:45:22
hola, como estas.
tengo un inconveniente que aun no lo logro solucionar, al momento de hacer la búsqueda si me sale el total de registros, pero los registros como tal no me aparacen en pantalla, que podria ser??
muchas gracias
fernando
Cristian
2009-09-28 11:56:18
me resulto de lo mas bien.. estuve acomodando mis bases de datos y los resultados , a mi forma,, y que excelente.. muchas gracias...
aunque el buscador sea de año 2007 es genial..
Pablo
2009-10-02 15:07:33
Aparece un error y no encuentro la solucion:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /public_html/buscar/index.php on line 30
el archivo subido en Rapidshare tambien tiene error al parecer solo deja descarcarlo pocas veces
haber si puedes enviarme por favor el codigo completo
Esta interesante el buscador
espero me lo puedas enviar
Saludos
Alvaro
2009-10-19 10:50:12
Hola te cuento q estoy adaptando tu codigo para poder usarlo con oracle, estoy un poco trnacado en la parte d ela paginacion pero cuando este listo lo comparto. Y muchas gracias
Gerardo
2009-11-26 13:33:57
Esta muy bueno el código me sirvió mucho gracias ......
Pero tengo una pregunta porque al momento de buscar algo se pierde la paginación y al inicio si la pone ....
Al iniciar muestra la paginación si le doy siguiente pagina y me quiero regresar al inicio ya no me aparece nada osea se pierden los primeros resultados =(
Gerardo
2009-11-26 13:59:49
Buen día, esta muy bueno tu código me sirvió de mucho...
Pero tengo una pregunta al momento de iniciar me pone bien la paginación pero le doy siguiente y todo bien peor le doy atrás o inicio y ya no me pone nada .........
Otra porque al momento de buscar tampoco me respeta la paginación osea pone todos los registros =(
saludos........
Gerardo
2009-11-27 13:07:05
Que bien esta tu código me ayudo mucho =)....
pero tengo una pregunta como puedo hacer para agregar mas columnas a la tabla
saludos
Cris. Telematica
2009-11-29 22:55:23
buena pagina.
tengo tarea sobre esto. ya lei y creo que va a ser de gran ayuda! ..grac grac
christian
2009-12-05 15:08:57
hola amigo podemos estar en contacto tengo algunas dudas si puedes me agregas me llamo christian de peru
Nerhix
2009-12-09 15:54:51
Buen Dia, Interesante publicación y sinceramente muy agradecido con el aporte , mi pregunta es la siguiente:
-Ya logre conectar a la BD y configurarlo pero el problema es como vinculo a la web sin que me muestre en la url la variable ?p=id( de la tabla) y me direccione a la pagina que requiero, como Ud, lo hizo en el ejemplo:
http://mis-algoritmos.com/buscador/
Y reiterandole mi respetos y admiracion por el trabajo que Ud. realiza.
Estare agradecido si pudiera responderme
Atte. Henry C.C
gerenciar@hotmail.com
Toby
2009-12-15 12:46:22
Me pasa algo raro, me funciona todo a la perfección pero cuando cargo buscador.php me funciona todo perfectamente pero no me sale el listado inicial con todos los resultados, no es hasta cuando introduzco algo en el buscador cuando empieza a mostrarme resultados, ¿imagináis porque es? Gracias.
Zeros
2009-12-30 12:13:58
Buen dia ...
Funciona a la perfección solo tengo un problema no se como mandar mas criterios de búsqueda lo he intentado y nada modifique el js y nada el buscador.php y busqueda.php pero nada no se si me podrías ayudar .....
saludos
Eduardo
2010-03-23 14:06:44
Hola. tengo la misma pregunta de Zeros. Como hago para poder buscar con mas criterios. por ejemplo. tengo una base de datos con: nombre, descripcion y ciudad. me gustaria es poder por ejemplo que alguien busque el nombre pero que pueda filtrar por ciudad. que busque JOSE en la ciudad de BOGOTA. En un formulario php normal lo logro hacer, pero con ajax no me ha dado el resultado. Alguien sabe como ajustar este excelete scritp a un formulario avanzado ?. Gracias :D
Manuel Avalos
2010-04-05 18:51:08
Excelente tutorial... y super útil... gracias papá!
Yenny
2010-04-16 11:43:24
hola,, sabes estubo funcionando ok,, hasta q modifique el diseño d la pagina y funciona perfectamente en Mozilla Firefox pero en el bendito explorer se revelo y no hace nada ,,por favor que sugerencias me podria dar...Sabes es una gran aporte de ajax,felicitaciones
Andr35
2010-07-01 14:20:36
tengo una inquietud, tengo BD basada en oracle, no me acepta parametros como limit, e estado tratando de investigar creo que es con ROWNUN, mas sin embargo no e podido configurar la funcion para que haga la busqueda! si podrian ayudarme! gracias de antemano!
andy
2010-07-19 16:48:28
Que tal amigos !!
Muy buen buscador me agrado y me gusto solo que tengo un pekeño problemilla, y necesito ayuda urgente, si alguien de ustedes puede ayudarme se los agradecere bastante.
Warning: pg_query() [function.pg-query]: Query failed: ERROR: LIMIT #,# syntax is not supported HINT: Use separate LIMIT and OFFSET clauses. in C:Program Files (x86)Apache Software FoundationApache2.2htdocsInventarioArticulosbuscador.php on line 27
Warning: pg_fetch_assoc() expects parameter 1 to be resource, boolean given in C:Program Files (x86)Apache Software FoundationApache2.2htdocsInventarioArticulosbuscador.php on line 108
para esto ustoy utilizando postgresql 8.3
andy
2010-07-19 16:56:30
me falto especificar cual es el problema xD ...
En la primera pagina si aparecen resultados y todo parece bien, pero cuando le doy click en siguiente es donde aparecen esos mensajes.
gracias por cualkier recomenacion
valeria
2010-08-08 02:07:31
mis respetos, casi 3 años después y tu código sigue ayudando.. tiene un par de deprecados ya xD pero todo genial! .. mil gracias! ;)
Victor De la Rocha
2010-08-11 18:39:19
Valeria, Muchas Gracias por tu comentario ;)
Diego
2010-08-25 13:15:24
Hola, muy buena la publicación, excelente herramienta para la consulta.
Tengo un inconveniente, al buscar las primeras 3 palabras las obvia y genera este error Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:AppServwwwconsulta_ajaxbuscadorbusqueda.php on line 26
y despues de la tercera letra busca sin problema, quede un poco confundido ya que e realizado muchas pruebas con el codigo y el error persiste.
Diego
2010-08-25 13:29:27
Ya solucione el problema, era el tipo de campo en la base de datos que cree, pero la pregunta seria si este modelo aplicaria tambien para el uso con SQL server.. de nuevo gracias por este valioso aporte
pattan
2010-08-31 00:26:56
excelente buscador, excelente herramienta, mis felicitaciones.
Solo una duda, deseo mostrar los registros por orden descente, segun la fecha de ingreso.
Al generar la consulta muestra los datos por orden descendente solo en la primera hoja , al consultar la pagina 2 los muestra en orden ascendente, como puedo cambiar el orden de la consulta.
por favor ayuda.
Edwin
2010-09-08 18:07:47
Muy buen tutorial Gracias
Edwin
2010-09-08 18:12:54
Hola Me gustaría saber que al seleccionar un registro de los listados en el buscador me lleve a el y me deje actualizarlo.
Juan
2010-09-27 15:07:44
alguna solucion para el problema de la ñ Ñ ???
saludos
Eduardo
2010-10-05 23:14:49
muy bueno brother felicidades me sirvio un bue gracias
Victor De la Rocha
2010-10-19 19:12:43
Juan el problema para la ñ o Ñ o cualquier símbolo especial se soluciona utilizando utf8.
Eduardo
2010-11-30 16:20:16
Disculpa, ya implemente el código junto con las modificaciones, no obstante, cuando tecleo alguna letra, por ejemplo: c, me envía lo siguiente:
array(1) {["nom"]=> string(4) "call"}
1 resultado que coinciden con tu búsqueda "c".
y no aparece nada en la tabla, podrias decirme porque sale este mensaje, porfavor.
De antemano muchas gracias.
THEIFTHENELSE
2010-12-13 09:37:02
Hola Victor genial tu blog.
Bueno Victor dejame ver como te explico para que me puedas entender y asi recibir tu variosa ayuda mas rapido.
1- tengo en DB tres tablas: Negocios, Municipios y Anuncios.
CREATE TABLE negocios (
negoid int(10) unsigned NOT NULL AUTO_INCREMENT,
nom_negocio char(100) NOT NULL,
PRIMARY KEY (negoid)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE municipios (
munid int(10) unsigned NOT NULL AUTO_INCREMENT,
provincia_padre int(10) unsigned NOT NULL,
munombre char(40) NOT NULL,
PRIMARY KEY (munid),
KEY provid (provincia_padre)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE anuncios (
idanuncio int(5) unsigned NOT NULL AUTO_INCREMENT,
cliente_nombre int(11) unsigned NOT NULL,
negocio_nombre int(3) unsigned NOT NULL,
municipio_nombre int(3) unsigned NOT NULL,
nombre varchar(45) NOT NULL,
direccion varchar(100) NOT NULL,
telefonoNegocio varchar(13) NOT NULL,
SitioWeb varchar(20) NOT NULL,
foto varchar(60) NOT NULL,
descripcion varchar(500) NOT NULL,
PRIMARY KEY (idanuncio),
KEY negoid (negocio_nombre),
KEY munid (municipio_nombre),
KEY idcli (cliente_nombre)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Como puedes observar yo relaciono las tablas de negocio y municipio con la de anuncio es donde unicamente se relacionan sus ids por esta tercera tabla.
Pues quiero lograr eso mismo lo que hace tu buscador, solo que con dos campos:
Por ejemplo:
1-Negocios: un texbox (donde pongo el nombre del negocio que quiero)
2-Municipio: un Drop Down (Seleccionar el municipio que quiero) Nota(ultizaria un menu de salto, de tal forma al seleccionarlo me lance la pagina de resultados) osea la lista de todos los anuncios que pertenecen a este municipio.
Mi primera duda: tengo bien la relacion con mis tablas?
Mi segunda duda: es posible lograr eso? por favor toda la ayuda que puedas suministrarme te lo agradezco en el alma.... seria bueno que creara un tutorial asi mismo, pero con varios campos incluyendo desplegables...
De antemano muchisisimas gracias por tu inmensa ayuda... se que es un sacrificio inmenso y lo haces por vocacion... Gracias.
Ahhhhh mi pagina web no la he subido aun... es la que estoy desarrollando actualmente....
Angel
2011-03-05 21:07:34
Estoy interesado en hacer algo asi para un proyecto que estoy realizando, pero se podria hacer lo mismo pero en ves de ser con un input que sea con varios select?
Kpary
2011-04-05 01:19:27
muy buen articulo!
Que pena que no hayas incluido en este articulo ni en el archivo para descargar las Base De Datos con sus respectivas tablas y algunos registros de prueba.
Estaria bueno que lo integraras.
Muchas gracias
Saludos!
Ozk
2011-04-06 07:07:11
Victor,
Hola! La verdad q el codigo este esta muy practico, es muy maleable para hacer las consultas que se necesitan (sea like, match o lo q sea, teoria de sql pura... muy bueno! :D ) La verdad q te felicito, aun hoy dia SIGUE VIGENTE! La verdad q hago funcionar al pelo... salvo el tema de caracteres multilinguales! (ñ, á, ß, etc.)
La conexion la fuerzo con un utf8 En el archivo conexion.php, meto un @mysql_query("SET NAMES 'UTF-8'"); (tb se puede poner un cotejamiento de un charset tal o cual, y funciona indistintamente, asi q aca no hay dramas) Y si bien la busqueda del caracter multilingual funciona (o sea, el utf8 llego"vivo" al mysql) en la barra de busqueda (dominio.algo/?q=Stra%DFe), no funciona via el cuadro de busqueda de index.php / busqueda.php... intente jugar un poco con utf8_encode & utf8_decode... pero creo q lo hice en los lugares y de la forma equivocada...
O sea, antes de preguntar, me documente pa preguntar: ¿como hago para que haga la busqueda en ajax de carateres en utf8?
Ozk
2011-04-06 08:52:57
Bueno gente, mas o menos lo resolvi, asi que como este codigo lo uso mogollon, lo menos que puedo hacer es compartir la solucion! :D Reemplazando en la busqueda (en busqueda.php) '%$q%' con '%".utf8_decode($q)."%' hara la busqueda necesaria... pero no queda enteramente, ya que imprime la busqueda con caracteres chungos... eso se soluciona cambiando:
$busqueda = htmlentities($q); //para mostrar en pantalla
por esta otra
$busqueda = utf8_encode($q); //para mostrar en pantalla
Si a alguien se le ocurre algo mas elegante para resolver esto, por favor, que lo comparta! (xq otra manera de hacerlo, no se me ocurrio... y despues de todo, funciona!)
PD: Por ultimo, recomiendo cambiar el archivo de conexion, forzando a conectarse en utf8, y a elegir el cotejamiento que os sea mas util (sea hungaro, eslovaco, sueco... elegid, q pa eso estan! :D )
leidy
2011-04-14 15:06:41
hola tu buscador esta super victor, me gustaria adptarlo a mi pagina pero me da este error, lei en las respuestas de los amigos de arriba y alguna configuraion me podrias ayudar por fa, tambien hay un link con la solucion pero no funciona.. gracias por tu ayuda.. saludos =)..
este es el error:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:Program FilesEasyPHP 3.0wwwNueva carpeta (2)buscador.php on line 29
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:Program FilesEasyPHP 3.0wwwNueva carpeta (2)busqueda.php on line 26
Jose Eduardo
2011-04-24 11:35:18
Muy buen ejemplo 100% funcional y muy util gracias por el aporte :D
carlos caicedo
2011-05-18 00:58:11
Genial, que existan personas como vos, lsto y dispuestos a compartir lo que saben. Dios te bendiga! (perdon si ofendo tus credos). Mira estoy realizando una aplicacion, que tiene su header, su footer y su parte central o body, en el body tengo dos divs: un div funge de barra lateral izquierda y el div derecho se destino a contener datos; pero en este último div, que lo he llamado como vos al tuyo ("resultados") tengo un div pequeño que contiene la caja de busqueda y en la parte de abajo hay otro div destinado a contener los datos de una busqueda, la idea es que ahi se ponga una consulta que puede arrojar varias filas y quiero que queden metidas como en una tabla.
Podés decirme si tu codigo lo hace, o tengo que hacer algunos ajustes (clao los de la tabla) Te seré un seguidor de ti siempre agradecido. Mil gracias!
MarkGus
2011-05-21 12:29:33
a nadie mas le marco error en el
$p->target("buscador.php?q=".urlencode($q));
cuando le paso alguna variable a la q no me funciona
y probé con el archivo busqueda.php así
$p->target("busqueda.php?q=".urlencode($q));
y asi si me funciona, y pues ya copie y pegue el codigo de busqueda.php a el de buscador.php y sigue marcando error
en resumen cuando yo le paso algo a q, en buscador.php me marca error
$p->target("buscador.php?q=".urlencode($q));
alguien que haya tenido el mismo problema? que me pueda ayudar
MarkGus
2011-05-21 12:57:14
ya pude usarlo muchas gracias Victor esta muy bueno el buscador
Yony Montan
2011-06-11 11:45:29
Alguel puede pasarme el proyecto completo, el que esta publicado tiene errores gracias .....
PPK17
2011-06-12 12:24:18
Muchas gracias por esto, al principio no me cuadraba, pero con mucho esfuerzo lo modifique a mi gusto, ya que soy realmente un principiante en programacion.
Pude modificar los registros agregando un campo de tipo radio que me manda a otra pagina, donde modifico todo lo que quiero, nuevamente felicidades!!!
Ness
2011-06-13 18:31:23
Oigan amigos... no funciona la paginación.. ya intenté resolverlo y cuando presiono la página 2 me manda vacío...
1) Ya revisé lo del target y no es eso.
2) Modifiqué la consulta metiéndole un OR porque en mi caso yo busco que coincidan TITULO y DESCRIPCION son los nombres de los 2 campos que quiero encontrar coincidencias.
Ya para los que tienen muchos campos que coincidir, pueden usar MATCH como bien dicen.
Pero la solución de la paginación no lo he resuelto... aparte veo que tienes duplicado el código en buscador.php y búsqueda.php .. se podría hacer una función como bien dicen.
Lo que yo intentaré hacer es METERLE MI PROPIA PAGINACIÓN. (Ya que tengo un algoritmo para paginar).
En cuanto haya probado con mi algoritmo de paginación les aviso.
jose
2011-06-15 12:11:39
Necesito akax php y postgres, sobre busqueda de una sola columna
Alf
jose
2011-06-15 12:13:15
Busqueda de un solo campo por decir nombre de colegio en un combo box pero eso si con Php, postgres y Ajax. Gracias
Zerocool
2011-06-20 18:57:54
Se puede implementar la clase de paginacion con jquery o me pueden me podria ayudar
crowman
2011-06-21 13:37:21
Esta genial el buscador, muchas felicidades
juan carlos
2011-07-14 12:27:52
gracias muy buen aporte a todos millones de puntos esta al 100%
juan zuñiga
2011-08-08 22:25:08
exelente compadre lo necesitaba un 10 este si que es un buen post :) mil gracias (Y)
Sofyan
2011-08-24 18:20:11
if(isset($_GET['q']) and !stripos('^ *$',$_GET['q'])){
$q = sql_quote($_GET['q']); //para ejecutar consulta
$busqueda = htmlentities($q); //para mostrar en pantalla
hAY UN ERROR EN ESTE CODIGO HAY QUE QUITAR LA FUNCION
eregi() Y SUSTITUIRLA POR stripos()
lucas
2011-08-28 01:31:16
hola me salio este error
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/a9733878/public_html/busqueda.php on line 26
la liena 26 seria :
me podrías decir como lo soluciono gracias
Uriel Ceron
2011-09-10 12:57:42
Mexico, Quintana Roo.
Hola a todos!!!
links
http://php.apsique.com/ajax/utf8
http://xaviesteve.com/354/acentos-y-enes-aparecen-mal-a%C2%B1-en-php-con-mysql-utf-8-iso-8859-1/
--------------------------
Solucion de la ñ
en el archivo busqueda.php
cambia
$q = sql_quote($_GET['q']);
por
$q = sql_quote(utf8_decode($_GET['q']));
Saludos!!!!
A mi me funciono, espero comentarios....
Pablo
2011-09-21 08:39:09
Hola estoy intentando modificar la busqueda para que busque en varios campos de la misma tabla y he hecho esto:
$sqlStrAux = "SELECT count(*) as total FROM Mi_Tabla WHERE campo1 LIKE '%$q%' OR campo2 LIKE '%$q%'";
el tema es que al introducir alguna busqueda me dice que hay resultados pero no me los muestra tambien he modificado la tabla de resultados para que tenga dos columnas y funciona perfectamente:
echo "tt<tr class="row$r"><td width=400px><a href="../ver.php?id={$row['id']}" target="_parent">".htmlentities($row['campo1'])."</a></td><td>".htmlentities($row['campo2'])."</td></tr>n";
Podrias echarme una mano.
Gracias
ariel
2011-09-30 13:20:55
hola, antes que nada el aporte es muy bueno, pero hay cosas que no logro modificar, por ejemplo
como dijo pablo en un comentario, si le agrego condiciones a la consulta, por mas que las encuentre no me las muestra, luego en el bucle while, no logro modificarlo a gusto, y tampoco encuentro donde esta el blucle que muestra los resultados para poder formatearlo.
por lo que vi, no hay respuestas a las consultas, pero por las dudas posteo igual, por si alguien lo lee
saludos
ariel
2011-09-30 14:21:57
por ahi alguien comento que pudo modificar el codigo a gusto, sobre todo la parte del formateo de los resultados, estaria bueno que digan como, ya que no logro hacerlo, y por ejemplo linkear los resultados a mi pagina
saludos
ariel
2011-09-30 22:50:30
hola amigos, necesito ayuda, si alguien puede decirme cual es la pagina que debo modificar para poder formatear los resultados de las busquedas, ya que no encuentro como hacerlo!
saludos y gracias
ariel
2011-10-01 14:51:03
ya pude resolver todos los pequeños problemitas que tenia!! y formatear los resultados a mi gusto
muchas gracias por el aporte victor! saludos cordiales
Victor De la Rocha
2011-10-01 21:11:17
Exito ariel!
Xtian
2011-11-03 21:56:14
Hola victor, estoy queriendo utilizar tu buscador para un trabajo practico de la facultad, pero quieron implementar me tope que no tengo la BD de tu ejemplo, podrias pasarmelo porfavor, te estare eternamente agradecido jeje..
saludos
christian arce