Foros del Web » Programando para Internet » PHP »

Buscador PHP JQUERY

Estas en el tema de Buscador PHP JQUERY en el foro de PHP en Foros del Web. Hola, como están? tengo un proyecto que consiste en un buscador, autocompletable, que busca en una base de datos, por cualquier parámetro que aya en ...
  #1 (permalink)  
Antiguo 20/07/2015, 12:25
 
Fecha de Ingreso: junio-2015
Mensajes: 12
Antigüedad: 8 años, 10 meses
Puntos: 0
Buscador PHP JQUERY

Hola, como están? tengo un proyecto que consiste en un buscador, autocompletable, que busca en una base de datos, por cualquier parámetro que aya en esa linea, osea busca por cualquier campo.

Luego de la búsqueda se listan los resultados, si algunos de los resultados me interesa tendría que poder hacer clic arriba y que me los cargue en la misma web sin necesidad de recargar.

Esta ultima parte no me esta funcionando, y nose porque!!!

Me podrían dar una mano? MILLONES DE GRACIAS.

DEJO El codigo de los archivos.

____________________________________________


busqueda.html

Código PHP:
<!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=iso-8859-1" />
<
title>Busqueda</title>
<
script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
 
 
 
 $(document).ready(function(){
    $(".buscar").keyup(function(){
      var cajabusqueda = $(this).val();
      var dataString = 'buscarpalabra='+ cajabusqueda;
      if(cajabusqueda==''){
      }else{
        $.ajax({
        type: "POST",
        url: "buscar.php",
        data: dataString,
        cache: false,
        success: function(html){
          $("#display").html(html).show();
        }
        });
      }return false;    
    });
   
   
   
    $(document).on("click","#display_box",function(){
      var id = $(this).val();
      var dataString = 'id='+ codigo;
      $.ajax({
        type: "POST",
        url: "loadData.php", // acá iría el php nuevo
        data: dataString,
        cache: false,
        success: function(html){
            $("#display").html(html).show(); //Y acá un id nuevo que vaya en el medio de la pantalla principal
          }
      });
    });
  });
  jQuery(function($){
    $("#cajabusqueda").Watermark("Buscar");
  });
  
   
   
</script>
<style type="text/css">
body
{
font-family:"Lucida Sans";
}
*
{
margin:0px
}
#cajabusqueda
{
width:250px;
padding:3px;
margin-left:250px;
}
#display
{
width:254px;
display:none;
float:right; margin-right:1px;
border-left:solid 1px #dedede;
border-right:solid 1px #dedede;
border-bottom:solid 1px #dedede;
overflow:hidden;
}
#display_box
{
padding:7px; border-top:solid 1px #dedede; font-size:12px; height:30px; background:#ECECEC;
}
.display_box:hover
{
background:#3b5998;
color:#FFFFFF;
}
#shade
{
background-color:#00CCFF;
}
</style>
</head>

<body>
<div  style=" padding:10px; height:25px; background:#3b5998; background: left no-repeat #3b5998 ">
  <div style="width: 250px; float: none; margin-right: 30px">
              <input type="text" class="buscar" id="cajabusqueda" /><br />
<div id="display">
</div>

</div>

</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div style="margin-top:20px; margin-left:20px">



</div>
</body>
</html> 

_____________ BUSCAR.PHP____________________


Código PHP:
<?php


include('configuracion.php');
if(
$_POST)
{

$q=$_POST['buscarpalabra'];

$sql_res1=mysql_query("select * from notas where (notas.nombre like '%$q%' or notas.nota1 like '%$q%' or notas.nota2 like '%$q%')");
while(
$row=mysql_fetch_array($sql_res1))
{
$fbnombre=$row['nombre'];
$apellido=$row['nota1'];
$ciudad=$row['codigo'];

$re_fbnombre='<b>'.$q.'</b>';
$re_apellido='<b>'.$q.'</b>';

$final_fbnombre str_ireplace($q$re_fbnombre$fbnombre);

$final_apellido str_ireplace($q$re_apellido$apellido);


?>

 <div id="display_box"  value='<?=$id?>' align="left">
    <?php echo $final_fbnombre?>&nbsp;<?php echo $final_apellido?>
    <br/>
    <span style="font-size:9px; color:#999999"><?php echo $ciudad?></span>
</div>

<?php
}

}
else
{

}


