Ajax PHP 实时搜索 - 需要第二步

Posted

技术标签:

【中文标题】Ajax PHP 实时搜索 - 需要第二步【英文标题】:Ajax PHP Live Search - Second Step Needed 【发布时间】:2012-01-22 20:14:17 【问题描述】:

我有一个 Ajax php mysql 实时搜索,它基本上从 MySQL 数据库中提取食物项目并将它们显示在一个下拉列表中,当用户输入他们的搜索词时,每行一个项目,就像在 Google 中搜索一样。

我需要一种允许用户点击特定结果项目的方法,然后在点击的项目下方打开一个带有几个单选按钮的框,其中列出了包含各种数量的特定食物项目的选项.然后,用户将能够选择一个金额选项并单击提交以保存他们的选择。

我非常了解 PHP、MySQL 和 html,但 JS 有点挑战,所以如果您能详细回答,我将不胜感激。

以下是我目前拥有的一些代码 sn-ps:

    HTML 搜索表单:

    <input type="text" size="30" name="food_name" id="q" value="" onkeyup="sendRequest(this.value);" autocomplete="off"/>
    

    带有搜索表单的同一页面上的 AJAX 代码:

      function createRequestObject() 
    
      var req;
    
     if(window.XMLHttpRequest)
      // Firefox, Safari, Opera...
      req = new XMLHttpRequest();
      else if(window.ActiveXObject) 
      // Internet Explorer 5+
      req = new ActiveXObject("Microsoft.XMLHTTP");
      else 
      alert('Problem creating the XMLHttpRequest object');
     
    
     return req;
    
     
    
    // Make the XMLHttpRequest object
    var http = createRequestObject();
    
    function sendRequest(q) 
    
     // Open PHP script for requests
      http.open('get', 'checkfoods.php?q='+q);
      http.onreadystatechange = handleResponse;
      http.send(null);
    
      
    
      function handleResponse() 
    
      if(http.readyState == 4 && http.status == 200)
    
      // Text returned FROM the PHP script
      var response = http.responseText;
    
      if(response) 
         // UPDATE ajaxTest content
         document.getElementById("searchResults").innerHTML = response;
      
    
      
    
      
    

    PHP 脚本在 MySQL 中查看名为 FOOD_DES 的表并返回填充食物下拉列表的结果:

      include 'my-food-dtabase.php';
    
      $searchQry = isset($_GET['q']) ? mysql_real_escape_string($_GET['q']) : false;
    
      if ($searchQry) 
      $searchString = $_GET['q'];
    
      $sql = mysql_query("SELECT NDB_No, FdGrp_Cd, Long_Desc FROM FOOD_DES WHERE Long_Desc LIKE '%".$_GET['q']."%' ORDER BY Long_Desc ASC");
    
      if($searchString != NULL) 
    
      while($row = mysql_fetch_assoc($sql)) 
      echo "<span id=foodlist><a href=calorie-counter-serving.php?NDB_No=".$row['NDB_No'].">".$row['Long_Desc']."</a><br /></span>";
     
     
    
      if(mysql_num_rows($sql) == 0) 
      echo "<span class=medium_white>Food item not found. Try a different name or keyword.</span>";
      
      
    

【问题讨论】:

cs.arizona.edu/~mccann/indent_c.html#One 确保您在处理此问题时可以看到 AJAX 请求/响应 - 这非常有帮助。 Chrome 原生有这个,或者 Firefox+Firebug 也不错。 【参考方案1】:

这不一定是一个完整的答案,而是指向正确方向的指针。

通过使用 jQuery 而不是纯 javascript,您将为自己节省大量时间和精力。它还会将您的第 2 步减少到几行代码,因为它带有自己的Ajax API。这是tutorial on its Ajax system - 简单多了!

jQuery UI 是 jQuery 的一个很好的扩展,它可以帮助您构建用户界面,其中一部分是对话框小部件。我认为'Modal form' dialog example 与您单击“创建新用户”按钮时想要实现的目标非常相似。点击“查看源代码”看看他们是如何做到的。

从我在第 3 步中可以看出,您没有清理您的查询,$_GET['q'] 被直接扔到您的查询字符串中。您应该将其替换为您在上面已经定义了几行的 $searchQry。

【讨论】:

+1,肯定是 JS 库。 Google 等人在本地做所有事情来为每个请求节省几 KB - 任何不在如此稀有高度操作的人都应该使用 jQuery/MooTools/Prototype 等。【参考方案2】:

这是您可以使用 Ajax、PHP 和 JQuery 执行的操作。希望这对您有所帮助或开始。

在此处查看现场演示和源代码。

http://purpledesign.in/blog/to-create-a-live-search-like-google/

创建一个搜索框,可以是这样的输入框。

<input type="text" id="search" autocomplete="off">

现在我们需要聆听用户在文本区域输入的任何内容。为此,我们将使用 jquery live() 和 keyup 事件。在每个 keyup 上,我们都有一个 jquery 函数“search”,它将运行一个 php 脚本。

