javascript - 基于 PHP 的大型数据集表单自动完成
问题描述
我正在开发一个 Web 应用程序,其中我在 SQL 数据库中有大量(约 50'000)文本字符串(此处称为“项目”)。用户应在输入表单中从这些项目中选择三个。我尝试了一些“直接”解决方案(下拉组合框等),但这些解决方案太慢了,有 50'000 个项目可供选择。使用 JavaScript 为文本框实现自动完成的传统解决方案存在类似的问题:具有允许选项的 JavaScript 文件变得太大(许多 MiB)。
我希望有一个解决方案,在用户键入时从 SQL 数据库中动态获取剩余的可能项目。例如,如果前三个字母已被键入,则通常只剩下几百个可能的项目。但是,我不知道如何在用户键入时实现数据库访问(无需重新加载页面,以便执行 PHP 代码)。
我不使用任何内容管理系统;我更喜欢不依赖庞大的第三方库的纯 HTML/PHP/JavaScript/jQuery/CSS 解决方案。感谢您的建议!
解决方案
你需要使用 php jquery 和 ajax
<form autocomplete="off" action="">
<div class="autocomplete" style="width:300px;">
<input id="myInput" type="text" name="myCountry" placeholder="Country">
<div id="myInputautocomplete-list" class="autocomplete-items">
//insert ajax response here
</div>
</div>
<input type="submit">
</form>
//css代码
* { box-sizing: border-box; }
body {
font: 16px Arial;
}
.autocomplete {
/*the container must be positioned relative:*/
position: relative;
display: inline-block;
}
input {
border: 1px solid transparent;
background-color: #f1f1f1;
padding: 10px;
font-size: 16px;
}
input[type=text] {
background-color: #f1f1f1;
width: 100%;
}
input[type=submit] {
background-color: DodgerBlue;
color: #fff;
}
.autocomplete-items {
position: absolute;
border: 1px solid #d4d4d4;
border-bottom: none;
border-top: none;
z-index: 99;
/*position the autocomplete items to be the same width as the container:*/
top: 100%;
left: 0;
right: 0;
}
.autocomplete-items div {
padding: 10px;
cursor: pointer;
background-color: #fff;
border-bottom: 1px solid #d4d4d4;
}
.autocomplete-items div:hover {
/*when hovering an item:*/
background-color: #e9e9e9;
}
.autocomplete-active {
/*when navigating through the items using the arrow keys:*/
background-color: DodgerBlue !important;
color: #ffffff;
}
<script>
window.addEventListener('load',function(){
jQuery(document).ready(function($) {
$("#myInput").keypress(function() {
var inputData = $("#myInput").text('');
if(inputData.length > 2) {
$.ajax({
url : "/ajax.php",
type : "POST",
data : {'myInput': $(this).val()},
dataType: 'json',
success: function (response) {
//after ajax call here you get the data
alert(response.data);
// user below divs to iterated data
/*
<div><strong>D</strong>enmark
<input type="hidden" value="Denmark"></div>
<div><strong>D</strong>jibouti
<input type="hidden" value="Djibouti"></div> */
});
}
});
});
});
</script>
现在在 ajax.php 文件中
$inputData = $_POST[myInput];
// 建立sql连接或包含连接文件
// 连接后写查询获取数据
//假设表名项
$query = "select * from tableName where itemName like $inputData%";
$res = mysql_query($query);
$data = mysql_fetch_data($res);
$result = json_encode("code":200,"data":$data)
return $result;
推荐阅读
- java - Java:将几个可完成的期货组合成一个链
- amazon-web-services - AWS SQS 消息并发处理
- javascript - onSubmit 不想设置状态
- fetch - 如何使用 fetch 从浏览器中的谷歌驱动器下载公开共享文件,而不使用谷歌身份验证
- r - 在R中改变w for循环
- sql - 从 DB2 Warehouse 中的列组织表中获取生成的密钥
- visual-studio - VisualStudio XAML 设计器告诉我我需要构建 19041,但它已经安装
- python-3.x - 将标签放在右侧书脊的左侧
- django - ruby 在 django 中设计加密密码解密
- java - 如何在 HAPI FHIR 中包含完整对象而不是“包含”