?>
___________________LOADDATA.PHP__________________

Código HTML:
<?php
include('configuracion.php');
if($_POST)
{
$q=$_POST['id'];
$sql_res1=mysql_query("select * from notas where (id = '%$q%');
while($row=mysql_fetch_array($sql_res1))
{
$fbnombre=$row['nombre'];
$apellido=$row['nota1'];
$ciudad=$row['nota2'];


<div class="display_box"  value='<?=$id?>' align="left">
	<?php echo $final_fbnombre; ?>&nbsp;<?php echo $final_apellido; ?>
	<br/>
	<span style="font-size:9px; color:#999999"><?php echo $ciudad; ?></span>
</div>

<?php
}

}
else
{

}


?> 

_______________________JQUEY.WATERMARKINPUT.JS____ _______

/*
* Copyright (c) 2007 Josh Bush (digitalbush.com)
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:

* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/

/*
* Version: Beta 1
* Release: 2007-06-01
*/
(function($) {
var map=new Array();
$.Watermark = {
ShowAll:function(){
for (var i=0;i<map.length;i++){
if(map[i].obj.val()==""){
map[i].obj.val(map[i].text);
map[i].obj.css("color",map[i].WatermarkColor);
}else{
map[i].obj.css("color",map[i].DefaultColor);
}
}
},
HideAll:function(){
for (var i=0;i<map.length;i++){
if(map[i].obj.val()==map[i].text)
map[i].obj.val("");
}
}
}

$.fn.Watermark = function(text,color) {
if(!color)
color="#aaa";
return this.each(
function(){
var input=$(this);
var defaultColor=input.css("color");
map[map.length]={text:text,obj:input,DefaultColor:defaultColor,Wa termarkColor:color};
function clearMessage(){
if(input.val()==text)
input.val("");
input.css("color",defaultColor);
}

function insertMessage(){
if(input.val().length==0 || input.val()==text){
input.val(text);
input.css("color",color);
}else
input.css("color",defaultColor);
}

input.focus(clearMessage);
input.blur(insertMessage);
input.change(insertMessage);

insertMessage();
}
);
};
})(jQuery);


_________________________________


Me esta faltando agregar el de configuracion.php que es donde conecta a la base ( que eso funciona ) y el jquery.js que no creo sea necesario..

el link del proyecto es este http://wakemedios.com/buscar/busqueda.html

MILLONES DE GRACIAS.
  #2 (permalink)  
Antiguo 20/07/2015, 15:10
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 11 años, 10 meses
Puntos: 39
Respuesta: Buscador PHP JQUERY

A ver yo a priori veo varios fallos o al menos yo no lo hago así y siempre me funciona.

busqueda.html

En primer lugar, en el archivo (busqueda.html) yo te aconsejaría que lo cambiases por un .php, ya que si trabajas en PHP después tienes más opciones.

En segundo lugar, cuando enviamos un AJAX a través de jQuery con un dato que queremos recibir por medio de POST en el documento al que estamos enviando la información, siempre lo mando a través de un objeto y no en un string, quizás no tenga yo razón, pero tengo entendido que tiene que ser así, al menos a mi siempre me ha funcionado haciéndolo de este modo.

En tercer lugar, la función que haces al hacer clic sobre la div #display_box ($(document).on("click","#display_box",function()) es un malgasto de recursos ya que lo que haces es llamar al archivo loadData.php para que te busque en la base de datos un dato que ya extrajiste en el buscar.php y que ya tienes impreso en pantalla. Ahorrarás recursos en el servidor si lo que haces en esa función es coger esa misma división y la vuelves a imprimir usando jQuery sin tener que hacer otra llamada a AJAX y otra búsqueda en la base de datos. Además puede darse el caso de que el archivo buscar.php te haya devuelto varias divisiones, en cuyo caso la llamas mal ya que todas te las devuelve con el mismo ID, es mejor que la llames como te la he puesto yo ($(document).on("click","#display > div",function()) es decir al hacer clic en las divisiones hijas de #display.

Código Javascript:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  5. <title>Busqueda</title>
  6. <script type="text/javascript" src="jquery.js"></script>
  7. <script type="text/javascript">
  8.  
  9.  
  10.  
  11.  $(document).ready(function(){
  12.     $(".buscar").keyup(function(){
  13.         var cajabusqueda = $(this).val();
  14.         var dataString = {
  15.             buscarpalabra : cajabusqueda
  16.         }
  17.         if(cajabusqueda){
  18.             $.ajax({  
  19.                 url: "buscar.php",
  20.                 type: "POST",
  21.                 data: dataString,
  22.                 success: function(r){
  23.                     var o = eval("("+r+")");
  24.                     if(o.estado == "OK"){
  25.                         $("#display").html(o.html).show();
  26.                     }
  27.                 }
  28.             });
  29.         }    
  30.     });
  31.    
  32.    
  33.     $(document).on("click","#display > div",function(){
  34.         var intDiv = $(this).html();
  35.        
  36.         var div = '<div class="display_box"  align="left">'+intDiv+'</div>';
  37.         $("#display").html(div).show();
  38.     });
  39. });
  40.  
  41.  
  42. jQuery(function($){
  43.     $("#cajabusqueda").Watermark("Buscar");
  44. });  
  45.    
  46.    
  47. </script>
  48. <style type="text/css">
  49. body
  50. {
  51. font-family:"Lucida Sans";
  52. }
  53. *
  54. {
  55. margin:0px
  56. }
  57. #cajabusqueda
  58. {
  59. width:250px;
  60. padding:3px;
  61. margin-left:250px;
  62. }
  63. #display
  64. {
  65. width:254px;
  66. display:none;
  67. float:right; margin-right:1px;
  68. border-left:solid 1px #dedede;
  69. border-right:solid 1px #dedede;
  70. border-bottom:solid 1px #dedede;
  71. overflow:hidden;
  72. }
  73. #display_box
  74. {
  75. padding:7px; border-top:solid 1px #dedede; font-size:12px; height:30px; background:#ECECEC;
  76. }
  77. .display_box:hover
  78. {
  79. background:#3b5998;
  80. color:#FFFFFF;
  81. }
  82. #shade
  83. {
  84. background-color:#00CCFF;
  85. }
  86. </style>
  87. </head>
  88.  
  89. <body>
  90. <div  style=" padding:10px; height:25px; background:#3b5998; background: left no-repeat #3b5998 ">
  91.   <div style="width: 250px; float: none; margin-right: 30px">
  92.               <input type="text" class="buscar" id="cajabusqueda" /><br />
  93. <div id="display">
  94. </div>
  95.  
  96. </div>
  97.  
  98. </div>
  99. <p>&nbsp;</p>
  100. <p>&nbsp;</p>
  101. <p>&nbsp;</p>
  102. <div style="margin-top:20px; margin-left:20px">
  103.  
  104.  
  105.  
  106. </div>
  107. </body>
  108. </html>


buscar.php

Primero: En este archivo, yo siempre que trabajo con AJAX prefiero enviar las respuestas a través de json, ya que esto te permite devover múltiples datos, tantos como quieras y no solo un código HTML, para esto es necesario que leas un poco, si no sabes, sobre las clases en PHP y la programación orientada a objetos.

Segundo: Te he creado en este archivo la clase obj_response que será la encargada de almacenar en un objeto los datos que le vamos a devolver al busqueda.html a través de AJAX y lo haremos a traves de json para poder enviar más datos. Puedes añadir todos los datos de respuesta que quieras que luegos podrás tratar en la función de jQuery haciendo un eval de una manera muy simple.

Tercero: En este archivo te he hecho varias modificaciones en función de como trabajo yo y siempre me funcionan las cosas. Por alguna razón a mi muchas veces me da error cuando meto muchos datos dentro del bucle while que arroja los diferente resultados de la consulta, así que lo que hago es pasar a arrays los valores devueltos y luego tratar los arrays en otro bucle. En este caso lo que he hecho creo que salta a la vista y si lo pruebas así tu verás como te funciona.

Cuarto: No sé de donde estabas sacando la variable $id que además estabas imprimiendo asi: (<?=$id?>) lo cual ya no está bien. Además en el jQuery intentabas coger este valor de esta forma ($(this).val()) algo que no te va a servir en un DIV la forma correcto de coger ese atributo en un DIV es esta ($(this).attr("value")), aunque si te fijas te lo he quitado todo, tanto el atributo id como el atributo value que no te sirven para nada, ya que el ID que tiene que ser un atributo único lo estabas enviando repetido en el caso de que la consulta te diese más de un valor y en el atributo VALUE estabas dando un variable $id que no era nada en absoluto. No sé si por error le estabas poniendo el atributo ID en lugar de CLASS o es que esa DIV no tiene class, en cuyo caso solo tienes que añadirle el class="display_box" como la asignabas en el loaddata.php que hemos eliminado para ahorrar recursos.

Quinto : Tienes que optimizar las consultas MySQL, evita el SELECT * siempre que no vayas a utilizar todos los datos que te devuelva la consulta. También tienes que evitar en la clausula WHERE el preguntar así (%LO QUE SEA%) ya que esto también como muchos recursos a la hora de hacer consultas, te aconsejo que te mires mejor como utilizar los índices FULLTEXT con los que ahorrarás muchos recursos y te darán mejores resultados que ese tipo de consultas.

Código PHP:
<?php 

/* ESTA SERÍA LA CLASE DE RESPUESTA DE AJAX PUEDES CAMBIARLA O AÑADIR LO QUE TU QUIERAS Y LO CORRECTO ES QUE VAYA EN UN ARCHIVO APARTE Y AGREGADA A ESTE ARCHIVO CON UN INCLUDE O REQUIRE_ONCE */
class obj_response {
    public 
$estado;
    public 
$html;
}

include(
'configuracion.php');

$OBJ_RESPONSE = new obj_response();

$q $_POST['buscarpalabra']; 

$fbnombre = array();
$apellido = array();
$ciudad = array();
$sql_res1=mysql_query("SELECT nombre, nota1, codigo FROM notas WHERE nombre LIKE '%".$q."%' OR nota1 LIKE '%".$q."%' OR nota2 LIKE '%".$q."%')"); 
while(
$row=mysql_fetch_array($sql_res1)){ 
    
$fbnombre[] = $row['nombre']; 
    
$apellido[] = $row['nota1']; 
    
$ciudad[] = $row['codigo']; 
}

$re_fbnombre='<b>'.$q.'</b>'
$re_apellido='<b>'.$q.'</b>'
foreach(
$fbnombre as $K => $value){
    
$final_fbnombre str_ireplace($q$re_fbnombre$fbnombre[$K]); 
    
$final_apellido str_ireplace($q$re_apellido$apellido[$K]); 
    
    
$DIV .= '
    <div align="left"> 
        '
.$final_fbnombre.'&nbsp;'.$final_apellido.'
        <br/> 
        <span style="font-size:9px; color:#999999">'
.$ciudad[$K].'</span> 
    </div> 
    '
;
}

if(!
$id[0]){
    
$OBJ_RESPONSE->estado "KO";
}else{
    
$OBJ_RESPONSE->estado "OK";
    
$OBJ_RESPONSE->html $DIV;
}

echo 
json_encode($OBJ_RESPONSE);

?>
Otra cosa que he visto es que el archivo JQUEY.WATERMARKINPUT.JS no lo tienes incrustado en el busqueda.html pero usas una función de este archivo, puede que sea un error solo al escribir el post, pero si no es así, puede que te esté dando un fallo ahí también.

Como he dicho el archivo loaddata.php no te sirve ya que lo que hemos hecho es crear esa división con los datos que ya teníamos impresos dentro de la <div id="display"> y sustituyéndolo de nuevo con sus propio código sin necesidad de volver a llamar a otro archivo a través de AJAX ahorrando así enviar y recibir datos http y consultas a las bases de datos para extraer información que ya tenemos impresa en pantalla.

Espero que te hay servido de ayuda.
__________________
Diseño Web - Arisman Web

Última edición por manuparquegiralda; 20/07/2015 a las 15:19

Etiquetas: buscador, html, jquery, select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:51.