Ver Mensaje Individual
  #2 (permalink)  
Antiguo 20/07/2015, 15:10
Avatar de manuparquegiralda
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