login  Naam:   Wachtwoord: 
Registreer je!
 Scripts:

Scripts > PHP > Zoekmachines > ajax powered zoek machine, toont ook suggesties

ajax powered zoek machine, toont ook suggesties

Auteur: vinTage - 22 januari 2009 - 23:46 - Gekeurd door: marten - Hits: 15237 - Aantal punten: (0 stemmen)



Eigenlijk gaat het niet zozeer om het Ajax gedeelte, maar sinds dat Ajax hot blijkt te zijn, is dit wel een gunstige titel denk ik 

Het scriptje doorzoekt dus gewoon je database naar woorden die je intikt en toont de mogelijke resultaten op voorhand, thats all.

Er zit een kleine config bij, die je wat kan aanpassen, maar de comments in het script van zoek.php zullen eea wel verduidelijken.

Note: zowel in zoek.php als in de index je database gegevens aanpassen.

Code:
index.php

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>zoek ding</title>
  6.  
  7. <script type="text/javascript">
  8. function createRequestObject()
  9. {
  10. var req;
  11.  
  12. if(window.XMLHttpRequest)
  13. {
  14. req = new XMLHttpRequest();
  15. }
  16. else if(window.ActiveXObject)
  17. {
  18. req = new ActiveXObject("Microsoft.XMLHTTP");
  19. }
  20. else
  21. {
  22. alert('hmz....muffe browser...');
  23. }
  24.  
  25. return req;
  26.  
  27. }
  28.  
  29. var http = createRequestObject();
  30.  
  31. function sendRequest(zoekwoord)
  32. {
  33.  
  34. http.open('get', 'zoek.php?zoekwoord='+zoekwoord);
  35. http.onreadystatechange = handleResponse;
  36. http.send(null);
  37. }
  38.  
  39. function handleResponse()
  40. {
  41.  
  42. if(http.readyState == 4 && http.status == 200)
  43. {
  44. if(http.responseText)
  45. {
  46. document.getElementById("resultaat").innerHTML = http.responseText;
  47. }
  48. }
  49. }
  50. </script>
  51.  
  52. </head>
  53.  
  54. <body>
  55. <?php
  56. mysql_connect ("localhost","root","") or die(mysql_error());
  57. mysql_select_db("zoektest")or die (mysql_error());
  58. ?>
  59. <form action="<?php echo htmlentities($_SERVER['REQUEST_URI']);?>" method="post">
  60. <div id="zoekding">
  61. zoek: <input type="text" onKeyUp="sendRequest(this.value)" />
  62. </div>
  63. </form>
  64. <div id="resultaat"></div>
  65.  
  66. <hr />
  67.  
  68. <div id="content">
  69. <?php if(isset($_GET['id']))
  70. {
  71. $qry = mysql_query("SELECT count(id) as aantal, berichten FROM zoeken WHERE id = '".mysql_real_escape_string($_GET['id'])."' LIMIT 1");
  72. while($res = mysql_fetch_array($qry))
  73. echo ($res['aantal'] == 0)? 'id bestaat niet' : nl2br(preg_replace("~".$_GET['highlight']."~i", "<b style='color:red;'>".$_GET['highlight']."</b>", $res['berichten']));
  74. }
  75. ?>
  76. </div>
  77. </body>
  78. </html>


zoek.php
  1. <?php
  2. //maximaal aantal zoek resultaten
  3. $max_query = 10;
  4.  
  5. //de maximale lengte van de resultaten (aantal chars)
  6. $max_resultaat_lengte = 30;
  7.  
  8. //kies tussen substring of suggestie
  9. //false geeft gewoon een string van "max_resultaat_lengte"
  10. //true geeft een suggestie van een WOORD.. de "eindes" voor dit WOORD kunnen we aangeven in het array eind_chars
  11. $substr_vs_suggestie = false;
  12.  
  13. //minimaal aantal characters wat ingegeven moet worden in het zoekveld alvorens er resultaten gegeven worden (hoe hoger het nummer, hoe deftiger de éérste resultaten)
  14. $min_input = 3;
  15.  
  16. mysql_connect ("localhost","root","") or die(mysql_error());
  17. mysql_select_db("zoektest")or die (mysql_error());
  18.  
  19.  
  20. //array met characters die we gebruiken om het einde van een woord aan te duiden voor het "suggereren" (evt zelf uitbreiden/verwijderen)
  21. //alleen nodig met de optie "substr_vs_suggestie = false"
  22. $eind_chars = array(
  23. " ", //spatie
  24. ".", //punt
  25. ",", //komma
  26. "/", //fw slash
  27. "\\", //backwards slash
  28. "\"", //double quote
  29. "'", //single quote
  30. "<",
  31. ">",
  32. "?",
  33. "=",
  34. "&");
  35.  
  36.  
  37. if(!empty($_GET['zoekwoord']) && strlen($_GET['zoekwoord']) >= $min_input)
  38. {
  39. $zoekwoord = mysql_real_escape_string($_GET['zoekwoord']);
  40. $qry = mysql_query("SELECT DISTINCT(berichten),
  41. SUBSTR(berichten, LOCATE('".$zoekwoord."', berichten ), ".$max_resultaat_lengte." ) as tekst_gedeelte,
  42. id
  43. FROM
  44. zoeken
  45. WHERE
  46. berichten
  47. LIKE '%".$zoekwoord."%'
  48. LIMIT ".$max_query) or die(mysql_error());
  49.  
  50. //$eindwoord = $max_resultaat_lengte;
  51. while($res = mysql_fetch_array($qry))
  52. {
  53. $gevonden = stripslashes($res['tekst_gedeelte']);
  54. $index = array();
  55.  
  56. if(!$substr_vs_suggestie)
  57. {
  58. //mogelijke "einde(s)" opduikelen
  59. for($i = 0; $i < count($eind_chars); $i++)
  60. {
  61. $pos = strpos($gevonden, $eind_chars[$i]) ;
  62. if($pos)
  63. {
  64. array_push($index, $pos);
  65. }
  66. }
  67. //eerste "einde" vooraan zetten
  68. sort($index);
  69. }
  70.  
  71. //lengte van onze "suggestie" string bepalen
  72. $max_resultaat_lengte = (count($index) > 0) ? $index[0] : $max_resultaat_lengte;
  73. $link = htmlentities(substr($gevonden, 0, $max_resultaat_lengte));
  74.  
  75. ?>
  76. <a href="?id=<?php echo $res['id'];?>&highlight=<?php echo $link;?>"><?php echo $link;?></a><br />
  77. <?php
  78. }
  79. }
  80. else
  81. {
  82. echo '';
  83. }
  84. ?>


De database
  1. --
  2. -- Database: `zoektest`
  3. --
  4.  
  5. CREATE TABLE `zoeken` (
  6. `id` int(11) NOT NULL AUTO_INCREMENT,
  7. `berichten` text NOT NULL,
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=MyISAM;
  10.  
  11. INSERT INTO `zoeken` (`id`, `berichten`) VALUES
  12. (1, 'Dit is een test'),
  13. (2, 'vinTage is lief !'),
  14. (3, 'moeilijke woorden lukken ook'),
  15. (4, 'caps insensitive / hoofdletter ongevoelig'),
  16. (5, 'mijn keyboard is een qwerty geval'),
  17. (6, 'boeieuh, de basis is er :p');
Download code! Download code (.txt)

 Stemmen
Niet ingelogd.

 Reacties
Post een reactie
Lees de reacties (6)
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.043s