jquery ui自动完成数据库

我是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”的后半部分

 while($row = $Database->fetch(MYSQLI_ASSOC)) { foreach($row as $column=>$val) { $results[$i][$column] = $val; } $i++; } print json_encode($results); 

这产生以下输出

 [{"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 Developer工具,我收到错误“b为null”。

终于找到了符合我需求的解决方案

 $("#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; } }); 

一些建议:

  1. 为什么dataType= "jsop" ? 它似乎不是jsonp。 我想你想要“json”。
  2. 在选项中插入cache : false 。 这确保了始终发出请求,并且从不满足于浏览器端缓存。
  3. 用Fiddler或Charles等方法检查通话是否结束。
  4. 你的成功会被召集吗? 你有一个alert() 。 是否被调用?
  5. 如果你有Firebug或IE8开发人员工具,你可以在alert()上放置一个断点来validation参数的值。
  6. 为什么要在URL中指定完整的主机名? 昨晚我有一个奇怪的情况,自动完成,响应为空,空字符串,当我使用不同的主机名为页面和Ajax请求。 当我修改它以使用相同的主机名时,请求成功。 实际上由于原始策略相同,您在ajax调用的URL中根本没有主机名。

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

  header("Expires: Mon, 26 Jul 1997 05:00:00 GMT" ); header("Last-Modified: " . gmdate( "D, d MYH:i:s" ) . "GMT" ); header("Cache-Control: no-cache, must-revalidate" ); header("Pragma: no-cache" ); header("Content-type: text/x-json"); 

和tvanfosson在塞子上做了一个好点

在任何情况下,我不认为你做插件的ajax调用。

如果你是使用jquery-ui自动填充,你应该阅读文档获得运行的基本版本。 除了丢失的标题数据之外,你的php还没问题

万一其他人需要它:

jQuery UI中自动完成的文档指定要使用的查询字符串参数是“ term ”而不是“q”…或者至少现在这样做。

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

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

 //select data from the table $search = $db->query('SELECT Title from torrents'); //then echo script tags and variables with php  $(function() { var availableTags = ['; foreach ($search as $k) { echo '"'.$k['Title'].'",'; } echo ']; $( "#tags" ).autocomplete({ minLength:2, //fires after typing two characters source: availableTags }); }); '; ?> 

你的HTML表单

  

JSON strcuture是一个扁平字符串,而map需要一个数组或数组结构。 在使用map之前尝试对字符串进行json解码。

我也有像你这样的问题。 现在我解决它。 问题是我的json从我的服务器返回包含语法错误。

在http://api.jquery.com/jQuery.getJSON/中告诉我,如果JSON中有一些错误,它将无声地失败。 JSON必须符合JSON标准http://json.org/ 。

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

例如。 “Hello World”不是“Hello World”

修复它时,您可以将源设置为字符串URL。 该术语将在“术语”查询字符串中。 它的工作原理!!