Php 如何确定提交的值是否来自自动完成脚本?

Php 如何确定提交的值是否来自自动完成脚本?,php,mysql,Php,Mysql,在我的表单中有一个文本框和提交按钮。当用户开始输入时,在第三个字母之后,自动完成脚本就发挥了神奇的作用 有两种可能性 用户键入一个单词,有匹配项,然后单击一个匹配项。此选定的匹配项将添加到文本框中,然后点击提交按钮 用户键入一个单词,没有匹配项,但他决定点击submit按钮,而不选择其中一个建议选项 我的问题是如何确定他是在案例1还是案例2中按下了按钮 rpc.php是通过mySQL查找建议值的文件 一个解决方案是检查数据库中是否存在字符串,但我不希望这样 另一个解决方案是转换jQuery脚本和

在我的表单中有一个文本框和提交按钮。当用户开始输入时,在第三个字母之后,自动完成脚本就发挥了神奇的作用

有两种可能性

  • 用户键入一个单词,有匹配项,然后单击一个匹配项。此选定的匹配项将添加到文本框中,然后点击提交按钮
  • 用户键入一个单词,没有匹配项,但他决定点击submit按钮,而不选择其中一个建议选项
  • 我的问题是如何确定他是在案例1还是案例2中按下了按钮

    rpc.php是通过mySQL查找建议值的文件

    一个解决方案是检查数据库中是否存在字符串,但我不希望这样

    另一个解决方案是转换jQuery脚本和显示产品名称的php代码,而不是将产品放在文本框中,而是将其带到结果页面。这也解决了我的问题

    <script type="text/javascript">
    $().ready(function() {
    
        $("#s").autocomplete("rpc.php", {
            width: 250,
            selectFirst: false,
            minChars: 3,
            scroll:true,
    matchContains: true,
    
            scrollHeight: 250
        });
    
    });
    </script>
    
    <form method="get" action=".php">
    <input type="text" name="s" id="s" class="inputsearch">
    <input type="submit">
    </form>
    
    
    $().ready(函数()){
    $(“#s”).autocomplete(“rpc.php”{
    宽度:250,
    selectFirst:false,
    明查斯:3,
    卷轴:没错,
    对,,
    卷轴高度:250
    });
    });
    
    最简单的方法是修改
    自动完成
    插件本身,以便在用户从中选择值时设置标志,并在用户修改其选择时清除标志。标志可以在任何地方,但为了简单起见,我建议使用隐藏的表单字段,如:

    <form method="get" action=".php">
        <input type="text" name="s" id="s" class="inputsearch">
        <input type="hidden" id="flag" name="inputCameFromAutocomplete" value="false">
        <input type="submit">
    </form>
    
    如果您愿意,您可以将flag元素的id/选择器作为plugin-config/options的一部分,以便它更易于重用

    您还需要执行以下操作:

    $("#flag").val("true");
    
    $("#s").keypress(function() {
        $("#flag").val("false");
    });
    

    …作为初始设置的一部分,因此每当用户手动在字段中键入内容时,就会重置标志。

    使用autocomplete的
    change
    方法在表单中设置标志,例如

    /// Create an hidden element to store the flag value,
    /// 1 for AC used, 0 for user entered
    var flag = $("<input>").attr("type", "hidden")
                           .attr("name", "ac_flag")
                           .val(0);
    
    // append flag to form
    $("form").append(flag);
    
    $("#s").autocomplete("rpc.php", {
        change: function(event, ui) {
            flag.val(ui.item != null ? 1 : 0);
        },
        // and the rest
    });
    
    ///创建一个隐藏元素来存储标志值,
    ///1表示使用空调,0表示用户输入
    变量标志=$(“”).attr(“类型”,“隐藏”)
    .attr(“名称”、“ac_标志”)
    .val(0);
    //将标志附加到窗体
    $(“表格”)。附加(标志);
    $(“#s”).autocomplete(“rpc.php”{
    更改:功能(事件、用户界面){
    flag.val(ui.item!=null?1:0);
    },
    //其余的呢
    });
    
    当文本字段中的值更改时,“更改”事件将触发。选择AC项时,
    ui。项
    将包含对列表中所选项的对象引用。如果未进行选择,即用户仅输入文本,
    ui.item
    将为空

    然后,表单处理程序可以检查
    $\u GET['ac\u flag']
    ,以确定值是否来自自动完成列表


    这里的快速模型示例-

    rpc.php必须返回一个数组供自动完成使用,仔细查看该数组,如果提交的单词在数组中,则可以继续(无论是用自动完成还是键入)这将导致一个
    false
    标志,即使用户输入了
    iphone case black
    ,这大概可以在MySQL查询中使用。。。。虽然OP中不清楚这是不希望的还是希望的。如果用户幸运地键入了
    iphone case black
    ,系统必须将其标识为用户条目。@Peter-是的,避免这种情况的唯一方法是在提交时重复最后一组建议,查看它是否包含与输入完全匹配的值。这可能还必须作为自动完成插件的内部修改来完成。另一种方法是,如果用户单击建议的名称,则不会将其放入文本框,而是将其带到文本框中。(链接将在rpc.php中编码,这不是交易)。我试过了,但它把它放在了文本框里。(您必须右键单击“在新选项卡中打开”才能按我的要求操作)@JPampos-这应该适合您。如果用户输入
    iphone手机壳为黑色
    ,它将被视为用户输入。如果他们从“自动完成”对话框中选择它,则它将被视为自动完成选择。将用户自动带到链接也会起作用,但它会删除用户在选择自动完成建议后手动编辑建议的能力。嗨,你能给我解释一下吗。我也更新了我的问题。