sql >> Database teknologi >  >> RDS >> Mysql

PHP/MySQL bedre brugersøgning

Jeg nævnte i kommentarerne, at et Javascript typeahead-bibliotek kan være et godt valg for dig. Jeg har fundet Twitters Typeahead-bibliotek og Bloodhound-motor for at være ret robust. Desværre er dokumentationen en blandet sag:så længe det, du har brug for, er meget lig deres eksempler, er du gylden, men visse detaljer (forklaringer af tokenizers, for eksempel) mangler.

I et af flere spørgsmål om Typeahead her på Stack Overflow siger @JensAKoch:

Helt ærligt, i et kort tjek ser dokumentationen ved gaflen en smule bedre ud, om ikke andet. Du ønsker måske at tjekke det ud.

Kode på serversiden:

Alle forbeholdene ved at bruge en gammel version af PHP gælder. Jeg anbefaler på det kraftigste at ombygge til at bruge PDO med PHP 5, men dette eksempel bruger PHP 4 som anmodet.

Fuldstændig utestet PHP-kode. json_encode() ville være bedre, men det vises ikke før PHP 5. Dit slutpunkt ville være noget i stil med:

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 "]";

Kode på klientsiden:

Dette eksempel bruger en statisk JSON-fil som en stump for alle resultaterne. Hvis du forventer, at dit resultatsæt kommer over 1.000 poster, bør du kigge på remote mulighed for Bloodhound . Dette ville kræve, at du skriver noget brugerdefineret PHP-kode for at håndtere forespørgslen, men det vil stort set ligne det slutpunkt, der dumper alle (eller i det mindste dine mest almindelige) data.

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>

For nemheds skyld er her Gistensen af ​​koden på klientsiden .




  1. Hvordan kan jeg oprette en dynamisk URL i php?

  2. Lagring af datetime som UTC i PHP/MySQL

  3. Fremskynder rækkeoptællingen i MySQL

  4. Opret en optgroup fra en matrix af data