【问题标题】:Auto-complete search box, selecting multiple values from results自动完成搜索框,从结果中选择多个值
【发布时间】:2011-03-15 15:53:42
【问题描述】:

我正在使用 php/mysql 创建自己的食谱框,而我坚持的一部分实际上是创建食谱,特别是选择成分。

我想做的是有一个自动完成的搜索框,我可以在其中输入成分的名称,将结果下拉到正下方,然后单击我要查找的那些。点击成分后,它会列在搜索框下方,输入输入数量,如果需要,可以删除“x”。这当然会根据配方需要多少成分而增长。最后,我只需将数据插入到我的数据库中。

我已经看过很多关于获取自动完成搜索框功能的 AJAX 教程,但没有任何内容与值选择相关联。可以在http://supercook.com 找到我所追求的最佳示例。他们有它,所以你可以搜索食谱。

有什么建议或在线资源吗?

谢谢!

【问题讨论】:

    标签: php mysql ajax forms search


    【解决方案1】:

    你问了一个很好的问题。下面我写了一个简短的例子来帮助你入门。只需将其保存为 components.php 即可。当然,您需要添加数据库连接和查询以提供真实数据。我使用了 jQuery 库,因为它使 Javascript 部分变得更加容易。

    <?php
    
    // connect to database here
    
    if (isset($_POST['q'])) {
        if (trim($_POST['q']) === '') die('[]');
        // $q = mysql_real_escape_string($_POST['q']);
        // run a query like: "SELECT id, name FROM ingredients WHERE name LIKE '{$q}%'"
        // and put the result in the $result array.
        // This is sample data:
        $result = array(
            array('id' => 71, 'name' => 'apple'),
            array('id' => 3, 'name' => 'anchovies'),
            array('id' => 230, 'name' => 'artichoke'),
            );
    
        if (function_exists('json_encode')) die(json_encode($result));
        else {
            $escaped = array();
            foreach ($result as $r) $escaped[] = str_replace(array('\\', '"'), array('\\\\', '\"'), $r);
            die('["'.join('","', $escaped).'"]');
        }
    }
    
    $data = array();
    if (isset($_POST['ingredients'])) {
        foreach ($_POST['ingredients'] as $i => $ingredient) {
            $data[] = array(
                'ingredient' => $ingredient,
                'quantity' => $_POST['quantities'][$i],
                );
        }
        // save data to the database here (or inside the foreach loop above)
    }
    
    ?>
    <html><head></head><body>
    <style>
        #wrap { position: relative }
        #pop {
            position: absolute;
            border: 1px solid black;
            background-color: white;
            display: none;
        }
    </style>
    
    <?php if (count($data)): ?>
    <h3>Saved:</h3>
    <pre><?php print_r($data) ?></pre>
    <?php endif; ?>
    
    <div id="wrap">
        <input id="adder" />
        <div id="pop"></div>
    </div>
    <form method="post">
        Ingredients:<br />
        <div id="recipe"></div>
        <input type="submit" value="Save" />
    </form>
    
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script>
        var last_query = '';
        jQuery(function() {
            jQuery('#adder').val('').keyup(function() {
                var query = jQuery(this).val();
                if (query != last_query) jQuery.post('ingredients.php', {q: query}, function(data) {
                    var p = jQuery('#pop').html('').show();
                    for (var i=0; i<data.length; i++) {
                        p.append(jQuery('<p>'+data[i].name+'</p>').bind('click', { ingredient: data[i] }, function(e) {
                            add_ingredient(e.data.ingredient);
                            jQuery('#pop').hide();
                            jQuery('#adder').val('');
                        }));
                    }
                }, 'json');
                else jQuery('#pop').show();
                last_query = query;
            });
        });
        function add_ingredient(data) {
            console.log(data);
            var ingredient = jQuery('<div> <input name="quantities[]" size="2" /> '+data.name
                + '<input type="hidden" name="ingredients[]" value="'+data.id+'" /></div>');
            var remover = jQuery('<span>X</span>').click(function() {
                jQuery(this).parent().remove();
            });
            jQuery('#recipe').append(ingredient.prepend(remover));
        }
    </script>
    </body></html>
    

    【讨论】:

    • 哇,没想到这么多……太棒了!虽然我遇到了一些麻烦。再说一次,我是菜鸟。这应该能够按原样运行吗?我只是想看看这是否适用于您输入的示例数据,但事实并非如此。我收到此通知:“注意:未定义索引:第 5 行 C:\wamp\www\recipe\test.php 中的 q”此外,当我开始输入示例数据时,输入字段下没有弹出结果框。是否有任何先决条件才能使用?
    • 是的,如果您将文件命名为 ingredients.php,它应该按原样运行。我刚刚编辑了代码以修复“未定义索引”错误,但我认为这不会阻止它工作。一种可能的可能性是您没有安装 JSON 模块,因此 json_encode() 函数不起作用。要检查这一点,请将这一行放入 PHP 文件中:echo function_exists('json_encode')? 'have json' : 'do not have json'; 如果没有,请尝试安装它。如果您在安装时遇到问题,请告诉我,我将重写代码,使其不再需要。
    • 如果您使用的是来自 www.wampserver.com 的最新版本的 wamp,那么理论上您已经支持 JSON。您是否收到任何其他错误消息?尝试检查您是否还有任何 Javascript 错误。如果您使用的是 Firefox,Firebug 扩展可以帮助您进行调试。但是,这一切都可以在我的服务器和浏览器上完美运行......对不起,它不适合你!
    • 好的,现在已经编辑,不需要json_encode了。
    • 哦,我很傻,之前没有注意到您已重命名文件 test.php...您需要重命名文件成分.php 或替换 @ 987654323@ 和 jQuery.post('test.php'... 或任何你命名的文件。
    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2018-03-31
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2015-02-26
    相关资源
    最近更新 更多