假设我们有这样的 html。我们有一个输入字段和一个列表来显示结果。

 <div class="icon"></div>
 <input type="text" id="search" autocomplete="off">
 <ul id="results"></ul>

我们有一个 Jquery 脚本,它将监听输入字段上的 keyup 事件,如果它不为空,它将调用 search() 函数。 search() 函数将运行 php 脚本并使用 AJAX 在同一页面上显示结果。

这里是 JQuery。

$(document).ready(function()   

    // Icon Click Focus
    $('div.icon').click(function()
        $('input#search').focus();
    );

    //Listen for the event
        $("input#search").live("keyup", function(e) 
        // Set Timeout
        clearTimeout($.data(this, 'timer'));

        // Set Search String
        var search_string = $(this).val();

        // Do Search
        if (search_string == '') 
            $("ul#results").fadeOut();
            $('h4#results-text').fadeOut();
        else
            $("ul#results").fadeIn();
            $('h4#results-text').fadeIn();
            $(this).data('timer', setTimeout(search, 100));
        ;
    );


    // Live Search
    // On Search Submit and Get Results
    function search() 
        var query_value = $('input#search').val();
        $('b#search-string').html(query_value);
        if(query_value !== '')
            $.ajax(
                type: "POST",
                url: "search_st.php",
                data:  query: query_value ,
                cache: false,
                success: function(html)
                    $("ul#results").html(html);

                
            );
        return false;    
    



);

在 php 中,对 mysql 数据库进行查询。 php 将返回将使用 AJAX 放入 html 的结果。这里将结果放入一个 html 列表中。

假设有一个虚拟数据库,其中包含两个表动物和鸟,其中两个相似的列名为“type”和“desc”。

  //search.php
    // Credentials
    $dbhost = "localhost";
    $dbname = "live";
    $dbuser = "root";
    $dbpass = "";

    //  Connection
    global $tutorial_db;

    $tutorial_db = new mysqli();
    $tutorial_db->connect($dbhost, $dbuser, $dbpass, $dbname);
    $tutorial_db->set_charset("utf8");

    //  Check Connection
    if ($tutorial_db->connect_errno) 
        printf("Connect failed: %s\n", $tutorial_db->connect_error);
        exit();

    $html = '';
    $html .= '<li class="result">';
    $html .= '<a target="_blank" href="urlString">';
    $html .= '<h3>nameString</h3>';
    $html .= '<h4>functionString</h4>';
    $html .= '</a>';
    $html .= '</li>';

     $search_string = preg_replace("/[^A-Za-z0-9]/", " ", $_POST['query']);
$search_string = $tutorial_db->real_escape_string($search_string);

// Check Length More Than One Character
if (strlen($search_string) >= 1 && $search_string !== ' ') 
    // Build Query
    $query = "SELECT *
     FROM animals
     WHERE type LIKE '%".$search_string."%'
     UNION ALL SELECT *
     FROM birf
     WHERE type LIKE '%".$search_string."%'"
     ;

    $result = $tutorial_db->query($query);
        while($results = $result->fetch_array()) 
            $result_array[] = $results;
        

        // Check If We Have Results
        if (isset($result_array)) 
            foreach ($result_array as $result) 

                // Format Output Strings And Hightlight Matches
                $display_function = preg_replace("/".$search_string."/i", "<b class='highlight'>".$search_string."</b>", $result['desc']);
                $display_name = preg_replace("/".$search_string."/i", "<b class='highlight'>".$search_string."</b>", $result['type']);
            $display_url = 'https://www.google.com/search?q='.urlencode($result['type']).'&ie=utf-8&oe=utf-8';

                // Insert Name
                $output = str_replace('nameString', $display_name, $html);

                // Insert Description
                $output = str_replace('functionString', $display_function, $output);

                // Insert URL
                $output = str_replace('urlString', $display_url, $output);



                // Output
                echo($output);
            
        else

            // Format No Results Output
            $output = str_replace('urlString', 'javascript:void(0);', $html);
            $output = str_replace('nameString', '<b>No Results Found.</b>', $output);
            $output = str_replace('functionString', 'Sorry :(', $output);

            // Output
            echo($output);
        
    

【讨论】:

【参考方案3】:

http://koding.info/2013/07/ajax-search-box-php-mysql-jquery/ 我已经实现了一个使用 Wordpress 数据库的演示实时搜索应用程序。 看一看。 它可以帮助你。

【讨论】:

请注意 link-only answers 是不鼓励的,所以答案应该是寻找解决方案的终点(而不是另一个参考中途停留,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。

以上是关于Ajax PHP 实时搜索 - 需要第二步的主要内容,如果未能解决你的问题,请参考以下文章

PHP 实例 - AJAX 实时搜索

PHP 实例 - AJAX 实时搜索

PHP 实时搜索con ajax y php

用php+ajax新建流程(请假进货出货等)

实时求和每次更改以及如何使用 ajax php mysql 处理它

实时搜索con ajax y php