Php jqueryui与数据库自动完成

Php jqueryui与数据库自动完成,php,jquery,json,user-interface,autocomplete,Php,Jquery,Json,User Interface,Autocomplete,我对JQuery还相当陌生,可能正试图实现一些对初学者来说可能更难的东西。但是,我尝试创建一个自动完成,将当前值发送到PHP脚本,然后返回必要的值 这是我的Javascript代码 $("#login_name").autocomplete({ source: function(request, response) { $.ajax({ url: "http://www.myhost.com/myscript.php", dataType: "jsonp",

我对JQuery还相当陌生,可能正试图实现一些对初学者来说可能更难的东西。但是,我尝试创建一个自动完成,将当前值发送到PHP脚本,然后返回必要的值

这是我的Javascript代码

$("#login_name").autocomplete({
    source: function(request, response) {
 $.ajax({
     url: "http://www.myhost.com/myscript.php",
     dataType: "jsonp",

     success: function(data) {
  alert(data);
  response($.map(data, function(item) {
      return {
   label: item.user_login_name,
   value: item.user_id
      }
  }))
     }
 })
    },
    minLength: 2
});
下面是“myscript.php”的最后一半

这将产生以下输出

[{"user_id":"2","user_login_name":"Name1"},{"user_id":"3","user_login_name":"Name2"},{"user_id":"4","user_login_name":"Name3"},{"user_id":"5","user_login_name":"Name4"},{"user_id":"6","user_login_name":"Name5"},{"user_id":"7","user_login_name":"Name6"}]
谁能告诉我哪里出了问题?开始感到非常沮丧。输入框仅变为“白色”,不显示任何选项。如果我指定一个值数组,代码就可以工作

更新 我已将代码更改为,但仍然没有运气

$("#login_name").autocomplete({
    source: "/ajax/login_name.php",
    dataType: "json",
    minLength: 2,
    cache: false,
    select: function(event, ui) {
        alert(ui);
    }
});
使用FireFox的Web开发者工具,我得到一个错误“b为空”。

一些建议:

  • 为什么
    dataType=“jsop”
    ?它似乎不是jsonp。我想你想要“json”
  • 在选项中插入
    缓存:false
    。这确保了请求始终被发出,并且永远不会从浏览器端缓存中得到满足
  • 检查电话是否有人打出去,比如菲德勒或查尔斯
  • 你的成功有人打电话给你吗?您有一个
    警报()
    。它被调用了吗
  • 如果您有Firebug或IE8开发工具,可以在
    警报()上设置断点来验证参数的值
    
  • 为什么要在URL中指定完整主机名? 昨晚,当我对页面和Ajax请求使用不同的主机名时,autocomplete出现了一个奇怪的情况,响应为null,即空字符串。当我修改它使用相同的主机名时,请求成功了。实际上,由于同源策略,ajax调用的URL中应该没有主机名
    JSON结构是一个平面字符串,而需要一个数组或类似数组的结构。在使用map之前,请尝试对字符串进行json解码。

    是的,您确实需要json的标题信息

            header("Expires: Mon, 26 Jul 1997 05:00:00 GMT" ); 
            header("Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . "GMT" ); 
            header("Cache-Control: no-cache, must-revalidate" ); 
            header("Pragma: no-cache" );
            header("Content-type: text/x-json");
    
    并且在插头附近做了一个很好的点

    在任何情况下,我认为你都不会像插件那样调用ajax


    如果您实际上正在使用,您应该仔细阅读文档并运行基本版本。除了缺少标题数据之外,您的php还不错,终于找到了适合我需要的解决方案

    $("#login_name").autocomplete({
      source: function(request, response){
        $.post("/ajax/login_name.php", {data:request.term}, function(data){     
            response($.map(data, function(item) {
            return {
                label: item.user_login_name,
                value: item.user_id
            }
            }))
        }, "json");
      },
      minLength: 2,
      dataType: "json",
      cache: false,
      focus: function(event, ui) {
        return false;
      },
      select: function(event, ui) {
        this.value = ui.item.label;
        /* Do something with user_id */
        return false;
      }
    });
    

    我也有像你一样的问题。现在我把它修好了。问题是从服务器返回的json包含语法错误

    In告诉我们,如果JSON中有错误,它将以静默方式失败。JSON必须与此处的JSON标准匹配

    因为我的错误是JSON中的字符串只包含一个引号。但是JSON标准只接受用双引号括起来的字符串

    例如,“你好世界”不是“你好世界”


    修复后,可以将源设置为字符串URL。术语将位于“术语”查询字符串中。而且很有效

    如果其他人需要它:

    jQuery UI中的autocomplete文档指定要使用的querystring参数是“term”而不是“q”。。。至少现在是这样

    E.g. http://www.myhost.com/myscript.php?term=someToSearchFor
    

    简单的jQueryUI自动完成,适合那些可能需要它的人

    //select data from the table
    $search = $db->query('SELECT Title from torrents');
    
    //then echo script tags and variables with php
    <?php echo '<script type="text/javascript">
     $(function() {
      var availableTags = [';
     foreach ($search as $k) {
      echo '"'.$k['Title'].'",';
    }
      echo '];
    $( "#tags" ).autocomplete({
      minLength:2, //fires after typing two characters
      source: availableTags
    });
    });
    </script>';
    
     ?>
    
    //从表中选择数据
    $search=$db->query('SELECT Title from torrents');
    //然后用php回显脚本标记和变量
    
    您的html表单

    <div id="search">
    <form id="search-form">
    <input id="tags" type="text" />
    <input type="submit" value="Search" />
    </form>
    </div>
    
    
    
    刚刚有了一个想法;“myscript.php”是否需要发送一个“JSON头”(如果存在这样的东西)…似乎参数没有通过?q=as documented???现在我已经删除了(isset($\u GET['q']),我在使用$(“#login\u name”)时在自动完成中得到了“未定义”选项。自动完成({源代码:“/ajax/login\u name.php”),数据类型:“json”,minLength:2,cache:false,formatItem:function(data){return data.user_login_name;},formatResult:function(data){return data.user_id;});顺便说一句,您需要添加json或jquery json插件来对其进行解码(据我所知)“或内容类型。但我认为json首选的内容类型是“application/json”或“text/javascript”。这就是jQuery1.4.2在发送json的ajax请求时所期望的,这也是被提议作为标准的。我添加了这些头的所有变体,但没有成功。我使用的是这个脚本的修改版本,如果我复制并粘贴代码,它会非常好地工作。现在尝试使用一个修改版本的不确定它是相同的问题。@bigstyle显示的JSON有双引号而不是单引号。
    <div id="search">
    <form id="search-form">
    <input id="tags" type="text" />
    <input type="submit" value="Search" />
    </form>
    </div>