sql >> Base de Datos >  >> RDS >> Mysql

PHP/MySQL mejor búsqueda de usuarios

Mencioné en los comentarios que una biblioteca de escritura anticipada de Javascript podría ser una buena opción para usted. Descubrí que la biblioteca Typeahead de Twitter y el motor Bloodhound son bastante robustos. Desafortunadamente, la documentación es mixta:siempre que lo que necesite sea muy similar a sus ejemplos, está bien, pero faltan ciertos detalles (explicaciones de los tokenizadores, por ejemplo).

En una de las varias preguntas sobre Typeahead aquí en Stack Overflow, @JensAKoch dice:

Francamente, en una breve revisión, la documentación en la bifurcación se ve un poco mejor, por lo menos. Es posible que desee comprobarlo.

Código del lado del servidor:

Se aplican todas las advertencias de usar una versión anterior de PHP. Recomiendo encarecidamente la reorganización para usar PDO con PHP 5, pero este ejemplo usa PHP 4 según lo solicitado.

Código PHP completamente no probado. json_encode() sería mejor, pero no aparece hasta PHP 5. Su punto final sería algo como:

headers("Content-Type: application/json");
$results = mysql_query(
   "SELECT ID,StageName,AKA1,AKA2,LegalName,SoundEx FROM performers"
);

$fields = array("ID","StageName","AKA1","AKA2","LegalName","SoundEx");

echo "[";

$first =  true;
while ($row = mysql_fetch_array($results)) {
    ($first) ? $first = false : echo ',';

    echo "\n\t,{";
    foreach($fields as $f) {
        echo "\n\t\t\"{$f}\": \"".$row[$f]."\"";
    }
    echo "\n\t}";
}
echo "]";

Código del lado del cliente:

Este ejemplo utiliza un archivo JSON estático como talón para todos los resultados. Si prevé que su conjunto de resultados supere las 1000 entradas, debe consultar el remote opción de Bloodhound . Esto requeriría que escribiera un código PHP personalizado para manejar la consulta, pero se vería muy similar al punto final que volca todos los datos (o al menos los más comunes).

var actors = new Bloodhound({
  // Each row is an object, not a single string, so we have to modify the
  // default datum tokenizer. Pass in the list of object fields to be
  // searchable.
  datumTokenizer: Bloodhound.tokenizers.obj.nonword(
    'StageName','AKA1','AKA2','LegalName','SoundEx'
  ),
  queryTokenizer: Bloodhound.tokenizers.whitespace,
  // URL points to a json file that contains an array of actor JSON objects
  // Visit the link to see details 
  prefetch: 'https://gist.githubusercontent.com/tag/81e4450de8eca805f436b72e6d7d1274/raw/792b3376f63f89d86e10e78d387109f0ad7903fd/dummy_actors.json'
});

// passing in `null` for the `options` arguments will result in the default
// options being used
$('#prefetch .typeahead').typeahead(
    {
        highlight: true
    },
   {
        name: 'actors',
        source: actors,
        templates: {
        empty: "<div class=\"empty-message\">No matches found.</div>",
        
        // This is simply a function that accepts an object.
        // You may wish to consider Handlebars instead.
        suggestion: function(obj) {
            return '<div class="actorItem">'
                + '<span class="itemStageName">'+obj.StageName+"</span>"
                + ', <em>legally</em> <span class="itemLegalName">'+obj.LegalName+"</span>"
        }
        //suggestion: Handlebars.compile('<div><strong>{{value}}</strong> – {{year}}</div>')
      },
      display: "LegalName" // name of object key to display when selected
      // Instead of display, you can use the 'displayKey' option too:
      // displayKey: function(actor) {
      //     return actor.LegalName;
      // }
});
/* These class names can me specified in the Typeahead options hash. I use the defaults here. */
    .tt-suggestion {
        border: 1px dotted gray;
        padding: 4px;
        min-width: 100px;
    }
    .tt-cursor {
        background-color: rgb(255,253,189);
    }
    
    /* These classes are used in the suggestion template */
    .itemStageName {
        font-size: 110%;
    }
    .itemLegalName {
        font-size: 110%;
        color: rgb(51,42,206);
    }
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://twitter.github.io/typeahead.js/releases/latest/typeahead.bundle.js"></script>


<p>Type something here. A good search term might be 'C'.</p>
<div id="prefetch">
  <input class="typeahead" type="text" placeholder="Name">
</div>

Para facilitar, aquí está el Gist del código del lado del cliente .